Dogfood --report-junit and OpenTelemetry processing in CI - #8965

Merged
Amaury Levé (Evangelink) merged 2 commits into
microsoft:mainfrom
Evangelink:dev/amauryleve/dogfood-junit-otel
Jun 10, 2026
Merged

Dogfood --report-junit and OpenTelemetry processing in CI#8965
Amaury Levé (Evangelink) merged 2 commits into
microsoft:mainfrom
Evangelink:dev/amauryleve/dogfood-junit-otel

Conversation

@Evangelink

Copy link
Copy Markdown
Member

Follow up to the AzDO/TRX dogfooding pattern (#0028908d): now also exercise the newest report extension (JUnitReport, #8850) and the OpenTelemetry processing pipeline end-to-end as part of our own CI test runs.

JUnit Report (--report-junit)

  • test/Directory.Build.targets adds Microsoft.Testing.Extensions.JUnitReport as a ProjectReference for every test project that opts into MTP and wires --report-junit / --report-junit-filename into the MSBuild path.
  • azure-pipelines.yml and eng/pipelines/steps/test-non-windows.yml also pass --report-junit --report-junit-filename "{asm}_{tfm}.xml" on the Release dotnet test --test-modules path (which bypasses MSBuild evaluation).
  • Each test project's Program.cs explicitly calls AddJUnitReportProvider(). TestingPlatformBuilderHook auto-registration only fires for NuGet consumers, not source ProjectReference consumers.

OpenTelemetry processing

  • test/Directory.Build.targets adds Microsoft.Testing.Extensions.OpenTelemetry as a ProjectReference.
  • Each test project's Program.cs registers AddOpenTelemetryProvider with AddTestingPlatformInstrumentation on both the tracer and meter builders.
  • No exporter is wired. The SDK still creates real Activity/Counter instances because the sources/meters now have listeners, so data flows through the full OpenTelemetryResultHandler pipeline and is then dropped at the export stage. That's sufficient to exercise the handler (which has been actively optimised recently, e.g. [efficiency-improver] perf: single-pass PropertyBag walk in OpenTelemetryResultHandler.HandleTestResult #8938) without polluting CI logs. We can wire an actual exporter later if we want to publish the data anywhere.
  • VSTestBridge.UnitTests gates OTel registration on !NATIVE_AOT to match the existing AOT-aware Program.cs pattern there (the OTel SDK uses reflection).

Verification

  • Built all 10 affected test projects locally (Debug).
  • Smoke-ran Microsoft.Testing.Extensions.UnitTests end-to-end with both extensions registered: 431 tests pass and a ~230 KB JUnit XML report is emitted (<testsuites name="Microsoft.Testing.Extensions.UnitTests" tests="431" failures="0" ...>).

CopilotAI review requested due to automatic review settings June 9, 2026 12:58

CopilotAI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

This PR extends the existing CI dogfooding pattern for MTP extensions by enabling JUnit XML reporting (--report-junit) and exercising the OpenTelemetry result handling pipeline during the repo’s own unit test runs.

Changes:

  • Updated multiple test-host Program.cs entrypoints to register AddJUnitReportProvider() and to wire AddOpenTelemetryProvider(...AddTestingPlatformInstrumentation...).
  • Updated test/Directory.Build.targets to add ProjectReferences for Microsoft.Testing.Extensions.JUnitReport and Microsoft.Testing.Extensions.OpenTelemetry, and to inject --report-junit / --report-junit-filename into TestingPlatformCommandLineArguments.
  • Updated Azure Pipelines scripts to pass --report-junit --report-junit-filename "{asm}_{tfm}.xml" when running dotnet test --test-modules (which bypasses MSBuild evaluation).
Show a summary per file
FileDescription
test/UnitTests/TestFramework.UnitTests/Program.csRegisters JUnit report + OpenTelemetry instrumentation in this unit test host.
test/UnitTests/MSTestAdapter.UnitTests/Program.csRegisters JUnit report + OpenTelemetry instrumentation in this unit test host.
test/UnitTests/MSTestAdapter.PlatformServices.UnitTests/Program.csRegisters JUnit report + OpenTelemetry instrumentation in this unit test host.
test/UnitTests/MSTest.SourceGeneration.UnitTests/Program.csRegisters JUnit report + OpenTelemetry instrumentation in this unit test host.
test/UnitTests/MSTest.SelfRealExamples.UnitTests/Program.csRegisters JUnit report + OpenTelemetry instrumentation in this unit test host.
test/UnitTests/MSTest.Analyzers.UnitTests/Program.csRegisters JUnit report + OpenTelemetry instrumentation in this unit test host.
test/UnitTests/Microsoft.Testing.Platform.UnitTests/Program.csRegisters JUnit report + OpenTelemetry instrumentation in this unit test host.
test/UnitTests/Microsoft.Testing.Platform.MSBuild.UnitTests/Program.csRegisters JUnit report + OpenTelemetry instrumentation in this unit test host.
test/UnitTests/Microsoft.Testing.Extensions.VSTestBridge.UnitTests/Program.csRegisters JUnit report and conditionally wires OpenTelemetry when not NATIVE_AOT.
test/UnitTests/Microsoft.Testing.Extensions.UnitTests/Program.csRegisters JUnit report + OpenTelemetry instrumentation in this unit test host.
test/Directory.Build.targetsAdds extension ProjectReferences and injects JUnit CLI options into MTP runs.
eng/pipelines/steps/test-non-windows.ymlAdds JUnit CLI options to the Release --test-modules path.
azure-pipelines.ymlAdds JUnit CLI options to the Release --test-modules path on Windows.
.github/workflows/shared/grade-tests-shared.mdDocumentation update: switch guidance example table to raw HTML for fixed column widths.

Copilot's findings

  • Files reviewed: 14/14 changed files
  • Comments generated: 1

Comment threadtest/Directory.Build.targets
Follow up to the AzDO/TRX dogfooding pattern: now also exercise the newest
report extension (JUnitReport, microsoft#8850) and the OpenTelemetry processing
pipeline end-to-end as part of our own CI test runs.
JUnit:
- test/Directory.Build.targets adds Microsoft.Testing.Extensions.JUnitReport
as a ProjectReference for every test project that opts into MTP and
wires --report-junit / --report-junit-filename into the MSBuild path.
- azure-pipelines.yml and eng/pipelines/steps/test-non-windows.yml also pass
--report-junit --report-junit-filename "{asm}_{tfm}.xml" on the Release
dotnet test --test-modules path (which bypasses MSBuild evaluation).
- Each test project's Program.cs explicitly calls AddJUnitReportProvider()
(TestingPlatformBuilderHook auto-registration only fires for NuGet
consumers, not source ProjectReferences).
OpenTelemetry:
- test/Directory.Build.targets adds Microsoft.Testing.Extensions.OpenTelemetry
as a ProjectReference.
- Each test project's Program.cs registers AddOpenTelemetryProvider with
AddTestingPlatformInstrumentation on both the tracer and meter builders.
No exporter is wired: the SDK still creates real Activities and Counters
because the sources/meters now have listeners, so data flows through the
full OpenTelemetryResultHandler pipeline and is dropped at the export
stage. Sufficient to exercise the handler in CI without polluting logs.
- VSTestBridge.UnitTests gates OTel registration on !NATIVE_AOT to match
its existing AOT-aware Program.cs pattern (the OTel SDK uses reflection).
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
… programs
Copilot reviewer caught (and Linux/Windows Debug CI confirmed): the 5
integration/acceptance test projects under test/IntegrationTests/ also opt
into the Microsoft.Testing.Platform via EnableMSTestRunner /
UseInternalTestFramework, so they pick up the --report-junit /
--report-junit-filename arguments injected from test/Directory.Build.targets,
but they never registered the JUnitReport extension in their explicit
Program.cs files. The Debug runs failed at startup with
`Unknown option 'report-junit'`.
Add AddJUnitReportProvider() alongside the existing AddTrxReportProvider()
call and an AddOpenTelemetryProvider(...) block (mirroring the 10 unit-test
Program.cs files) to:
- PlatformServices.Desktop.IntegrationTests
- MSTest.Acceptance.IntegrationTests
- Microsoft.Testing.Platform.Acceptance.IntegrationTests
- MSTest.IntegrationTests
- MSTest.VstestConsoleWrapper.IntegrationTests
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
@Evangelink
Amaury Levé (Evangelink)force-pushed the dev/amauryleve/dogfood-junit-otel branch from 889d67a to d6edbcaCompareJune 9, 2026 14:32
@Evangelink

Copy link
Copy Markdown
MemberAuthor

Rebased onto latest main to drop the two stale commits from PR #8961 (f53ecc246 + 1bad60019) that were already squash-merged as 2615f8bd7. gh pr diff now lists only the 18 files this PR actually owns .github/workflows/shared/grade-tests-shared.md is gone.

For the Windows Release failure, two things were going on in the previous run:

  1. Failed to create a unique log file after 3 seconds (8 unit-test EXEs log_yyMMddHHmmssfff.diag). FileLogger.CreateFileStream only has millisecond precision and reuses the same DateTimeOffset on retry, so concurrent test hosts under heavy --diagnostic traffic spin on the same filename until the 3s timeout. This is a pre-existing infra bug on main (filed mentally as a follow-up); the extra extension load this PR adds (JUnitReport + OpenTelemetry) likely just pushed startup contention over the edge.
  2. Watchdog_EmitsAfterQuietWindow_WhenStillTracking / Watchdog_EmitsForLateTracking_WhenQuietWindowElapsedWithNoWork (ShutdownProgressReporterTests) timing-sensitive assertions Expected value to be greater than or equal to the lower bound; took 7.9s and 15.8s respectively, consistent with the agent being oversubscribed from Initial commit! 🎉 #1 above.

Re-running CI on the rebased commit will follow up if either reproduces.

@Evangelink
Amaury Levé (Evangelink) merged commit 662eede into microsoft:mainJun 10, 2026
35 of 37 checks passed
@Evangelink
Amaury Levé (Evangelink) deleted the dev/amauryleve/dogfood-junit-otel branch June 10, 2026 09:22
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants

@Evangelink@YuliiaKovalova
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Add copy buttons to all
 blocks\n(function() {\n function addCopyButtons() {\n document.querySelectorAll('pre code').forEach(function(codeBlock) {\n if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;\n codeBlock.parentElement.setAttribute('data-copy-added', 'true');\n \n var btn = document.createElement('button');\n btn.textContent = 'Copy';\n btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';\n btn.onmouseover = function() { this.style.opacity = '1'; };\n btn.onmouseout = function() { this.style.opacity = '0.7'; };\n btn.onclick = function() {\n navigator.clipboard.writeText(codeBlock.textContent).then(function() {\n btn.textContent = 'Copied!';\n setTimeout(function() { btn.textContent = 'Copy'; }, 1500);\n });\n };\n codeBlock.parentElement.style.position = 'relative';\n codeBlock.parentElement.appendChild(btn);\n });\n }\n \n addCopyButtons();\n \n // Re-run on dynamic content\n var observer = new MutationObserver(addCopyButtons);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Add Copy Buttons to Code Blocks");
}
} catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
})();
(function(){
try {
var __m = "github.com";
var __re = new RegExp('^' + "github\\.com" + '
Skip to content

Dogfood --report-junit and OpenTelemetry processing in CI - #8965

Merged
Amaury Levé (Evangelink) merged 2 commits into
microsoft:mainfrom
Evangelink:dev/amauryleve/dogfood-junit-otel
Jun 10, 2026
Merged

Dogfood --report-junit and OpenTelemetry processing in CI#8965
Amaury Levé (Evangelink) merged 2 commits into
microsoft:mainfrom
Evangelink:dev/amauryleve/dogfood-junit-otel

Conversation

@Evangelink

Copy link
Copy Markdown
Member

Follow up to the AzDO/TRX dogfooding pattern (#0028908d): now also exercise the newest report extension (JUnitReport, #8850) and the OpenTelemetry processing pipeline end-to-end as part of our own CI test runs.

JUnit Report (--report-junit)

  • test/Directory.Build.targets adds Microsoft.Testing.Extensions.JUnitReport as a ProjectReference for every test project that opts into MTP and wires --report-junit / --report-junit-filename into the MSBuild path.
  • azure-pipelines.yml and eng/pipelines/steps/test-non-windows.yml also pass --report-junit --report-junit-filename "{asm}_{tfm}.xml" on the Release dotnet test --test-modules path (which bypasses MSBuild evaluation).
  • Each test project's Program.cs explicitly calls AddJUnitReportProvider(). TestingPlatformBuilderHook auto-registration only fires for NuGet consumers, not source ProjectReference consumers.

OpenTelemetry processing

  • test/Directory.Build.targets adds Microsoft.Testing.Extensions.OpenTelemetry as a ProjectReference.
  • Each test project's Program.cs registers AddOpenTelemetryProvider with AddTestingPlatformInstrumentation on both the tracer and meter builders.
  • No exporter is wired. The SDK still creates real Activity/Counter instances because the sources/meters now have listeners, so data flows through the full OpenTelemetryResultHandler pipeline and is then dropped at the export stage. That's sufficient to exercise the handler (which has been actively optimised recently, e.g. [efficiency-improver] perf: single-pass PropertyBag walk in OpenTelemetryResultHandler.HandleTestResult #8938) without polluting CI logs. We can wire an actual exporter later if we want to publish the data anywhere.
  • VSTestBridge.UnitTests gates OTel registration on !NATIVE_AOT to match the existing AOT-aware Program.cs pattern there (the OTel SDK uses reflection).

Verification

  • Built all 10 affected test projects locally (Debug).
  • Smoke-ran Microsoft.Testing.Extensions.UnitTests end-to-end with both extensions registered: 431 tests pass and a ~230 KB JUnit XML report is emitted (<testsuites name="Microsoft.Testing.Extensions.UnitTests" tests="431" failures="0" ...>).

CopilotAI review requested due to automatic review settings June 9, 2026 12:58

CopilotAI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

This PR extends the existing CI dogfooding pattern for MTP extensions by enabling JUnit XML reporting (--report-junit) and exercising the OpenTelemetry result handling pipeline during the repo’s own unit test runs.

Changes:

  • Updated multiple test-host Program.cs entrypoints to register AddJUnitReportProvider() and to wire AddOpenTelemetryProvider(...AddTestingPlatformInstrumentation...).
  • Updated test/Directory.Build.targets to add ProjectReferences for Microsoft.Testing.Extensions.JUnitReport and Microsoft.Testing.Extensions.OpenTelemetry, and to inject --report-junit / --report-junit-filename into TestingPlatformCommandLineArguments.
  • Updated Azure Pipelines scripts to pass --report-junit --report-junit-filename "{asm}_{tfm}.xml" when running dotnet test --test-modules (which bypasses MSBuild evaluation).
Show a summary per file
FileDescription
test/UnitTests/TestFramework.UnitTests/Program.csRegisters JUnit report + OpenTelemetry instrumentation in this unit test host.
test/UnitTests/MSTestAdapter.UnitTests/Program.csRegisters JUnit report + OpenTelemetry instrumentation in this unit test host.
test/UnitTests/MSTestAdapter.PlatformServices.UnitTests/Program.csRegisters JUnit report + OpenTelemetry instrumentation in this unit test host.
test/UnitTests/MSTest.SourceGeneration.UnitTests/Program.csRegisters JUnit report + OpenTelemetry instrumentation in this unit test host.
test/UnitTests/MSTest.SelfRealExamples.UnitTests/Program.csRegisters JUnit report + OpenTelemetry instrumentation in this unit test host.
test/UnitTests/MSTest.Analyzers.UnitTests/Program.csRegisters JUnit report + OpenTelemetry instrumentation in this unit test host.
test/UnitTests/Microsoft.Testing.Platform.UnitTests/Program.csRegisters JUnit report + OpenTelemetry instrumentation in this unit test host.
test/UnitTests/Microsoft.Testing.Platform.MSBuild.UnitTests/Program.csRegisters JUnit report + OpenTelemetry instrumentation in this unit test host.
test/UnitTests/Microsoft.Testing.Extensions.VSTestBridge.UnitTests/Program.csRegisters JUnit report and conditionally wires OpenTelemetry when not NATIVE_AOT.
test/UnitTests/Microsoft.Testing.Extensions.UnitTests/Program.csRegisters JUnit report + OpenTelemetry instrumentation in this unit test host.
test/Directory.Build.targetsAdds extension ProjectReferences and injects JUnit CLI options into MTP runs.
eng/pipelines/steps/test-non-windows.ymlAdds JUnit CLI options to the Release --test-modules path.
azure-pipelines.ymlAdds JUnit CLI options to the Release --test-modules path on Windows.
.github/workflows/shared/grade-tests-shared.mdDocumentation update: switch guidance example table to raw HTML for fixed column widths.

Copilot's findings

  • Files reviewed: 14/14 changed files
  • Comments generated: 1

Comment threadtest/Directory.Build.targets
Follow up to the AzDO/TRX dogfooding pattern: now also exercise the newest
report extension (JUnitReport, microsoft#8850) and the OpenTelemetry processing
pipeline end-to-end as part of our own CI test runs.
JUnit:
- test/Directory.Build.targets adds Microsoft.Testing.Extensions.JUnitReport
as a ProjectReference for every test project that opts into MTP and
wires --report-junit / --report-junit-filename into the MSBuild path.
- azure-pipelines.yml and eng/pipelines/steps/test-non-windows.yml also pass
--report-junit --report-junit-filename "{asm}_{tfm}.xml" on the Release
dotnet test --test-modules path (which bypasses MSBuild evaluation).
- Each test project's Program.cs explicitly calls AddJUnitReportProvider()
(TestingPlatformBuilderHook auto-registration only fires for NuGet
consumers, not source ProjectReferences).
OpenTelemetry:
- test/Directory.Build.targets adds Microsoft.Testing.Extensions.OpenTelemetry
as a ProjectReference.
- Each test project's Program.cs registers AddOpenTelemetryProvider with
AddTestingPlatformInstrumentation on both the tracer and meter builders.
No exporter is wired: the SDK still creates real Activities and Counters
because the sources/meters now have listeners, so data flows through the
full OpenTelemetryResultHandler pipeline and is dropped at the export
stage. Sufficient to exercise the handler in CI without polluting logs.
- VSTestBridge.UnitTests gates OTel registration on !NATIVE_AOT to match
its existing AOT-aware Program.cs pattern (the OTel SDK uses reflection).
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
… programs
Copilot reviewer caught (and Linux/Windows Debug CI confirmed): the 5
integration/acceptance test projects under test/IntegrationTests/ also opt
into the Microsoft.Testing.Platform via EnableMSTestRunner /
UseInternalTestFramework, so they pick up the --report-junit /
--report-junit-filename arguments injected from test/Directory.Build.targets,
but they never registered the JUnitReport extension in their explicit
Program.cs files. The Debug runs failed at startup with
`Unknown option 'report-junit'`.
Add AddJUnitReportProvider() alongside the existing AddTrxReportProvider()
call and an AddOpenTelemetryProvider(...) block (mirroring the 10 unit-test
Program.cs files) to:
- PlatformServices.Desktop.IntegrationTests
- MSTest.Acceptance.IntegrationTests
- Microsoft.Testing.Platform.Acceptance.IntegrationTests
- MSTest.IntegrationTests
- MSTest.VstestConsoleWrapper.IntegrationTests
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
@Evangelink
Amaury Levé (Evangelink)force-pushed the dev/amauryleve/dogfood-junit-otel branch from 889d67a to d6edbcaCompareJune 9, 2026 14:32
@Evangelink

Copy link
Copy Markdown
MemberAuthor

Rebased onto latest main to drop the two stale commits from PR #8961 (f53ecc246 + 1bad60019) that were already squash-merged as 2615f8bd7. gh pr diff now lists only the 18 files this PR actually owns .github/workflows/shared/grade-tests-shared.md is gone.

For the Windows Release failure, two things were going on in the previous run:

  1. Failed to create a unique log file after 3 seconds (8 unit-test EXEs log_yyMMddHHmmssfff.diag). FileLogger.CreateFileStream only has millisecond precision and reuses the same DateTimeOffset on retry, so concurrent test hosts under heavy --diagnostic traffic spin on the same filename until the 3s timeout. This is a pre-existing infra bug on main (filed mentally as a follow-up); the extra extension load this PR adds (JUnitReport + OpenTelemetry) likely just pushed startup contention over the edge.
  2. Watchdog_EmitsAfterQuietWindow_WhenStillTracking / Watchdog_EmitsForLateTracking_WhenQuietWindowElapsedWithNoWork (ShutdownProgressReporterTests) timing-sensitive assertions Expected value to be greater than or equal to the lower bound; took 7.9s and 15.8s respectively, consistent with the agent being oversubscribed from Initial commit! 🎉 #1 above.

Re-running CI on the rebased commit will follow up if either reproduces.

@Evangelink
Amaury Levé (Evangelink) merged commit 662eede into microsoft:mainJun 10, 2026
35 of 37 checks passed
@Evangelink
Amaury Levé (Evangelink) deleted the dev/amauryleve/dogfood-junit-otel branch June 10, 2026 09:22
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants

@Evangelink@YuliiaKovalova
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Force GitHub README to respect dark mode\n(function() {\n var style = document.createElement('style');\n style.textContent = '\n .markdown-body {\n color-scheme: dark light;\n }\n .markdown-body pre { background: #161b22 !important; }\n .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; }\n .markdown-body table th, .markdown-body table td { border-color: #30363d !important; }\n .markdown-body img { background: #0d1117; }\n .markdown-body blockquote { border-left-color: #8b949e; }\n .markdown-body hr { border-color: #30363d; }\n ';\n document.head.appendChild(style);\n})();", "GitHub Dark Mode README Fix"); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Dogfood --report-junit and OpenTelemetry processing in CI - #8965

Merged
Amaury Levé (Evangelink) merged 2 commits into
microsoft:mainfrom
Evangelink:dev/amauryleve/dogfood-junit-otel
Jun 10, 2026
Merged

Dogfood --report-junit and OpenTelemetry processing in CI#8965
Amaury Levé (Evangelink) merged 2 commits into
microsoft:mainfrom
Evangelink:dev/amauryleve/dogfood-junit-otel

Conversation

@Evangelink

Copy link
Copy Markdown
Member

Follow up to the AzDO/TRX dogfooding pattern (#0028908d): now also exercise the newest report extension (JUnitReport, #8850) and the OpenTelemetry processing pipeline end-to-end as part of our own CI test runs.

JUnit Report (--report-junit)

  • test/Directory.Build.targets adds Microsoft.Testing.Extensions.JUnitReport as a ProjectReference for every test project that opts into MTP and wires --report-junit / --report-junit-filename into the MSBuild path.
  • azure-pipelines.yml and eng/pipelines/steps/test-non-windows.yml also pass --report-junit --report-junit-filename "{asm}_{tfm}.xml" on the Release dotnet test --test-modules path (which bypasses MSBuild evaluation).
  • Each test project's Program.cs explicitly calls AddJUnitReportProvider(). TestingPlatformBuilderHook auto-registration only fires for NuGet consumers, not source ProjectReference consumers.

OpenTelemetry processing

  • test/Directory.Build.targets adds Microsoft.Testing.Extensions.OpenTelemetry as a ProjectReference.
  • Each test project's Program.cs registers AddOpenTelemetryProvider with AddTestingPlatformInstrumentation on both the tracer and meter builders.
  • No exporter is wired. The SDK still creates real Activity/Counter instances because the sources/meters now have listeners, so data flows through the full OpenTelemetryResultHandler pipeline and is then dropped at the export stage. That's sufficient to exercise the handler (which has been actively optimised recently, e.g. [efficiency-improver] perf: single-pass PropertyBag walk in OpenTelemetryResultHandler.HandleTestResult #8938) without polluting CI logs. We can wire an actual exporter later if we want to publish the data anywhere.
  • VSTestBridge.UnitTests gates OTel registration on !NATIVE_AOT to match the existing AOT-aware Program.cs pattern there (the OTel SDK uses reflection).

Verification

  • Built all 10 affected test projects locally (Debug).
  • Smoke-ran Microsoft.Testing.Extensions.UnitTests end-to-end with both extensions registered: 431 tests pass and a ~230 KB JUnit XML report is emitted (<testsuites name="Microsoft.Testing.Extensions.UnitTests" tests="431" failures="0" ...>).

CopilotAI review requested due to automatic review settings June 9, 2026 12:58

CopilotAI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

This PR extends the existing CI dogfooding pattern for MTP extensions by enabling JUnit XML reporting (--report-junit) and exercising the OpenTelemetry result handling pipeline during the repo’s own unit test runs.

Changes:

  • Updated multiple test-host Program.cs entrypoints to register AddJUnitReportProvider() and to wire AddOpenTelemetryProvider(...AddTestingPlatformInstrumentation...).
  • Updated test/Directory.Build.targets to add ProjectReferences for Microsoft.Testing.Extensions.JUnitReport and Microsoft.Testing.Extensions.OpenTelemetry, and to inject --report-junit / --report-junit-filename into TestingPlatformCommandLineArguments.
  • Updated Azure Pipelines scripts to pass --report-junit --report-junit-filename "{asm}_{tfm}.xml" when running dotnet test --test-modules (which bypasses MSBuild evaluation).
Show a summary per file
FileDescription
test/UnitTests/TestFramework.UnitTests/Program.csRegisters JUnit report + OpenTelemetry instrumentation in this unit test host.
test/UnitTests/MSTestAdapter.UnitTests/Program.csRegisters JUnit report + OpenTelemetry instrumentation in this unit test host.
test/UnitTests/MSTestAdapter.PlatformServices.UnitTests/Program.csRegisters JUnit report + OpenTelemetry instrumentation in this unit test host.
test/UnitTests/MSTest.SourceGeneration.UnitTests/Program.csRegisters JUnit report + OpenTelemetry instrumentation in this unit test host.
test/UnitTests/MSTest.SelfRealExamples.UnitTests/Program.csRegisters JUnit report + OpenTelemetry instrumentation in this unit test host.
test/UnitTests/MSTest.Analyzers.UnitTests/Program.csRegisters JUnit report + OpenTelemetry instrumentation in this unit test host.
test/UnitTests/Microsoft.Testing.Platform.UnitTests/Program.csRegisters JUnit report + OpenTelemetry instrumentation in this unit test host.
test/UnitTests/Microsoft.Testing.Platform.MSBuild.UnitTests/Program.csRegisters JUnit report + OpenTelemetry instrumentation in this unit test host.
test/UnitTests/Microsoft.Testing.Extensions.VSTestBridge.UnitTests/Program.csRegisters JUnit report and conditionally wires OpenTelemetry when not NATIVE_AOT.
test/UnitTests/Microsoft.Testing.Extensions.UnitTests/Program.csRegisters JUnit report + OpenTelemetry instrumentation in this unit test host.
test/Directory.Build.targetsAdds extension ProjectReferences and injects JUnit CLI options into MTP runs.
eng/pipelines/steps/test-non-windows.ymlAdds JUnit CLI options to the Release --test-modules path.
azure-pipelines.ymlAdds JUnit CLI options to the Release --test-modules path on Windows.
.github/workflows/shared/grade-tests-shared.mdDocumentation update: switch guidance example table to raw HTML for fixed column widths.

Copilot's findings

  • Files reviewed: 14/14 changed files
  • Comments generated: 1

Comment threadtest/Directory.Build.targets
Follow up to the AzDO/TRX dogfooding pattern: now also exercise the newest
report extension (JUnitReport, microsoft#8850) and the OpenTelemetry processing
pipeline end-to-end as part of our own CI test runs.
JUnit:
- test/Directory.Build.targets adds Microsoft.Testing.Extensions.JUnitReport
as a ProjectReference for every test project that opts into MTP and
wires --report-junit / --report-junit-filename into the MSBuild path.
- azure-pipelines.yml and eng/pipelines/steps/test-non-windows.yml also pass
--report-junit --report-junit-filename "{asm}_{tfm}.xml" on the Release
dotnet test --test-modules path (which bypasses MSBuild evaluation).
- Each test project's Program.cs explicitly calls AddJUnitReportProvider()
(TestingPlatformBuilderHook auto-registration only fires for NuGet
consumers, not source ProjectReferences).
OpenTelemetry:
- test/Directory.Build.targets adds Microsoft.Testing.Extensions.OpenTelemetry
as a ProjectReference.
- Each test project's Program.cs registers AddOpenTelemetryProvider with
AddTestingPlatformInstrumentation on both the tracer and meter builders.
No exporter is wired: the SDK still creates real Activities and Counters
because the sources/meters now have listeners, so data flows through the
full OpenTelemetryResultHandler pipeline and is dropped at the export
stage. Sufficient to exercise the handler in CI without polluting logs.
- VSTestBridge.UnitTests gates OTel registration on !NATIVE_AOT to match
its existing AOT-aware Program.cs pattern (the OTel SDK uses reflection).
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
… programs
Copilot reviewer caught (and Linux/Windows Debug CI confirmed): the 5
integration/acceptance test projects under test/IntegrationTests/ also opt
into the Microsoft.Testing.Platform via EnableMSTestRunner /
UseInternalTestFramework, so they pick up the --report-junit /
--report-junit-filename arguments injected from test/Directory.Build.targets,
but they never registered the JUnitReport extension in their explicit
Program.cs files. The Debug runs failed at startup with
`Unknown option 'report-junit'`.
Add AddJUnitReportProvider() alongside the existing AddTrxReportProvider()
call and an AddOpenTelemetryProvider(...) block (mirroring the 10 unit-test
Program.cs files) to:
- PlatformServices.Desktop.IntegrationTests
- MSTest.Acceptance.IntegrationTests
- Microsoft.Testing.Platform.Acceptance.IntegrationTests
- MSTest.IntegrationTests
- MSTest.VstestConsoleWrapper.IntegrationTests
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
@Evangelink
Amaury Levé (Evangelink)force-pushed the dev/amauryleve/dogfood-junit-otel branch from 889d67a to d6edbcaCompareJune 9, 2026 14:32
@Evangelink

Copy link
Copy Markdown
MemberAuthor

Rebased onto latest main to drop the two stale commits from PR #8961 (f53ecc246 + 1bad60019) that were already squash-merged as 2615f8bd7. gh pr diff now lists only the 18 files this PR actually owns .github/workflows/shared/grade-tests-shared.md is gone.

For the Windows Release failure, two things were going on in the previous run:

  1. Failed to create a unique log file after 3 seconds (8 unit-test EXEs log_yyMMddHHmmssfff.diag). FileLogger.CreateFileStream only has millisecond precision and reuses the same DateTimeOffset on retry, so concurrent test hosts under heavy --diagnostic traffic spin on the same filename until the 3s timeout. This is a pre-existing infra bug on main (filed mentally as a follow-up); the extra extension load this PR adds (JUnitReport + OpenTelemetry) likely just pushed startup contention over the edge.
  2. Watchdog_EmitsAfterQuietWindow_WhenStillTracking / Watchdog_EmitsForLateTracking_WhenQuietWindowElapsedWithNoWork (ShutdownProgressReporterTests) timing-sensitive assertions Expected value to be greater than or equal to the lower bound; took 7.9s and 15.8s respectively, consistent with the agent being oversubscribed from Initial commit! 🎉 #1 above.

Re-running CI on the rebased commit will follow up if either reproduces.

@Evangelink
Amaury Levé (Evangelink) merged commit 662eede into microsoft:mainJun 10, 2026
35 of 37 checks passed
@Evangelink
Amaury Levé (Evangelink) deleted the dev/amauryleve/dogfood-junit-otel branch June 10, 2026 09:22
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants

@Evangelink@YuliiaKovalova
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Highlight search terms from Google/DuckDuckGo/Bing referrer\n(function() {\n var ref = document.referrer;\n var terms = [];\n \n if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) {\n var url = new URL(ref);\n var q = url.searchParams.get('q') || url.searchParams.get('p');\n if (q) {\n terms = q.split(/\\s+/).filter(function(t) { return t.length > 2; });\n }\n }\n \n if (terms.length === 0) return;\n \n var style = document.createElement('style');\n style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }';\n document.head.appendChild(style);\n \n function highlight(node) {\n if (node.nodeType === 3) { // text node\n var text = node.textContent;\n var found = false;\n terms.forEach(function(term) {\n var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\') + ')', 'gi');\n if (regex.test(text)) {\n found = true;\n var frag = document.createDocumentFragment();\n var parts = text.split(regex);\n parts.forEach(function(part, i) {\n if (i % 2 === 0) {\n frag.appendChild(document.createTextNode(part));\n } else {\n var span = document.createElement('span');\n span.className = 'userscript-highlight';\n span.textContent = part;\n frag.appendChild(span);\n }\n });\n node.parentNode.replaceChild(frag, node);\n }\n });\n } else if (node.nodeType === 1 && node.childNodes) { // element\n var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT'];\n if (!skipTags.includes(node.tagName)) {\n Array.from(node.childNodes).forEach(highlight);\n }\n }\n }\n \n highlight(document.body);\n \n // Re-highlight on dynamic content\n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1 || node.nodeType === 3) highlight(node);\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Highlight Search Terms"); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Dogfood --report-junit and OpenTelemetry processing in CI - #8965

Merged
Amaury Levé (Evangelink) merged 2 commits into
microsoft:mainfrom
Evangelink:dev/amauryleve/dogfood-junit-otel
Jun 10, 2026
Merged

Dogfood --report-junit and OpenTelemetry processing in CI#8965
Amaury Levé (Evangelink) merged 2 commits into
microsoft:mainfrom
Evangelink:dev/amauryleve/dogfood-junit-otel

Conversation

@Evangelink

Copy link
Copy Markdown
Member

Follow up to the AzDO/TRX dogfooding pattern (#0028908d): now also exercise the newest report extension (JUnitReport, #8850) and the OpenTelemetry processing pipeline end-to-end as part of our own CI test runs.

JUnit Report (--report-junit)

  • test/Directory.Build.targets adds Microsoft.Testing.Extensions.JUnitReport as a ProjectReference for every test project that opts into MTP and wires --report-junit / --report-junit-filename into the MSBuild path.
  • azure-pipelines.yml and eng/pipelines/steps/test-non-windows.yml also pass --report-junit --report-junit-filename "{asm}_{tfm}.xml" on the Release dotnet test --test-modules path (which bypasses MSBuild evaluation).
  • Each test project's Program.cs explicitly calls AddJUnitReportProvider(). TestingPlatformBuilderHook auto-registration only fires for NuGet consumers, not source ProjectReference consumers.

OpenTelemetry processing

  • test/Directory.Build.targets adds Microsoft.Testing.Extensions.OpenTelemetry as a ProjectReference.
  • Each test project's Program.cs registers AddOpenTelemetryProvider with AddTestingPlatformInstrumentation on both the tracer and meter builders.
  • No exporter is wired. The SDK still creates real Activity/Counter instances because the sources/meters now have listeners, so data flows through the full OpenTelemetryResultHandler pipeline and is then dropped at the export stage. That's sufficient to exercise the handler (which has been actively optimised recently, e.g. [efficiency-improver] perf: single-pass PropertyBag walk in OpenTelemetryResultHandler.HandleTestResult #8938) without polluting CI logs. We can wire an actual exporter later if we want to publish the data anywhere.
  • VSTestBridge.UnitTests gates OTel registration on !NATIVE_AOT to match the existing AOT-aware Program.cs pattern there (the OTel SDK uses reflection).

Verification

  • Built all 10 affected test projects locally (Debug).
  • Smoke-ran Microsoft.Testing.Extensions.UnitTests end-to-end with both extensions registered: 431 tests pass and a ~230 KB JUnit XML report is emitted (<testsuites name="Microsoft.Testing.Extensions.UnitTests" tests="431" failures="0" ...>).

CopilotAI review requested due to automatic review settings June 9, 2026 12:58

CopilotAI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

This PR extends the existing CI dogfooding pattern for MTP extensions by enabling JUnit XML reporting (--report-junit) and exercising the OpenTelemetry result handling pipeline during the repo’s own unit test runs.

Changes:

  • Updated multiple test-host Program.cs entrypoints to register AddJUnitReportProvider() and to wire AddOpenTelemetryProvider(...AddTestingPlatformInstrumentation...).
  • Updated test/Directory.Build.targets to add ProjectReferences for Microsoft.Testing.Extensions.JUnitReport and Microsoft.Testing.Extensions.OpenTelemetry, and to inject --report-junit / --report-junit-filename into TestingPlatformCommandLineArguments.
  • Updated Azure Pipelines scripts to pass --report-junit --report-junit-filename "{asm}_{tfm}.xml" when running dotnet test --test-modules (which bypasses MSBuild evaluation).
Show a summary per file
FileDescription
test/UnitTests/TestFramework.UnitTests/Program.csRegisters JUnit report + OpenTelemetry instrumentation in this unit test host.
test/UnitTests/MSTestAdapter.UnitTests/Program.csRegisters JUnit report + OpenTelemetry instrumentation in this unit test host.
test/UnitTests/MSTestAdapter.PlatformServices.UnitTests/Program.csRegisters JUnit report + OpenTelemetry instrumentation in this unit test host.
test/UnitTests/MSTest.SourceGeneration.UnitTests/Program.csRegisters JUnit report + OpenTelemetry instrumentation in this unit test host.
test/UnitTests/MSTest.SelfRealExamples.UnitTests/Program.csRegisters JUnit report + OpenTelemetry instrumentation in this unit test host.
test/UnitTests/MSTest.Analyzers.UnitTests/Program.csRegisters JUnit report + OpenTelemetry instrumentation in this unit test host.
test/UnitTests/Microsoft.Testing.Platform.UnitTests/Program.csRegisters JUnit report + OpenTelemetry instrumentation in this unit test host.
test/UnitTests/Microsoft.Testing.Platform.MSBuild.UnitTests/Program.csRegisters JUnit report + OpenTelemetry instrumentation in this unit test host.
test/UnitTests/Microsoft.Testing.Extensions.VSTestBridge.UnitTests/Program.csRegisters JUnit report and conditionally wires OpenTelemetry when not NATIVE_AOT.
test/UnitTests/Microsoft.Testing.Extensions.UnitTests/Program.csRegisters JUnit report + OpenTelemetry instrumentation in this unit test host.
test/Directory.Build.targetsAdds extension ProjectReferences and injects JUnit CLI options into MTP runs.
eng/pipelines/steps/test-non-windows.ymlAdds JUnit CLI options to the Release --test-modules path.
azure-pipelines.ymlAdds JUnit CLI options to the Release --test-modules path on Windows.
.github/workflows/shared/grade-tests-shared.mdDocumentation update: switch guidance example table to raw HTML for fixed column widths.

Copilot's findings

  • Files reviewed: 14/14 changed files
  • Comments generated: 1

Comment threadtest/Directory.Build.targets
Follow up to the AzDO/TRX dogfooding pattern: now also exercise the newest
report extension (JUnitReport, microsoft#8850) and the OpenTelemetry processing
pipeline end-to-end as part of our own CI test runs.
JUnit:
- test/Directory.Build.targets adds Microsoft.Testing.Extensions.JUnitReport
as a ProjectReference for every test project that opts into MTP and
wires --report-junit / --report-junit-filename into the MSBuild path.
- azure-pipelines.yml and eng/pipelines/steps/test-non-windows.yml also pass
--report-junit --report-junit-filename "{asm}_{tfm}.xml" on the Release
dotnet test --test-modules path (which bypasses MSBuild evaluation).
- Each test project's Program.cs explicitly calls AddJUnitReportProvider()
(TestingPlatformBuilderHook auto-registration only fires for NuGet
consumers, not source ProjectReferences).
OpenTelemetry:
- test/Directory.Build.targets adds Microsoft.Testing.Extensions.OpenTelemetry
as a ProjectReference.
- Each test project's Program.cs registers AddOpenTelemetryProvider with
AddTestingPlatformInstrumentation on both the tracer and meter builders.
No exporter is wired: the SDK still creates real Activities and Counters
because the sources/meters now have listeners, so data flows through the
full OpenTelemetryResultHandler pipeline and is dropped at the export
stage. Sufficient to exercise the handler in CI without polluting logs.
- VSTestBridge.UnitTests gates OTel registration on !NATIVE_AOT to match
its existing AOT-aware Program.cs pattern (the OTel SDK uses reflection).
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
… programs
Copilot reviewer caught (and Linux/Windows Debug CI confirmed): the 5
integration/acceptance test projects under test/IntegrationTests/ also opt
into the Microsoft.Testing.Platform via EnableMSTestRunner /
UseInternalTestFramework, so they pick up the --report-junit /
--report-junit-filename arguments injected from test/Directory.Build.targets,
but they never registered the JUnitReport extension in their explicit
Program.cs files. The Debug runs failed at startup with
`Unknown option 'report-junit'`.
Add AddJUnitReportProvider() alongside the existing AddTrxReportProvider()
call and an AddOpenTelemetryProvider(...) block (mirroring the 10 unit-test
Program.cs files) to:
- PlatformServices.Desktop.IntegrationTests
- MSTest.Acceptance.IntegrationTests
- Microsoft.Testing.Platform.Acceptance.IntegrationTests
- MSTest.IntegrationTests
- MSTest.VstestConsoleWrapper.IntegrationTests
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
@Evangelink
Amaury Levé (Evangelink)force-pushed the dev/amauryleve/dogfood-junit-otel branch from 889d67a to d6edbcaCompareJune 9, 2026 14:32
@Evangelink

Copy link
Copy Markdown
MemberAuthor

Rebased onto latest main to drop the two stale commits from PR #8961 (f53ecc246 + 1bad60019) that were already squash-merged as 2615f8bd7. gh pr diff now lists only the 18 files this PR actually owns .github/workflows/shared/grade-tests-shared.md is gone.

For the Windows Release failure, two things were going on in the previous run:

  1. Failed to create a unique log file after 3 seconds (8 unit-test EXEs log_yyMMddHHmmssfff.diag). FileLogger.CreateFileStream only has millisecond precision and reuses the same DateTimeOffset on retry, so concurrent test hosts under heavy --diagnostic traffic spin on the same filename until the 3s timeout. This is a pre-existing infra bug on main (filed mentally as a follow-up); the extra extension load this PR adds (JUnitReport + OpenTelemetry) likely just pushed startup contention over the edge.
  2. Watchdog_EmitsAfterQuietWindow_WhenStillTracking / Watchdog_EmitsForLateTracking_WhenQuietWindowElapsedWithNoWork (ShutdownProgressReporterTests) timing-sensitive assertions Expected value to be greater than or equal to the lower bound; took 7.9s and 15.8s respectively, consistent with the agent being oversubscribed from Initial commit! 🎉 #1 above.

Re-running CI on the rebased commit will follow up if either reproduces.

@Evangelink
Amaury Levé (Evangelink) merged commit 662eede into microsoft:mainJun 10, 2026
35 of 37 checks passed
@Evangelink
Amaury Levé (Evangelink) deleted the dev/amauryleve/dogfood-junit-otel branch June 10, 2026 09:22
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants

@Evangelink@YuliiaKovalova
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Strip utm_, fbclid, gclid, etc. from all links on page\n(function() {\n var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content',\n 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid',\n 'ref', 'ref_src', 'source', 'medium', 'campaign'];\n \n function cleanUrl(url) {\n try {\n var u = new URL(url, window.location.origin);\n var changed = false;\n trackingParams.forEach(function(p) {\n if (u.searchParams.has(p)) {\n u.searchParams.delete(p);\n changed = true;\n }\n });\n return changed ? u.toString() : url;\n } catch (e) {\n return url;\n }\n }\n \n function cleanLinks() {\n document.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n \n cleanLinks();\n \n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1) {\n if (node.tagName === 'A') cleanLinks();\n node.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Remove Tracking Parameters from Links"); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + '
Skip to content

Dogfood --report-junit and OpenTelemetry processing in CI - #8965

Merged
Amaury Levé (Evangelink) merged 2 commits into
microsoft:mainfrom
Evangelink:dev/amauryleve/dogfood-junit-otel
Jun 10, 2026
Merged

Dogfood --report-junit and OpenTelemetry processing in CI#8965
Amaury Levé (Evangelink) merged 2 commits into
microsoft:mainfrom
Evangelink:dev/amauryleve/dogfood-junit-otel

Conversation

@Evangelink

Copy link
Copy Markdown
Member

Follow up to the AzDO/TRX dogfooding pattern (#0028908d): now also exercise the newest report extension (JUnitReport, #8850) and the OpenTelemetry processing pipeline end-to-end as part of our own CI test runs.

JUnit Report (--report-junit)

  • test/Directory.Build.targets adds Microsoft.Testing.Extensions.JUnitReport as a ProjectReference for every test project that opts into MTP and wires --report-junit / --report-junit-filename into the MSBuild path.
  • azure-pipelines.yml and eng/pipelines/steps/test-non-windows.yml also pass --report-junit --report-junit-filename "{asm}_{tfm}.xml" on the Release dotnet test --test-modules path (which bypasses MSBuild evaluation).
  • Each test project's Program.cs explicitly calls AddJUnitReportProvider(). TestingPlatformBuilderHook auto-registration only fires for NuGet consumers, not source ProjectReference consumers.

OpenTelemetry processing

  • test/Directory.Build.targets adds Microsoft.Testing.Extensions.OpenTelemetry as a ProjectReference.
  • Each test project's Program.cs registers AddOpenTelemetryProvider with AddTestingPlatformInstrumentation on both the tracer and meter builders.
  • No exporter is wired. The SDK still creates real Activity/Counter instances because the sources/meters now have listeners, so data flows through the full OpenTelemetryResultHandler pipeline and is then dropped at the export stage. That's sufficient to exercise the handler (which has been actively optimised recently, e.g. [efficiency-improver] perf: single-pass PropertyBag walk in OpenTelemetryResultHandler.HandleTestResult #8938) without polluting CI logs. We can wire an actual exporter later if we want to publish the data anywhere.
  • VSTestBridge.UnitTests gates OTel registration on !NATIVE_AOT to match the existing AOT-aware Program.cs pattern there (the OTel SDK uses reflection).

Verification

  • Built all 10 affected test projects locally (Debug).
  • Smoke-ran Microsoft.Testing.Extensions.UnitTests end-to-end with both extensions registered: 431 tests pass and a ~230 KB JUnit XML report is emitted (<testsuites name="Microsoft.Testing.Extensions.UnitTests" tests="431" failures="0" ...>).

CopilotAI review requested due to automatic review settings June 9, 2026 12:58

CopilotAI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

This PR extends the existing CI dogfooding pattern for MTP extensions by enabling JUnit XML reporting (--report-junit) and exercising the OpenTelemetry result handling pipeline during the repo’s own unit test runs.

Changes:

  • Updated multiple test-host Program.cs entrypoints to register AddJUnitReportProvider() and to wire AddOpenTelemetryProvider(...AddTestingPlatformInstrumentation...).
  • Updated test/Directory.Build.targets to add ProjectReferences for Microsoft.Testing.Extensions.JUnitReport and Microsoft.Testing.Extensions.OpenTelemetry, and to inject --report-junit / --report-junit-filename into TestingPlatformCommandLineArguments.
  • Updated Azure Pipelines scripts to pass --report-junit --report-junit-filename "{asm}_{tfm}.xml" when running dotnet test --test-modules (which bypasses MSBuild evaluation).
Show a summary per file
FileDescription
test/UnitTests/TestFramework.UnitTests/Program.csRegisters JUnit report + OpenTelemetry instrumentation in this unit test host.
test/UnitTests/MSTestAdapter.UnitTests/Program.csRegisters JUnit report + OpenTelemetry instrumentation in this unit test host.
test/UnitTests/MSTestAdapter.PlatformServices.UnitTests/Program.csRegisters JUnit report + OpenTelemetry instrumentation in this unit test host.
test/UnitTests/MSTest.SourceGeneration.UnitTests/Program.csRegisters JUnit report + OpenTelemetry instrumentation in this unit test host.
test/UnitTests/MSTest.SelfRealExamples.UnitTests/Program.csRegisters JUnit report + OpenTelemetry instrumentation in this unit test host.
test/UnitTests/MSTest.Analyzers.UnitTests/Program.csRegisters JUnit report + OpenTelemetry instrumentation in this unit test host.
test/UnitTests/Microsoft.Testing.Platform.UnitTests/Program.csRegisters JUnit report + OpenTelemetry instrumentation in this unit test host.
test/UnitTests/Microsoft.Testing.Platform.MSBuild.UnitTests/Program.csRegisters JUnit report + OpenTelemetry instrumentation in this unit test host.
test/UnitTests/Microsoft.Testing.Extensions.VSTestBridge.UnitTests/Program.csRegisters JUnit report and conditionally wires OpenTelemetry when not NATIVE_AOT.
test/UnitTests/Microsoft.Testing.Extensions.UnitTests/Program.csRegisters JUnit report + OpenTelemetry instrumentation in this unit test host.
test/Directory.Build.targetsAdds extension ProjectReferences and injects JUnit CLI options into MTP runs.
eng/pipelines/steps/test-non-windows.ymlAdds JUnit CLI options to the Release --test-modules path.
azure-pipelines.ymlAdds JUnit CLI options to the Release --test-modules path on Windows.
.github/workflows/shared/grade-tests-shared.mdDocumentation update: switch guidance example table to raw HTML for fixed column widths.

Copilot's findings

  • Files reviewed: 14/14 changed files
  • Comments generated: 1

Comment threadtest/Directory.Build.targets
Follow up to the AzDO/TRX dogfooding pattern: now also exercise the newest
report extension (JUnitReport, microsoft#8850) and the OpenTelemetry processing
pipeline end-to-end as part of our own CI test runs.
JUnit:
- test/Directory.Build.targets adds Microsoft.Testing.Extensions.JUnitReport
as a ProjectReference for every test project that opts into MTP and
wires --report-junit / --report-junit-filename into the MSBuild path.
- azure-pipelines.yml and eng/pipelines/steps/test-non-windows.yml also pass
--report-junit --report-junit-filename "{asm}_{tfm}.xml" on the Release
dotnet test --test-modules path (which bypasses MSBuild evaluation).
- Each test project's Program.cs explicitly calls AddJUnitReportProvider()
(TestingPlatformBuilderHook auto-registration only fires for NuGet
consumers, not source ProjectReferences).
OpenTelemetry:
- test/Directory.Build.targets adds Microsoft.Testing.Extensions.OpenTelemetry
as a ProjectReference.
- Each test project's Program.cs registers AddOpenTelemetryProvider with
AddTestingPlatformInstrumentation on both the tracer and meter builders.
No exporter is wired: the SDK still creates real Activities and Counters
because the sources/meters now have listeners, so data flows through the
full OpenTelemetryResultHandler pipeline and is dropped at the export
stage. Sufficient to exercise the handler in CI without polluting logs.
- VSTestBridge.UnitTests gates OTel registration on !NATIVE_AOT to match
its existing AOT-aware Program.cs pattern (the OTel SDK uses reflection).
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
… programs
Copilot reviewer caught (and Linux/Windows Debug CI confirmed): the 5
integration/acceptance test projects under test/IntegrationTests/ also opt
into the Microsoft.Testing.Platform via EnableMSTestRunner /
UseInternalTestFramework, so they pick up the --report-junit /
--report-junit-filename arguments injected from test/Directory.Build.targets,
but they never registered the JUnitReport extension in their explicit
Program.cs files. The Debug runs failed at startup with
`Unknown option 'report-junit'`.
Add AddJUnitReportProvider() alongside the existing AddTrxReportProvider()
call and an AddOpenTelemetryProvider(...) block (mirroring the 10 unit-test
Program.cs files) to:
- PlatformServices.Desktop.IntegrationTests
- MSTest.Acceptance.IntegrationTests
- Microsoft.Testing.Platform.Acceptance.IntegrationTests
- MSTest.IntegrationTests
- MSTest.VstestConsoleWrapper.IntegrationTests
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
@Evangelink
Amaury Levé (Evangelink)force-pushed the dev/amauryleve/dogfood-junit-otel branch from 889d67a to d6edbcaCompareJune 9, 2026 14:32
@Evangelink

Copy link
Copy Markdown
MemberAuthor

Rebased onto latest main to drop the two stale commits from PR #8961 (f53ecc246 + 1bad60019) that were already squash-merged as 2615f8bd7. gh pr diff now lists only the 18 files this PR actually owns .github/workflows/shared/grade-tests-shared.md is gone.

For the Windows Release failure, two things were going on in the previous run:

  1. Failed to create a unique log file after 3 seconds (8 unit-test EXEs log_yyMMddHHmmssfff.diag). FileLogger.CreateFileStream only has millisecond precision and reuses the same DateTimeOffset on retry, so concurrent test hosts under heavy --diagnostic traffic spin on the same filename until the 3s timeout. This is a pre-existing infra bug on main (filed mentally as a follow-up); the extra extension load this PR adds (JUnitReport + OpenTelemetry) likely just pushed startup contention over the edge.
  2. Watchdog_EmitsAfterQuietWindow_WhenStillTracking / Watchdog_EmitsForLateTracking_WhenQuietWindowElapsedWithNoWork (ShutdownProgressReporterTests) timing-sensitive assertions Expected value to be greater than or equal to the lower bound; took 7.9s and 15.8s respectively, consistent with the agent being oversubscribed from Initial commit! 🎉 #1 above.

Re-running CI on the rebased commit will follow up if either reproduces.

@Evangelink
Amaury Levé (Evangelink) merged commit 662eede into microsoft:mainJun 10, 2026
35 of 37 checks passed
@Evangelink
Amaury Levé (Evangelink) deleted the dev/amauryleve/dogfood-junit-otel branch June 10, 2026 09:22
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants

@Evangelink@YuliiaKovalova
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Auto-enable theater mode on YouTube\n(function() {\n function tryTheater() {\n var btn = document.querySelector('button[aria-label=\"Theater mode\"], ytd-player #player button[title=\"Theater mode\"]');\n if (btn && !btn.classList.contains('activated')) {\n btn.click();\n }\n }\n \n // Try immediately\n tryTheater();\n \n // Try after navigation (SPA)\n var lastUrl = location.href;\n setInterval(function() {\n if (location.href !== lastUrl) {\n lastUrl = location.href;\n setTimeout(tryTheater, 500);\n }\n }, 1000);\n \n // Also try on player load\n var observer = new MutationObserver(tryTheater);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "YouTube Theater Mode Default"); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Dogfood --report-junit and OpenTelemetry processing in CI - #8965

Merged
Amaury Levé (Evangelink) merged 2 commits into
microsoft:mainfrom
Evangelink:dev/amauryleve/dogfood-junit-otel
Jun 10, 2026
Merged

Dogfood --report-junit and OpenTelemetry processing in CI#8965
Amaury Levé (Evangelink) merged 2 commits into
microsoft:mainfrom
Evangelink:dev/amauryleve/dogfood-junit-otel

Conversation

@Evangelink

Copy link
Copy Markdown
Member

Follow up to the AzDO/TRX dogfooding pattern (#0028908d): now also exercise the newest report extension (JUnitReport, #8850) and the OpenTelemetry processing pipeline end-to-end as part of our own CI test runs.

JUnit Report (--report-junit)

  • test/Directory.Build.targets adds Microsoft.Testing.Extensions.JUnitReport as a ProjectReference for every test project that opts into MTP and wires --report-junit / --report-junit-filename into the MSBuild path.
  • azure-pipelines.yml and eng/pipelines/steps/test-non-windows.yml also pass --report-junit --report-junit-filename "{asm}_{tfm}.xml" on the Release dotnet test --test-modules path (which bypasses MSBuild evaluation).
  • Each test project's Program.cs explicitly calls AddJUnitReportProvider(). TestingPlatformBuilderHook auto-registration only fires for NuGet consumers, not source ProjectReference consumers.

OpenTelemetry processing

  • test/Directory.Build.targets adds Microsoft.Testing.Extensions.OpenTelemetry as a ProjectReference.
  • Each test project's Program.cs registers AddOpenTelemetryProvider with AddTestingPlatformInstrumentation on both the tracer and meter builders.
  • No exporter is wired. The SDK still creates real Activity/Counter instances because the sources/meters now have listeners, so data flows through the full OpenTelemetryResultHandler pipeline and is then dropped at the export stage. That's sufficient to exercise the handler (which has been actively optimised recently, e.g. [efficiency-improver] perf: single-pass PropertyBag walk in OpenTelemetryResultHandler.HandleTestResult #8938) without polluting CI logs. We can wire an actual exporter later if we want to publish the data anywhere.
  • VSTestBridge.UnitTests gates OTel registration on !NATIVE_AOT to match the existing AOT-aware Program.cs pattern there (the OTel SDK uses reflection).

Verification

  • Built all 10 affected test projects locally (Debug).
  • Smoke-ran Microsoft.Testing.Extensions.UnitTests end-to-end with both extensions registered: 431 tests pass and a ~230 KB JUnit XML report is emitted (<testsuites name="Microsoft.Testing.Extensions.UnitTests" tests="431" failures="0" ...>).

CopilotAI review requested due to automatic review settings June 9, 2026 12:58

CopilotAI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

This PR extends the existing CI dogfooding pattern for MTP extensions by enabling JUnit XML reporting (--report-junit) and exercising the OpenTelemetry result handling pipeline during the repo’s own unit test runs.

Changes:

  • Updated multiple test-host Program.cs entrypoints to register AddJUnitReportProvider() and to wire AddOpenTelemetryProvider(...AddTestingPlatformInstrumentation...).
  • Updated test/Directory.Build.targets to add ProjectReferences for Microsoft.Testing.Extensions.JUnitReport and Microsoft.Testing.Extensions.OpenTelemetry, and to inject --report-junit / --report-junit-filename into TestingPlatformCommandLineArguments.
  • Updated Azure Pipelines scripts to pass --report-junit --report-junit-filename "{asm}_{tfm}.xml" when running dotnet test --test-modules (which bypasses MSBuild evaluation).
Show a summary per file
FileDescription
test/UnitTests/TestFramework.UnitTests/Program.csRegisters JUnit report + OpenTelemetry instrumentation in this unit test host.
test/UnitTests/MSTestAdapter.UnitTests/Program.csRegisters JUnit report + OpenTelemetry instrumentation in this unit test host.
test/UnitTests/MSTestAdapter.PlatformServices.UnitTests/Program.csRegisters JUnit report + OpenTelemetry instrumentation in this unit test host.
test/UnitTests/MSTest.SourceGeneration.UnitTests/Program.csRegisters JUnit report + OpenTelemetry instrumentation in this unit test host.
test/UnitTests/MSTest.SelfRealExamples.UnitTests/Program.csRegisters JUnit report + OpenTelemetry instrumentation in this unit test host.
test/UnitTests/MSTest.Analyzers.UnitTests/Program.csRegisters JUnit report + OpenTelemetry instrumentation in this unit test host.
test/UnitTests/Microsoft.Testing.Platform.UnitTests/Program.csRegisters JUnit report + OpenTelemetry instrumentation in this unit test host.
test/UnitTests/Microsoft.Testing.Platform.MSBuild.UnitTests/Program.csRegisters JUnit report + OpenTelemetry instrumentation in this unit test host.
test/UnitTests/Microsoft.Testing.Extensions.VSTestBridge.UnitTests/Program.csRegisters JUnit report and conditionally wires OpenTelemetry when not NATIVE_AOT.
test/UnitTests/Microsoft.Testing.Extensions.UnitTests/Program.csRegisters JUnit report + OpenTelemetry instrumentation in this unit test host.
test/Directory.Build.targetsAdds extension ProjectReferences and injects JUnit CLI options into MTP runs.
eng/pipelines/steps/test-non-windows.ymlAdds JUnit CLI options to the Release --test-modules path.
azure-pipelines.ymlAdds JUnit CLI options to the Release --test-modules path on Windows.
.github/workflows/shared/grade-tests-shared.mdDocumentation update: switch guidance example table to raw HTML for fixed column widths.

Copilot's findings

  • Files reviewed: 14/14 changed files
  • Comments generated: 1

Comment threadtest/Directory.Build.targets
Follow up to the AzDO/TRX dogfooding pattern: now also exercise the newest
report extension (JUnitReport, microsoft#8850) and the OpenTelemetry processing
pipeline end-to-end as part of our own CI test runs.
JUnit:
- test/Directory.Build.targets adds Microsoft.Testing.Extensions.JUnitReport
as a ProjectReference for every test project that opts into MTP and
wires --report-junit / --report-junit-filename into the MSBuild path.
- azure-pipelines.yml and eng/pipelines/steps/test-non-windows.yml also pass
--report-junit --report-junit-filename "{asm}_{tfm}.xml" on the Release
dotnet test --test-modules path (which bypasses MSBuild evaluation).
- Each test project's Program.cs explicitly calls AddJUnitReportProvider()
(TestingPlatformBuilderHook auto-registration only fires for NuGet
consumers, not source ProjectReferences).
OpenTelemetry:
- test/Directory.Build.targets adds Microsoft.Testing.Extensions.OpenTelemetry
as a ProjectReference.
- Each test project's Program.cs registers AddOpenTelemetryProvider with
AddTestingPlatformInstrumentation on both the tracer and meter builders.
No exporter is wired: the SDK still creates real Activities and Counters
because the sources/meters now have listeners, so data flows through the
full OpenTelemetryResultHandler pipeline and is dropped at the export
stage. Sufficient to exercise the handler in CI without polluting logs.
- VSTestBridge.UnitTests gates OTel registration on !NATIVE_AOT to match
its existing AOT-aware Program.cs pattern (the OTel SDK uses reflection).
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
… programs
Copilot reviewer caught (and Linux/Windows Debug CI confirmed): the 5
integration/acceptance test projects under test/IntegrationTests/ also opt
into the Microsoft.Testing.Platform via EnableMSTestRunner /
UseInternalTestFramework, so they pick up the --report-junit /
--report-junit-filename arguments injected from test/Directory.Build.targets,
but they never registered the JUnitReport extension in their explicit
Program.cs files. The Debug runs failed at startup with
`Unknown option 'report-junit'`.
Add AddJUnitReportProvider() alongside the existing AddTrxReportProvider()
call and an AddOpenTelemetryProvider(...) block (mirroring the 10 unit-test
Program.cs files) to:
- PlatformServices.Desktop.IntegrationTests
- MSTest.Acceptance.IntegrationTests
- Microsoft.Testing.Platform.Acceptance.IntegrationTests
- MSTest.IntegrationTests
- MSTest.VstestConsoleWrapper.IntegrationTests
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
@Evangelink
Amaury Levé (Evangelink)force-pushed the dev/amauryleve/dogfood-junit-otel branch from 889d67a to d6edbcaCompareJune 9, 2026 14:32
@Evangelink

Copy link
Copy Markdown
MemberAuthor

Rebased onto latest main to drop the two stale commits from PR #8961 (f53ecc246 + 1bad60019) that were already squash-merged as 2615f8bd7. gh pr diff now lists only the 18 files this PR actually owns .github/workflows/shared/grade-tests-shared.md is gone.

For the Windows Release failure, two things were going on in the previous run:

  1. Failed to create a unique log file after 3 seconds (8 unit-test EXEs log_yyMMddHHmmssfff.diag). FileLogger.CreateFileStream only has millisecond precision and reuses the same DateTimeOffset on retry, so concurrent test hosts under heavy --diagnostic traffic spin on the same filename until the 3s timeout. This is a pre-existing infra bug on main (filed mentally as a follow-up); the extra extension load this PR adds (JUnitReport + OpenTelemetry) likely just pushed startup contention over the edge.
  2. Watchdog_EmitsAfterQuietWindow_WhenStillTracking / Watchdog_EmitsForLateTracking_WhenQuietWindowElapsedWithNoWork (ShutdownProgressReporterTests) timing-sensitive assertions Expected value to be greater than or equal to the lower bound; took 7.9s and 15.8s respectively, consistent with the agent being oversubscribed from Initial commit! 🎉 #1 above.

Re-running CI on the rebased commit will follow up if either reproduces.

@Evangelink
Amaury Levé (Evangelink) merged commit 662eede into microsoft:mainJun 10, 2026
35 of 37 checks passed
@Evangelink
Amaury Levé (Evangelink) deleted the dev/amauryleve/dogfood-junit-otel branch June 10, 2026 09:22
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants

@Evangelink@YuliiaKovalova
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Remove or un-stick sticky/fixed headers that block content\n(function() {\n function unstick() {\n document.querySelectorAll('header, nav, [role=\"banner\"], .header, .navbar, .sticky, .fixed-top, [style*=\"position: fixed\"], [style*=\"position:sticky\"]').forEach(function(el) {\n if (el.style.position === 'fixed' || el.style.position === 'sticky' || \n getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') {\n el.style.position = 'static';\n el.style.top = 'auto';\n el.style.zIndex = 'auto';\n }\n });\n }\n \n unstick();\n \n var observer = new MutationObserver(unstick);\n observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] });\n})();", "Kill Sticky Headers"); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Dogfood --report-junit and OpenTelemetry processing in CI - #8965

Merged
Amaury Levé (Evangelink) merged 2 commits into
microsoft:mainfrom
Evangelink:dev/amauryleve/dogfood-junit-otel
Jun 10, 2026
Merged

Dogfood --report-junit and OpenTelemetry processing in CI#8965
Amaury Levé (Evangelink) merged 2 commits into
microsoft:mainfrom
Evangelink:dev/amauryleve/dogfood-junit-otel

Conversation

@Evangelink

Copy link
Copy Markdown
Member

Follow up to the AzDO/TRX dogfooding pattern (#0028908d): now also exercise the newest report extension (JUnitReport, #8850) and the OpenTelemetry processing pipeline end-to-end as part of our own CI test runs.

JUnit Report (--report-junit)

  • test/Directory.Build.targets adds Microsoft.Testing.Extensions.JUnitReport as a ProjectReference for every test project that opts into MTP and wires --report-junit / --report-junit-filename into the MSBuild path.
  • azure-pipelines.yml and eng/pipelines/steps/test-non-windows.yml also pass --report-junit --report-junit-filename "{asm}_{tfm}.xml" on the Release dotnet test --test-modules path (which bypasses MSBuild evaluation).
  • Each test project's Program.cs explicitly calls AddJUnitReportProvider(). TestingPlatformBuilderHook auto-registration only fires for NuGet consumers, not source ProjectReference consumers.

OpenTelemetry processing

  • test/Directory.Build.targets adds Microsoft.Testing.Extensions.OpenTelemetry as a ProjectReference.
  • Each test project's Program.cs registers AddOpenTelemetryProvider with AddTestingPlatformInstrumentation on both the tracer and meter builders.
  • No exporter is wired. The SDK still creates real Activity/Counter instances because the sources/meters now have listeners, so data flows through the full OpenTelemetryResultHandler pipeline and is then dropped at the export stage. That's sufficient to exercise the handler (which has been actively optimised recently, e.g. [efficiency-improver] perf: single-pass PropertyBag walk in OpenTelemetryResultHandler.HandleTestResult #8938) without polluting CI logs. We can wire an actual exporter later if we want to publish the data anywhere.
  • VSTestBridge.UnitTests gates OTel registration on !NATIVE_AOT to match the existing AOT-aware Program.cs pattern there (the OTel SDK uses reflection).

Verification

  • Built all 10 affected test projects locally (Debug).
  • Smoke-ran Microsoft.Testing.Extensions.UnitTests end-to-end with both extensions registered: 431 tests pass and a ~230 KB JUnit XML report is emitted (<testsuites name="Microsoft.Testing.Extensions.UnitTests" tests="431" failures="0" ...>).

CopilotAI review requested due to automatic review settings June 9, 2026 12:58

CopilotAI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

This PR extends the existing CI dogfooding pattern for MTP extensions by enabling JUnit XML reporting (--report-junit) and exercising the OpenTelemetry result handling pipeline during the repo’s own unit test runs.

Changes:

  • Updated multiple test-host Program.cs entrypoints to register AddJUnitReportProvider() and to wire AddOpenTelemetryProvider(...AddTestingPlatformInstrumentation...).
  • Updated test/Directory.Build.targets to add ProjectReferences for Microsoft.Testing.Extensions.JUnitReport and Microsoft.Testing.Extensions.OpenTelemetry, and to inject --report-junit / --report-junit-filename into TestingPlatformCommandLineArguments.
  • Updated Azure Pipelines scripts to pass --report-junit --report-junit-filename "{asm}_{tfm}.xml" when running dotnet test --test-modules (which bypasses MSBuild evaluation).
Show a summary per file
FileDescription
test/UnitTests/TestFramework.UnitTests/Program.csRegisters JUnit report + OpenTelemetry instrumentation in this unit test host.
test/UnitTests/MSTestAdapter.UnitTests/Program.csRegisters JUnit report + OpenTelemetry instrumentation in this unit test host.
test/UnitTests/MSTestAdapter.PlatformServices.UnitTests/Program.csRegisters JUnit report + OpenTelemetry instrumentation in this unit test host.
test/UnitTests/MSTest.SourceGeneration.UnitTests/Program.csRegisters JUnit report + OpenTelemetry instrumentation in this unit test host.
test/UnitTests/MSTest.SelfRealExamples.UnitTests/Program.csRegisters JUnit report + OpenTelemetry instrumentation in this unit test host.
test/UnitTests/MSTest.Analyzers.UnitTests/Program.csRegisters JUnit report + OpenTelemetry instrumentation in this unit test host.
test/UnitTests/Microsoft.Testing.Platform.UnitTests/Program.csRegisters JUnit report + OpenTelemetry instrumentation in this unit test host.
test/UnitTests/Microsoft.Testing.Platform.MSBuild.UnitTests/Program.csRegisters JUnit report + OpenTelemetry instrumentation in this unit test host.
test/UnitTests/Microsoft.Testing.Extensions.VSTestBridge.UnitTests/Program.csRegisters JUnit report and conditionally wires OpenTelemetry when not NATIVE_AOT.
test/UnitTests/Microsoft.Testing.Extensions.UnitTests/Program.csRegisters JUnit report + OpenTelemetry instrumentation in this unit test host.
test/Directory.Build.targetsAdds extension ProjectReferences and injects JUnit CLI options into MTP runs.
eng/pipelines/steps/test-non-windows.ymlAdds JUnit CLI options to the Release --test-modules path.
azure-pipelines.ymlAdds JUnit CLI options to the Release --test-modules path on Windows.
.github/workflows/shared/grade-tests-shared.mdDocumentation update: switch guidance example table to raw HTML for fixed column widths.

Copilot's findings

  • Files reviewed: 14/14 changed files
  • Comments generated: 1

Comment threadtest/Directory.Build.targets
Follow up to the AzDO/TRX dogfooding pattern: now also exercise the newest
report extension (JUnitReport, microsoft#8850) and the OpenTelemetry processing
pipeline end-to-end as part of our own CI test runs.
JUnit:
- test/Directory.Build.targets adds Microsoft.Testing.Extensions.JUnitReport
as a ProjectReference for every test project that opts into MTP and
wires --report-junit / --report-junit-filename into the MSBuild path.
- azure-pipelines.yml and eng/pipelines/steps/test-non-windows.yml also pass
--report-junit --report-junit-filename "{asm}_{tfm}.xml" on the Release
dotnet test --test-modules path (which bypasses MSBuild evaluation).
- Each test project's Program.cs explicitly calls AddJUnitReportProvider()
(TestingPlatformBuilderHook auto-registration only fires for NuGet
consumers, not source ProjectReferences).
OpenTelemetry:
- test/Directory.Build.targets adds Microsoft.Testing.Extensions.OpenTelemetry
as a ProjectReference.
- Each test project's Program.cs registers AddOpenTelemetryProvider with
AddTestingPlatformInstrumentation on both the tracer and meter builders.
No exporter is wired: the SDK still creates real Activities and Counters
because the sources/meters now have listeners, so data flows through the
full OpenTelemetryResultHandler pipeline and is dropped at the export
stage. Sufficient to exercise the handler in CI without polluting logs.
- VSTestBridge.UnitTests gates OTel registration on !NATIVE_AOT to match
its existing AOT-aware Program.cs pattern (the OTel SDK uses reflection).
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
… programs
Copilot reviewer caught (and Linux/Windows Debug CI confirmed): the 5
integration/acceptance test projects under test/IntegrationTests/ also opt
into the Microsoft.Testing.Platform via EnableMSTestRunner /
UseInternalTestFramework, so they pick up the --report-junit /
--report-junit-filename arguments injected from test/Directory.Build.targets,
but they never registered the JUnitReport extension in their explicit
Program.cs files. The Debug runs failed at startup with
`Unknown option 'report-junit'`.
Add AddJUnitReportProvider() alongside the existing AddTrxReportProvider()
call and an AddOpenTelemetryProvider(...) block (mirroring the 10 unit-test
Program.cs files) to:
- PlatformServices.Desktop.IntegrationTests
- MSTest.Acceptance.IntegrationTests
- Microsoft.Testing.Platform.Acceptance.IntegrationTests
- MSTest.IntegrationTests
- MSTest.VstestConsoleWrapper.IntegrationTests
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
@Evangelink
Amaury Levé (Evangelink)force-pushed the dev/amauryleve/dogfood-junit-otel branch from 889d67a to d6edbcaCompareJune 9, 2026 14:32
@Evangelink

Copy link
Copy Markdown
MemberAuthor

Rebased onto latest main to drop the two stale commits from PR #8961 (f53ecc246 + 1bad60019) that were already squash-merged as 2615f8bd7. gh pr diff now lists only the 18 files this PR actually owns .github/workflows/shared/grade-tests-shared.md is gone.

For the Windows Release failure, two things were going on in the previous run:

  1. Failed to create a unique log file after 3 seconds (8 unit-test EXEs log_yyMMddHHmmssfff.diag). FileLogger.CreateFileStream only has millisecond precision and reuses the same DateTimeOffset on retry, so concurrent test hosts under heavy --diagnostic traffic spin on the same filename until the 3s timeout. This is a pre-existing infra bug on main (filed mentally as a follow-up); the extra extension load this PR adds (JUnitReport + OpenTelemetry) likely just pushed startup contention over the edge.
  2. Watchdog_EmitsAfterQuietWindow_WhenStillTracking / Watchdog_EmitsForLateTracking_WhenQuietWindowElapsedWithNoWork (ShutdownProgressReporterTests) timing-sensitive assertions Expected value to be greater than or equal to the lower bound; took 7.9s and 15.8s respectively, consistent with the agent being oversubscribed from Initial commit! 🎉 #1 above.

Re-running CI on the rebased commit will follow up if either reproduces.

@Evangelink
Amaury Levé (Evangelink) merged commit 662eede into microsoft:mainJun 10, 2026
35 of 37 checks passed
@Evangelink
Amaury Levé (Evangelink) deleted the dev/amauryleve/dogfood-junit-otel branch June 10, 2026 09:22
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants

@Evangelink@YuliiaKovalova
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Universal Dark Mode - works on any site\n(function() {\n var enabled = true;\n \n function applyDarkMode() {\n if (!enabled) return;\n \n // Create style element if it doesn't exist\n var style = document.getElementById('universal-dark-mode-style');\n if (!style) {\n style = document.createElement('style');\n style.id = 'universal-dark-mode-style';\n document.head.appendChild(style);\n }\n \n // Dark mode CSS - inverts colors but preserves images/video\n style.textContent = '\n /* Invert everything except media */\n html {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #1a1a2e !important;\n }\n \n /* Restore images, videos, iframes, canvas */\n img, video, iframe, canvas, svg, picture, [style*=\"background-image\"] {\n filter: invert(1) hue-rotate(180deg) !important;\n }\n \n /* Preserve specific elements that should not be inverted */\n .no-dark-mode, .no-dark-mode *,\n [data-theme=\"light\"], [data-theme=\"light\"],\n .ace_editor, .ace_editor *,\n .CodeMirror, .CodeMirror *,\n .monaco-editor, .monaco-editor *,\n .markdown-body pre, .markdown-body pre *,\n .highlight, .highlight *,\n pre code, pre code * {\n filter: none !important;\n }\n \n /* Fix common UI elements */\n .modal, .popup, .dropdown-menu, .tooltip, .popover {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #2d2d44 !important;\n border-color: #444 !important;\n }\n \n /* Scrollbars */\n ::-webkit-scrollbar { background: #1a1a2e !important; }\n ::-webkit-scrollbar-thumb { background: #444 !important; }\n ::-webkit-scrollbar-thumb:hover { background: #555 !important; }\n \n /* Selection */\n ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ';\n }\n \n function removeDarkMode() {\n var style = document.getElementById('universal-dark-mode-style');\n if (style) style.remove();\n }\n \n // Toggle with Alt+Shift+D\n document.addEventListener('keydown', function(e) {\n if (e.altKey && e.shiftKey && e.key === 'D') {\n e.preventDefault();\n enabled = !enabled;\n if (enabled) {\n applyDarkMode();\n console.log('[Universal Dark Mode] Enabled');\n } else {\n removeDarkMode();\n console.log('[Universal Dark Mode] Disabled');\n }\n }\n });\n \n // Apply on load\n applyDarkMode();\n \n // Re-apply on dynamic content\n var observer = new MutationObserver(function(mutations) {\n if (enabled && !document.getElementById('universal-dark-mode-style')) {\n applyDarkMode();\n }\n });\n observer.observe(document.head, { childList: true });\n \n console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle');\n})();", "Universal Dark Mode"); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })();
Skip to content

Dogfood --report-junit and OpenTelemetry processing in CI - #8965

Merged
Amaury Levé (Evangelink) merged 2 commits into
microsoft:mainfrom
Evangelink:dev/amauryleve/dogfood-junit-otel
Jun 10, 2026
Merged

Dogfood --report-junit and OpenTelemetry processing in CI#8965
Amaury Levé (Evangelink) merged 2 commits into
microsoft:mainfrom
Evangelink:dev/amauryleve/dogfood-junit-otel

Conversation

@Evangelink

Copy link
Copy Markdown
Member

Follow up to the AzDO/TRX dogfooding pattern (#0028908d): now also exercise the newest report extension (JUnitReport, #8850) and the OpenTelemetry processing pipeline end-to-end as part of our own CI test runs.

JUnit Report (--report-junit)

  • test/Directory.Build.targets adds Microsoft.Testing.Extensions.JUnitReport as a ProjectReference for every test project that opts into MTP and wires --report-junit / --report-junit-filename into the MSBuild path.
  • azure-pipelines.yml and eng/pipelines/steps/test-non-windows.yml also pass --report-junit --report-junit-filename "{asm}_{tfm}.xml" on the Release dotnet test --test-modules path (which bypasses MSBuild evaluation).
  • Each test project's Program.cs explicitly calls AddJUnitReportProvider(). TestingPlatformBuilderHook auto-registration only fires for NuGet consumers, not source ProjectReference consumers.

OpenTelemetry processing

  • test/Directory.Build.targets adds Microsoft.Testing.Extensions.OpenTelemetry as a ProjectReference.
  • Each test project's Program.cs registers AddOpenTelemetryProvider with AddTestingPlatformInstrumentation on both the tracer and meter builders.
  • No exporter is wired. The SDK still creates real Activity/Counter instances because the sources/meters now have listeners, so data flows through the full OpenTelemetryResultHandler pipeline and is then dropped at the export stage. That's sufficient to exercise the handler (which has been actively optimised recently, e.g. [efficiency-improver] perf: single-pass PropertyBag walk in OpenTelemetryResultHandler.HandleTestResult #8938) without polluting CI logs. We can wire an actual exporter later if we want to publish the data anywhere.
  • VSTestBridge.UnitTests gates OTel registration on !NATIVE_AOT to match the existing AOT-aware Program.cs pattern there (the OTel SDK uses reflection).

Verification

  • Built all 10 affected test projects locally (Debug).
  • Smoke-ran Microsoft.Testing.Extensions.UnitTests end-to-end with both extensions registered: 431 tests pass and a ~230 KB JUnit XML report is emitted (<testsuites name="Microsoft.Testing.Extensions.UnitTests" tests="431" failures="0" ...>).

CopilotAI review requested due to automatic review settings June 9, 2026 12:58

CopilotAI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

This PR extends the existing CI dogfooding pattern for MTP extensions by enabling JUnit XML reporting (--report-junit) and exercising the OpenTelemetry result handling pipeline during the repo’s own unit test runs.

Changes:

  • Updated multiple test-host Program.cs entrypoints to register AddJUnitReportProvider() and to wire AddOpenTelemetryProvider(...AddTestingPlatformInstrumentation...).
  • Updated test/Directory.Build.targets to add ProjectReferences for Microsoft.Testing.Extensions.JUnitReport and Microsoft.Testing.Extensions.OpenTelemetry, and to inject --report-junit / --report-junit-filename into TestingPlatformCommandLineArguments.
  • Updated Azure Pipelines scripts to pass --report-junit --report-junit-filename "{asm}_{tfm}.xml" when running dotnet test --test-modules (which bypasses MSBuild evaluation).
Show a summary per file
FileDescription
test/UnitTests/TestFramework.UnitTests/Program.csRegisters JUnit report + OpenTelemetry instrumentation in this unit test host.
test/UnitTests/MSTestAdapter.UnitTests/Program.csRegisters JUnit report + OpenTelemetry instrumentation in this unit test host.
test/UnitTests/MSTestAdapter.PlatformServices.UnitTests/Program.csRegisters JUnit report + OpenTelemetry instrumentation in this unit test host.
test/UnitTests/MSTest.SourceGeneration.UnitTests/Program.csRegisters JUnit report + OpenTelemetry instrumentation in this unit test host.
test/UnitTests/MSTest.SelfRealExamples.UnitTests/Program.csRegisters JUnit report + OpenTelemetry instrumentation in this unit test host.
test/UnitTests/MSTest.Analyzers.UnitTests/Program.csRegisters JUnit report + OpenTelemetry instrumentation in this unit test host.
test/UnitTests/Microsoft.Testing.Platform.UnitTests/Program.csRegisters JUnit report + OpenTelemetry instrumentation in this unit test host.
test/UnitTests/Microsoft.Testing.Platform.MSBuild.UnitTests/Program.csRegisters JUnit report + OpenTelemetry instrumentation in this unit test host.
test/UnitTests/Microsoft.Testing.Extensions.VSTestBridge.UnitTests/Program.csRegisters JUnit report and conditionally wires OpenTelemetry when not NATIVE_AOT.
test/UnitTests/Microsoft.Testing.Extensions.UnitTests/Program.csRegisters JUnit report + OpenTelemetry instrumentation in this unit test host.
test/Directory.Build.targetsAdds extension ProjectReferences and injects JUnit CLI options into MTP runs.
eng/pipelines/steps/test-non-windows.ymlAdds JUnit CLI options to the Release --test-modules path.
azure-pipelines.ymlAdds JUnit CLI options to the Release --test-modules path on Windows.
.github/workflows/shared/grade-tests-shared.mdDocumentation update: switch guidance example table to raw HTML for fixed column widths.

Copilot's findings

  • Files reviewed: 14/14 changed files
  • Comments generated: 1

Comment threadtest/Directory.Build.targets
Follow up to the AzDO/TRX dogfooding pattern: now also exercise the newest
report extension (JUnitReport, microsoft#8850) and the OpenTelemetry processing
pipeline end-to-end as part of our own CI test runs.
JUnit:
- test/Directory.Build.targets adds Microsoft.Testing.Extensions.JUnitReport
as a ProjectReference for every test project that opts into MTP and
wires --report-junit / --report-junit-filename into the MSBuild path.
- azure-pipelines.yml and eng/pipelines/steps/test-non-windows.yml also pass
--report-junit --report-junit-filename "{asm}_{tfm}.xml" on the Release
dotnet test --test-modules path (which bypasses MSBuild evaluation).
- Each test project's Program.cs explicitly calls AddJUnitReportProvider()
(TestingPlatformBuilderHook auto-registration only fires for NuGet
consumers, not source ProjectReferences).
OpenTelemetry:
- test/Directory.Build.targets adds Microsoft.Testing.Extensions.OpenTelemetry
as a ProjectReference.
- Each test project's Program.cs registers AddOpenTelemetryProvider with
AddTestingPlatformInstrumentation on both the tracer and meter builders.
No exporter is wired: the SDK still creates real Activities and Counters
because the sources/meters now have listeners, so data flows through the
full OpenTelemetryResultHandler pipeline and is dropped at the export
stage. Sufficient to exercise the handler in CI without polluting logs.
- VSTestBridge.UnitTests gates OTel registration on !NATIVE_AOT to match
its existing AOT-aware Program.cs pattern (the OTel SDK uses reflection).
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
… programs
Copilot reviewer caught (and Linux/Windows Debug CI confirmed): the 5
integration/acceptance test projects under test/IntegrationTests/ also opt
into the Microsoft.Testing.Platform via EnableMSTestRunner /
UseInternalTestFramework, so they pick up the --report-junit /
--report-junit-filename arguments injected from test/Directory.Build.targets,
but they never registered the JUnitReport extension in their explicit
Program.cs files. The Debug runs failed at startup with
`Unknown option 'report-junit'`.
Add AddJUnitReportProvider() alongside the existing AddTrxReportProvider()
call and an AddOpenTelemetryProvider(...) block (mirroring the 10 unit-test
Program.cs files) to:
- PlatformServices.Desktop.IntegrationTests
- MSTest.Acceptance.IntegrationTests
- Microsoft.Testing.Platform.Acceptance.IntegrationTests
- MSTest.IntegrationTests
- MSTest.VstestConsoleWrapper.IntegrationTests
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
@Evangelink
Amaury Levé (Evangelink)force-pushed the dev/amauryleve/dogfood-junit-otel branch from 889d67a to d6edbcaCompareJune 9, 2026 14:32
@Evangelink

Copy link
Copy Markdown
MemberAuthor

Rebased onto latest main to drop the two stale commits from PR #8961 (f53ecc246 + 1bad60019) that were already squash-merged as 2615f8bd7. gh pr diff now lists only the 18 files this PR actually owns .github/workflows/shared/grade-tests-shared.md is gone.

For the Windows Release failure, two things were going on in the previous run:

  1. Failed to create a unique log file after 3 seconds (8 unit-test EXEs log_yyMMddHHmmssfff.diag). FileLogger.CreateFileStream only has millisecond precision and reuses the same DateTimeOffset on retry, so concurrent test hosts under heavy --diagnostic traffic spin on the same filename until the 3s timeout. This is a pre-existing infra bug on main (filed mentally as a follow-up); the extra extension load this PR adds (JUnitReport + OpenTelemetry) likely just pushed startup contention over the edge.
  2. Watchdog_EmitsAfterQuietWindow_WhenStillTracking / Watchdog_EmitsForLateTracking_WhenQuietWindowElapsedWithNoWork (ShutdownProgressReporterTests) timing-sensitive assertions Expected value to be greater than or equal to the lower bound; took 7.9s and 15.8s respectively, consistent with the agent being oversubscribed from Initial commit! 🎉 #1 above.

Re-running CI on the rebased commit will follow up if either reproduces.

@Evangelink
Amaury Levé (Evangelink) merged commit 662eede into microsoft:mainJun 10, 2026
35 of 37 checks passed
@Evangelink
Amaury Levé (Evangelink) deleted the dev/amauryleve/dogfood-junit-otel branch June 10, 2026 09:22
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants

@Evangelink@YuliiaKovalova