Emit ::warning annotations for skipped tests in GitHubActionsReport - #9641

Merged
Amaury Levé (Evangelink) merged 1 commit into
mainfrom
dev/amauryleve/github-report-gaps
Jul 5, 2026
Merged

Emit ::warning annotations for skipped tests in GitHubActionsReport#9641
Amaury Levé (Evangelink) merged 1 commit into
mainfrom
dev/amauryleve/github-report-gaps

Conversation

@Evangelink

Copy link
Copy Markdown
Member

What

Adds skipped-test annotations to Microsoft.Testing.Extensions.GitHubActionsReport. Previously, only failing tests produced ::error annotations; skipped tests were silently absent from the GitHub Actions Annotations tab. This change surfaces each skipped test as a title-only ::warning workflow command so intentionally/unexpectedly skipped tests are visible alongside failures.

Why

While assessing RFC #9003 against the shipped extension, this was the one clearly-scoped Tier 1 (no-auth, workflow-command) gap. The RFC explicitly lists "::warning … for skipped" in Tier 1. Tiers 2/3 (Check Runs and sticky PR comments via the GitHub API + GITHUB_TOKEN) remain a separate follow-up.

How

  • GitHubActionsAnnotationReporter now handles SkippedTestNodeStateProperty and emits a title-only ::warning (skipped nodes carry no exception/stack trace, so there is no file:line to pin to). Added a testable GetSkippedAnnotation helper mirroring GetErrorAnnotation.
  • Folded into the existing --report-gh-annotations knob (no new CLI option); broadened its description to "failed and skipped tests".
  • New resources SkippedAnnotationTitle / NoSkipReasonFallback; regenerated all 14 .xlf files via UpdateXlf.
  • Updated HelpInfoAllExtensionsTests (--help + --info) and PACKAGE.md to match.
  • Added unit tests for the reason and fallback paths.

Behavioral notes

::warning is purely informational in GitHub Actions — it does not affect step/job pass-fail (that's driven solely by the process exit code, which this reporter never touches). The reporter's ConsumeAsync is wrapped in try/catch that degrades to "no annotation" on any exception. The feature stays behind the --report-gh master switch (off by default) and the on-by-default --report-gh-annotations knob.

Verification

  • Extension + Microsoft.Testing.Extensions.UnitTests build clean (0 warnings/errors).
  • Full extensions unit-test suite passes on net9.0 (failed: 0), including the 2 new tests.

🤖 Assisted by GitHub Copilot CLI.

Skipped tests were previously invisible in the GitHub Actions Annotations tab. Surface them as title-only ::warning workflow commands under the existing --report-gh-annotations knob, mirroring the RFC #9003 Tier 1 design.
Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
CopilotAI review requested due to automatic review settings July 5, 2026 19:50
@EvangelinkAmaury Levé (Evangelink) added the state/needs-review Awaiting review from the team. label Jul 5, 2026
@Evangelink
Amaury Levé (Evangelink) enabled auto-merge (squash) July 5, 2026 19:51
@Evangelink

Copy link
Copy Markdown
MemberAuthor

/backport to rel/4.3

@github-actions

Copy link
Copy Markdown
Contributor

Started backporting to rel/4.3: https://github.com/microsoft/testfx/actions/runs/28752868353

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 Microsoft.Testing.Extensions.GitHubActionsReport so that skipped tests now surface in the GitHub Actions Annotations tab. Previously only failing tests produced ::error annotations; skipped tests were silently absent. This implements the clearly-scoped Tier 1 gap from RFC #9003 (::warning for skipped tests), while Tiers 2/3 (Check Runs / sticky PR comments needing GITHUB_TOKEN) remain follow-ups.

Changes:

  • GitHubActionsAnnotationReporter now handles SkippedTestNodeStateProperty and emits a title-only ::warning via a new testable GetSkippedAnnotation helper that mirrors GetErrorAnnotation.
  • Adds resources SkippedAnnotationTitle / NoSkipReasonFallback, regenerates all 13 .xlf files, and broadens the --report-gh-annotations description to cover "failed and skipped tests" (no new CLI option).
  • Updates unit tests, the HelpInfoAllExtensionsTests help/info expectations, PACKAGE.md, and the class doc comment.
Show a summary per file
FileDescription
GitHubActionsAnnotationReporter.csAdds skipped-test branch + WriteSkippedAnnotationAsync / GetSkippedAnnotation emitting title-only ::warning; updates doc comment
Resources/GitHubActionsResources.resxAdds SkippedAnnotationTitle / NoSkipReasonFallback; broadens annotations option description
Resources/xlf/*.xlf (13 files)Regenerated via UpdateXlf with the two new trans-units and updated option description (correct alphabetical id order)
GitHubActionsAnnotationReporterTests.csAdds two tests for the skipped-annotation reason and fallback paths, including escaping
HelpInfoAllExtensionsTests.csUpdates --help and --info expectations to the new option description
PACKAGE.mdDocuments skipped-test ::warning behavior and updates the options table row

The change is additive, well-scoped, and consistent with the existing failure-annotation path: both branches use the same GetTestName, newline-prepend, and escaping conventions. The unit tests match the existing "test the pure formatter helper" convention, help/info expectations are the only place the option description is asserted and are updated, and the .xlf regeneration preserves correct alphabetical id ordering. I found no objective issues.

Review details

  • Files reviewed: 18/18 changed files
  • Comments generated: 0
  • Review effort level: Medium

@github-actions

Copy link
Copy Markdown
Contributor

🧪 Test quality grade — PR #9641

GradeTestNotes
B (80–89)mod HelpInfoAllExtensionsTests.
Help_
WithAllExtensionsRegistered_
OutputFullHelpContent
Strong snapshot assertions on full help output; ~200-line body exceeds the integration leniency threshold — split by extension group for narrower failure scope.
B (80–89)mod HelpInfoAllExtensionsTests.
Info_
WithAllExtensionsRegistered_
OutputFullInfoContent
Strong assertions on full info output; ~560-line snapshot exceeds the integration leniency threshold — split by extension group for narrower failure scope.
A (90–100)new GitHubActionsAnnotationReporterTests.
GetSkippedAnnotation_
EmitsTitleOnlyWarningWithReasonAndEscaping
No issues found.
A (90–100)new GitHubActionsAnnotationReporterTests.
GetSkippedAnnotation_
FallsBackToDefaultReason_
WhenNoExplanation
No issues found.

This advisory comment was generated automatically. Grades are heuristic
and informational — they do not block merging. Re-run with
/grade-tests.

🤖 Automated content by GitHub Copilot. Posted via a maintainer's GitHub token, so it appears under their account — the account owner did not write or approve this content personally. Generated by the Grade Tests on PR (on open / sync) workflow. · 87 AIC · ⌖ 10.7 AIC · ⊞ 9.5K · [◷]( · )

@github-actionsgithub-actionsBot 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.

Note

🤖 Automated review by GitHub Copilot. Posted via a maintainer's GitHub token, so it appears under their account — the account owner did not write or approve this content personally. Generated by the Expert Code Review workflow. To request a follow-up action, reply by tagging @copilot directly.

Summary

Clean implementation that follows established patterns. No blocking issues found.

✅ What looks good

  • Correctness: Skipped test handling is correctly placed in the failure is null branch of ConsumeAsync, wrapped by the existing try/catch for graceful degradation.
  • Escaping: Uses the same GitHubActionsEscaper.EscapeProperty/EscapeData pipeline as error annotations — unit tests confirm \n%0A and \r%0D handling.
  • API surface: GetSkippedAnnotation is internal static — no public API change; no PublicAPI.Unshipped.txt entry required.
  • Resources/XLF: New strings added correctly with format comments; UpdateXlf regenerated all 14 locale files. As a bonus, the regeneration incidentally fixes a pre-existing typo in pt-BR and zh-Hans XLFs (both had stale/incorrect source text for AnnotationsOptionDescription).
  • Testing: Two new unit tests covering explanation-present and null-explanation paths. Pattern is consistent with existing GetErrorAnnotation tests.
  • ConfigureAwait(false): Correctly applied on the new async path.

📝 Minor observations (non-blocking)

  1. Unrelated change: The .mcp.json deletion is bundled in this PR — not harmful, but ideally would be a separate commit for a cleaner history.
  2. GitHub annotation limit awareness: GitHub Actions silently caps annotations at ~10 per type per step. Suites with many skipped tests will see truncation on the Annotations tab. Not a code defect (the reporter can't work around it), but worth a note in PACKAGE.md if users report confusion in the future.

LGTM — no changes requested.

@Evangelink
Amaury Levé (Evangelink) merged commit 1604c5e into mainJul 5, 2026
42 checks passed
@Evangelink
Amaury Levé (Evangelink) deleted the dev/amauryleve/github-report-gaps branch July 5, 2026 20:51
Amaury Levé (Evangelink) added a commit that referenced this pull request Jul 5, 2026
… by @Evangelink in #9641 (backport to rel/4.3) (#9644)
Co-authored-by: Amaury Levé <amauryleve@microsoft.com>
Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
github-actionsBot added a commit that referenced this pull request Jul 6, 2026
Add a new ## G section with a GitHubActionsReport entry covering the
Microsoft.Testing.Extensions.GitHubActionsReport MTP extension. The
entry documents all four CLI features (log groups, failure/skip
annotations, job summary, slow-test notices), MSTest.Sdk opt-in,
and NativeAOT/VSTest limitations.
Identified from PR #9641 (weekly full scan, 2026-07-06).
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
github-actionsBot added a commit that referenced this pull request Jul 6, 2026
…ped-test warnings)
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Amaury Levé (Evangelink) added a commit that referenced this pull request Jul 7, 2026
Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
Amaury Levé (Evangelink) added a commit that referenced this pull request Jul 7, 2026
Reference PR #9541 (which introduced the extension) as the introduction,
and attribute the skipped-test ::warning annotations to PR #9641.
Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

state/needs-reviewAwaiting review from the team.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants

@Evangelink@0101
, '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

Emit ::warning annotations for skipped tests in GitHubActionsReport - #9641

Merged
Amaury Levé (Evangelink) merged 1 commit into
mainfrom
dev/amauryleve/github-report-gaps
Jul 5, 2026
Merged

Emit ::warning annotations for skipped tests in GitHubActionsReport#9641
Amaury Levé (Evangelink) merged 1 commit into
mainfrom
dev/amauryleve/github-report-gaps

Conversation

@Evangelink

Copy link
Copy Markdown
Member

What

Adds skipped-test annotations to Microsoft.Testing.Extensions.GitHubActionsReport. Previously, only failing tests produced ::error annotations; skipped tests were silently absent from the GitHub Actions Annotations tab. This change surfaces each skipped test as a title-only ::warning workflow command so intentionally/unexpectedly skipped tests are visible alongside failures.

Why

While assessing RFC #9003 against the shipped extension, this was the one clearly-scoped Tier 1 (no-auth, workflow-command) gap. The RFC explicitly lists "::warning … for skipped" in Tier 1. Tiers 2/3 (Check Runs and sticky PR comments via the GitHub API + GITHUB_TOKEN) remain a separate follow-up.

How

  • GitHubActionsAnnotationReporter now handles SkippedTestNodeStateProperty and emits a title-only ::warning (skipped nodes carry no exception/stack trace, so there is no file:line to pin to). Added a testable GetSkippedAnnotation helper mirroring GetErrorAnnotation.
  • Folded into the existing --report-gh-annotations knob (no new CLI option); broadened its description to "failed and skipped tests".
  • New resources SkippedAnnotationTitle / NoSkipReasonFallback; regenerated all 14 .xlf files via UpdateXlf.
  • Updated HelpInfoAllExtensionsTests (--help + --info) and PACKAGE.md to match.
  • Added unit tests for the reason and fallback paths.

Behavioral notes

::warning is purely informational in GitHub Actions — it does not affect step/job pass-fail (that's driven solely by the process exit code, which this reporter never touches). The reporter's ConsumeAsync is wrapped in try/catch that degrades to "no annotation" on any exception. The feature stays behind the --report-gh master switch (off by default) and the on-by-default --report-gh-annotations knob.

Verification

  • Extension + Microsoft.Testing.Extensions.UnitTests build clean (0 warnings/errors).
  • Full extensions unit-test suite passes on net9.0 (failed: 0), including the 2 new tests.

🤖 Assisted by GitHub Copilot CLI.

Skipped tests were previously invisible in the GitHub Actions Annotations tab. Surface them as title-only ::warning workflow commands under the existing --report-gh-annotations knob, mirroring the RFC #9003 Tier 1 design.
Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
CopilotAI review requested due to automatic review settings July 5, 2026 19:50
@EvangelinkAmaury Levé (Evangelink) added the state/needs-review Awaiting review from the team. label Jul 5, 2026
@Evangelink
Amaury Levé (Evangelink) enabled auto-merge (squash) July 5, 2026 19:51
@Evangelink

Copy link
Copy Markdown
MemberAuthor

/backport to rel/4.3

@github-actions

Copy link
Copy Markdown
Contributor

Started backporting to rel/4.3: https://github.com/microsoft/testfx/actions/runs/28752868353

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 Microsoft.Testing.Extensions.GitHubActionsReport so that skipped tests now surface in the GitHub Actions Annotations tab. Previously only failing tests produced ::error annotations; skipped tests were silently absent. This implements the clearly-scoped Tier 1 gap from RFC #9003 (::warning for skipped tests), while Tiers 2/3 (Check Runs / sticky PR comments needing GITHUB_TOKEN) remain follow-ups.

Changes:

  • GitHubActionsAnnotationReporter now handles SkippedTestNodeStateProperty and emits a title-only ::warning via a new testable GetSkippedAnnotation helper that mirrors GetErrorAnnotation.
  • Adds resources SkippedAnnotationTitle / NoSkipReasonFallback, regenerates all 13 .xlf files, and broadens the --report-gh-annotations description to cover "failed and skipped tests" (no new CLI option).
  • Updates unit tests, the HelpInfoAllExtensionsTests help/info expectations, PACKAGE.md, and the class doc comment.
Show a summary per file
FileDescription
GitHubActionsAnnotationReporter.csAdds skipped-test branch + WriteSkippedAnnotationAsync / GetSkippedAnnotation emitting title-only ::warning; updates doc comment
Resources/GitHubActionsResources.resxAdds SkippedAnnotationTitle / NoSkipReasonFallback; broadens annotations option description
Resources/xlf/*.xlf (13 files)Regenerated via UpdateXlf with the two new trans-units and updated option description (correct alphabetical id order)
GitHubActionsAnnotationReporterTests.csAdds two tests for the skipped-annotation reason and fallback paths, including escaping
HelpInfoAllExtensionsTests.csUpdates --help and --info expectations to the new option description
PACKAGE.mdDocuments skipped-test ::warning behavior and updates the options table row

The change is additive, well-scoped, and consistent with the existing failure-annotation path: both branches use the same GetTestName, newline-prepend, and escaping conventions. The unit tests match the existing "test the pure formatter helper" convention, help/info expectations are the only place the option description is asserted and are updated, and the .xlf regeneration preserves correct alphabetical id ordering. I found no objective issues.

Review details

  • Files reviewed: 18/18 changed files
  • Comments generated: 0
  • Review effort level: Medium

@github-actions

Copy link
Copy Markdown
Contributor

🧪 Test quality grade — PR #9641

GradeTestNotes
B (80–89)mod HelpInfoAllExtensionsTests.
Help_
WithAllExtensionsRegistered_
OutputFullHelpContent
Strong snapshot assertions on full help output; ~200-line body exceeds the integration leniency threshold — split by extension group for narrower failure scope.
B (80–89)mod HelpInfoAllExtensionsTests.
Info_
WithAllExtensionsRegistered_
OutputFullInfoContent
Strong assertions on full info output; ~560-line snapshot exceeds the integration leniency threshold — split by extension group for narrower failure scope.
A (90–100)new GitHubActionsAnnotationReporterTests.
GetSkippedAnnotation_
EmitsTitleOnlyWarningWithReasonAndEscaping
No issues found.
A (90–100)new GitHubActionsAnnotationReporterTests.
GetSkippedAnnotation_
FallsBackToDefaultReason_
WhenNoExplanation
No issues found.

This advisory comment was generated automatically. Grades are heuristic
and informational — they do not block merging. Re-run with
/grade-tests.

🤖 Automated content by GitHub Copilot. Posted via a maintainer's GitHub token, so it appears under their account — the account owner did not write or approve this content personally. Generated by the Grade Tests on PR (on open / sync) workflow. · 87 AIC · ⌖ 10.7 AIC · ⊞ 9.5K · [◷]( · )

@github-actionsgithub-actionsBot 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.

Note

🤖 Automated review by GitHub Copilot. Posted via a maintainer's GitHub token, so it appears under their account — the account owner did not write or approve this content personally. Generated by the Expert Code Review workflow. To request a follow-up action, reply by tagging @copilot directly.

Summary

Clean implementation that follows established patterns. No blocking issues found.

✅ What looks good

  • Correctness: Skipped test handling is correctly placed in the failure is null branch of ConsumeAsync, wrapped by the existing try/catch for graceful degradation.
  • Escaping: Uses the same GitHubActionsEscaper.EscapeProperty/EscapeData pipeline as error annotations — unit tests confirm \n%0A and \r%0D handling.
  • API surface: GetSkippedAnnotation is internal static — no public API change; no PublicAPI.Unshipped.txt entry required.
  • Resources/XLF: New strings added correctly with format comments; UpdateXlf regenerated all 14 locale files. As a bonus, the regeneration incidentally fixes a pre-existing typo in pt-BR and zh-Hans XLFs (both had stale/incorrect source text for AnnotationsOptionDescription).
  • Testing: Two new unit tests covering explanation-present and null-explanation paths. Pattern is consistent with existing GetErrorAnnotation tests.
  • ConfigureAwait(false): Correctly applied on the new async path.

📝 Minor observations (non-blocking)

  1. Unrelated change: The .mcp.json deletion is bundled in this PR — not harmful, but ideally would be a separate commit for a cleaner history.
  2. GitHub annotation limit awareness: GitHub Actions silently caps annotations at ~10 per type per step. Suites with many skipped tests will see truncation on the Annotations tab. Not a code defect (the reporter can't work around it), but worth a note in PACKAGE.md if users report confusion in the future.

LGTM — no changes requested.

@Evangelink
Amaury Levé (Evangelink) merged commit 1604c5e into mainJul 5, 2026
42 checks passed
@Evangelink
Amaury Levé (Evangelink) deleted the dev/amauryleve/github-report-gaps branch July 5, 2026 20:51
Amaury Levé (Evangelink) added a commit that referenced this pull request Jul 5, 2026
… by @Evangelink in #9641 (backport to rel/4.3) (#9644)
Co-authored-by: Amaury Levé <amauryleve@microsoft.com>
Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
github-actionsBot added a commit that referenced this pull request Jul 6, 2026
Add a new ## G section with a GitHubActionsReport entry covering the
Microsoft.Testing.Extensions.GitHubActionsReport MTP extension. The
entry documents all four CLI features (log groups, failure/skip
annotations, job summary, slow-test notices), MSTest.Sdk opt-in,
and NativeAOT/VSTest limitations.
Identified from PR #9641 (weekly full scan, 2026-07-06).
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
github-actionsBot added a commit that referenced this pull request Jul 6, 2026
…ped-test warnings)
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Amaury Levé (Evangelink) added a commit that referenced this pull request Jul 7, 2026
Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
Amaury Levé (Evangelink) added a commit that referenced this pull request Jul 7, 2026
Reference PR #9541 (which introduced the extension) as the introduction,
and attribute the skipped-test ::warning annotations to PR #9641.
Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

state/needs-reviewAwaiting review from the team.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants

@Evangelink@0101
, '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

Emit ::warning annotations for skipped tests in GitHubActionsReport - #9641

Merged
Amaury Levé (Evangelink) merged 1 commit into
mainfrom
dev/amauryleve/github-report-gaps
Jul 5, 2026
Merged

Emit ::warning annotations for skipped tests in GitHubActionsReport#9641
Amaury Levé (Evangelink) merged 1 commit into
mainfrom
dev/amauryleve/github-report-gaps

Conversation

@Evangelink

Copy link
Copy Markdown
Member

What

Adds skipped-test annotations to Microsoft.Testing.Extensions.GitHubActionsReport. Previously, only failing tests produced ::error annotations; skipped tests were silently absent from the GitHub Actions Annotations tab. This change surfaces each skipped test as a title-only ::warning workflow command so intentionally/unexpectedly skipped tests are visible alongside failures.

Why

While assessing RFC #9003 against the shipped extension, this was the one clearly-scoped Tier 1 (no-auth, workflow-command) gap. The RFC explicitly lists "::warning … for skipped" in Tier 1. Tiers 2/3 (Check Runs and sticky PR comments via the GitHub API + GITHUB_TOKEN) remain a separate follow-up.

How

  • GitHubActionsAnnotationReporter now handles SkippedTestNodeStateProperty and emits a title-only ::warning (skipped nodes carry no exception/stack trace, so there is no file:line to pin to). Added a testable GetSkippedAnnotation helper mirroring GetErrorAnnotation.
  • Folded into the existing --report-gh-annotations knob (no new CLI option); broadened its description to "failed and skipped tests".
  • New resources SkippedAnnotationTitle / NoSkipReasonFallback; regenerated all 14 .xlf files via UpdateXlf.
  • Updated HelpInfoAllExtensionsTests (--help + --info) and PACKAGE.md to match.
  • Added unit tests for the reason and fallback paths.

Behavioral notes

::warning is purely informational in GitHub Actions — it does not affect step/job pass-fail (that's driven solely by the process exit code, which this reporter never touches). The reporter's ConsumeAsync is wrapped in try/catch that degrades to "no annotation" on any exception. The feature stays behind the --report-gh master switch (off by default) and the on-by-default --report-gh-annotations knob.

Verification

  • Extension + Microsoft.Testing.Extensions.UnitTests build clean (0 warnings/errors).
  • Full extensions unit-test suite passes on net9.0 (failed: 0), including the 2 new tests.

🤖 Assisted by GitHub Copilot CLI.

Skipped tests were previously invisible in the GitHub Actions Annotations tab. Surface them as title-only ::warning workflow commands under the existing --report-gh-annotations knob, mirroring the RFC #9003 Tier 1 design.
Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
CopilotAI review requested due to automatic review settings July 5, 2026 19:50
@EvangelinkAmaury Levé (Evangelink) added the state/needs-review Awaiting review from the team. label Jul 5, 2026
@Evangelink
Amaury Levé (Evangelink) enabled auto-merge (squash) July 5, 2026 19:51
@Evangelink

Copy link
Copy Markdown
MemberAuthor

/backport to rel/4.3

@github-actions

Copy link
Copy Markdown
Contributor

Started backporting to rel/4.3: https://github.com/microsoft/testfx/actions/runs/28752868353

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 Microsoft.Testing.Extensions.GitHubActionsReport so that skipped tests now surface in the GitHub Actions Annotations tab. Previously only failing tests produced ::error annotations; skipped tests were silently absent. This implements the clearly-scoped Tier 1 gap from RFC #9003 (::warning for skipped tests), while Tiers 2/3 (Check Runs / sticky PR comments needing GITHUB_TOKEN) remain follow-ups.

Changes:

  • GitHubActionsAnnotationReporter now handles SkippedTestNodeStateProperty and emits a title-only ::warning via a new testable GetSkippedAnnotation helper that mirrors GetErrorAnnotation.
  • Adds resources SkippedAnnotationTitle / NoSkipReasonFallback, regenerates all 13 .xlf files, and broadens the --report-gh-annotations description to cover "failed and skipped tests" (no new CLI option).
  • Updates unit tests, the HelpInfoAllExtensionsTests help/info expectations, PACKAGE.md, and the class doc comment.
Show a summary per file
FileDescription
GitHubActionsAnnotationReporter.csAdds skipped-test branch + WriteSkippedAnnotationAsync / GetSkippedAnnotation emitting title-only ::warning; updates doc comment
Resources/GitHubActionsResources.resxAdds SkippedAnnotationTitle / NoSkipReasonFallback; broadens annotations option description
Resources/xlf/*.xlf (13 files)Regenerated via UpdateXlf with the two new trans-units and updated option description (correct alphabetical id order)
GitHubActionsAnnotationReporterTests.csAdds two tests for the skipped-annotation reason and fallback paths, including escaping
HelpInfoAllExtensionsTests.csUpdates --help and --info expectations to the new option description
PACKAGE.mdDocuments skipped-test ::warning behavior and updates the options table row

The change is additive, well-scoped, and consistent with the existing failure-annotation path: both branches use the same GetTestName, newline-prepend, and escaping conventions. The unit tests match the existing "test the pure formatter helper" convention, help/info expectations are the only place the option description is asserted and are updated, and the .xlf regeneration preserves correct alphabetical id ordering. I found no objective issues.

Review details

  • Files reviewed: 18/18 changed files
  • Comments generated: 0
  • Review effort level: Medium

@github-actions

Copy link
Copy Markdown
Contributor

🧪 Test quality grade — PR #9641

GradeTestNotes
B (80–89)mod HelpInfoAllExtensionsTests.
Help_
WithAllExtensionsRegistered_
OutputFullHelpContent
Strong snapshot assertions on full help output; ~200-line body exceeds the integration leniency threshold — split by extension group for narrower failure scope.
B (80–89)mod HelpInfoAllExtensionsTests.
Info_
WithAllExtensionsRegistered_
OutputFullInfoContent
Strong assertions on full info output; ~560-line snapshot exceeds the integration leniency threshold — split by extension group for narrower failure scope.
A (90–100)new GitHubActionsAnnotationReporterTests.
GetSkippedAnnotation_
EmitsTitleOnlyWarningWithReasonAndEscaping
No issues found.
A (90–100)new GitHubActionsAnnotationReporterTests.
GetSkippedAnnotation_
FallsBackToDefaultReason_
WhenNoExplanation
No issues found.

This advisory comment was generated automatically. Grades are heuristic
and informational — they do not block merging. Re-run with
/grade-tests.

🤖 Automated content by GitHub Copilot. Posted via a maintainer's GitHub token, so it appears under their account — the account owner did not write or approve this content personally. Generated by the Grade Tests on PR (on open / sync) workflow. · 87 AIC · ⌖ 10.7 AIC · ⊞ 9.5K · [◷]( · )

@github-actionsgithub-actionsBot 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.

Note

🤖 Automated review by GitHub Copilot. Posted via a maintainer's GitHub token, so it appears under their account — the account owner did not write or approve this content personally. Generated by the Expert Code Review workflow. To request a follow-up action, reply by tagging @copilot directly.

Summary

Clean implementation that follows established patterns. No blocking issues found.

✅ What looks good

  • Correctness: Skipped test handling is correctly placed in the failure is null branch of ConsumeAsync, wrapped by the existing try/catch for graceful degradation.
  • Escaping: Uses the same GitHubActionsEscaper.EscapeProperty/EscapeData pipeline as error annotations — unit tests confirm \n%0A and \r%0D handling.
  • API surface: GetSkippedAnnotation is internal static — no public API change; no PublicAPI.Unshipped.txt entry required.
  • Resources/XLF: New strings added correctly with format comments; UpdateXlf regenerated all 14 locale files. As a bonus, the regeneration incidentally fixes a pre-existing typo in pt-BR and zh-Hans XLFs (both had stale/incorrect source text for AnnotationsOptionDescription).
  • Testing: Two new unit tests covering explanation-present and null-explanation paths. Pattern is consistent with existing GetErrorAnnotation tests.
  • ConfigureAwait(false): Correctly applied on the new async path.

📝 Minor observations (non-blocking)

  1. Unrelated change: The .mcp.json deletion is bundled in this PR — not harmful, but ideally would be a separate commit for a cleaner history.
  2. GitHub annotation limit awareness: GitHub Actions silently caps annotations at ~10 per type per step. Suites with many skipped tests will see truncation on the Annotations tab. Not a code defect (the reporter can't work around it), but worth a note in PACKAGE.md if users report confusion in the future.

LGTM — no changes requested.

@Evangelink
Amaury Levé (Evangelink) merged commit 1604c5e into mainJul 5, 2026
42 checks passed
@Evangelink
Amaury Levé (Evangelink) deleted the dev/amauryleve/github-report-gaps branch July 5, 2026 20:51
Amaury Levé (Evangelink) added a commit that referenced this pull request Jul 5, 2026
… by @Evangelink in #9641 (backport to rel/4.3) (#9644)
Co-authored-by: Amaury Levé <amauryleve@microsoft.com>
Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
github-actionsBot added a commit that referenced this pull request Jul 6, 2026
Add a new ## G section with a GitHubActionsReport entry covering the
Microsoft.Testing.Extensions.GitHubActionsReport MTP extension. The
entry documents all four CLI features (log groups, failure/skip
annotations, job summary, slow-test notices), MSTest.Sdk opt-in,
and NativeAOT/VSTest limitations.
Identified from PR #9641 (weekly full scan, 2026-07-06).
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
github-actionsBot added a commit that referenced this pull request Jul 6, 2026
…ped-test warnings)
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Amaury Levé (Evangelink) added a commit that referenced this pull request Jul 7, 2026
Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
Amaury Levé (Evangelink) added a commit that referenced this pull request Jul 7, 2026
Reference PR #9541 (which introduced the extension) as the introduction,
and attribute the skipped-test ::warning annotations to PR #9641.
Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

state/needs-reviewAwaiting review from the team.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants

@Evangelink@0101
, '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

Emit ::warning annotations for skipped tests in GitHubActionsReport - #9641

Merged
Amaury Levé (Evangelink) merged 1 commit into
mainfrom
dev/amauryleve/github-report-gaps
Jul 5, 2026
Merged

Emit ::warning annotations for skipped tests in GitHubActionsReport#9641
Amaury Levé (Evangelink) merged 1 commit into
mainfrom
dev/amauryleve/github-report-gaps

Conversation

@Evangelink

Copy link
Copy Markdown
Member

What

Adds skipped-test annotations to Microsoft.Testing.Extensions.GitHubActionsReport. Previously, only failing tests produced ::error annotations; skipped tests were silently absent from the GitHub Actions Annotations tab. This change surfaces each skipped test as a title-only ::warning workflow command so intentionally/unexpectedly skipped tests are visible alongside failures.

Why

While assessing RFC #9003 against the shipped extension, this was the one clearly-scoped Tier 1 (no-auth, workflow-command) gap. The RFC explicitly lists "::warning … for skipped" in Tier 1. Tiers 2/3 (Check Runs and sticky PR comments via the GitHub API + GITHUB_TOKEN) remain a separate follow-up.

How

  • GitHubActionsAnnotationReporter now handles SkippedTestNodeStateProperty and emits a title-only ::warning (skipped nodes carry no exception/stack trace, so there is no file:line to pin to). Added a testable GetSkippedAnnotation helper mirroring GetErrorAnnotation.
  • Folded into the existing --report-gh-annotations knob (no new CLI option); broadened its description to "failed and skipped tests".
  • New resources SkippedAnnotationTitle / NoSkipReasonFallback; regenerated all 14 .xlf files via UpdateXlf.
  • Updated HelpInfoAllExtensionsTests (--help + --info) and PACKAGE.md to match.
  • Added unit tests for the reason and fallback paths.

Behavioral notes

::warning is purely informational in GitHub Actions — it does not affect step/job pass-fail (that's driven solely by the process exit code, which this reporter never touches). The reporter's ConsumeAsync is wrapped in try/catch that degrades to "no annotation" on any exception. The feature stays behind the --report-gh master switch (off by default) and the on-by-default --report-gh-annotations knob.

Verification

  • Extension + Microsoft.Testing.Extensions.UnitTests build clean (0 warnings/errors).
  • Full extensions unit-test suite passes on net9.0 (failed: 0), including the 2 new tests.

🤖 Assisted by GitHub Copilot CLI.

Skipped tests were previously invisible in the GitHub Actions Annotations tab. Surface them as title-only ::warning workflow commands under the existing --report-gh-annotations knob, mirroring the RFC #9003 Tier 1 design.
Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
CopilotAI review requested due to automatic review settings July 5, 2026 19:50
@EvangelinkAmaury Levé (Evangelink) added the state/needs-review Awaiting review from the team. label Jul 5, 2026
@Evangelink
Amaury Levé (Evangelink) enabled auto-merge (squash) July 5, 2026 19:51
@Evangelink

Copy link
Copy Markdown
MemberAuthor

/backport to rel/4.3

@github-actions

Copy link
Copy Markdown
Contributor

Started backporting to rel/4.3: https://github.com/microsoft/testfx/actions/runs/28752868353

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 Microsoft.Testing.Extensions.GitHubActionsReport so that skipped tests now surface in the GitHub Actions Annotations tab. Previously only failing tests produced ::error annotations; skipped tests were silently absent. This implements the clearly-scoped Tier 1 gap from RFC #9003 (::warning for skipped tests), while Tiers 2/3 (Check Runs / sticky PR comments needing GITHUB_TOKEN) remain follow-ups.

Changes:

  • GitHubActionsAnnotationReporter now handles SkippedTestNodeStateProperty and emits a title-only ::warning via a new testable GetSkippedAnnotation helper that mirrors GetErrorAnnotation.
  • Adds resources SkippedAnnotationTitle / NoSkipReasonFallback, regenerates all 13 .xlf files, and broadens the --report-gh-annotations description to cover "failed and skipped tests" (no new CLI option).
  • Updates unit tests, the HelpInfoAllExtensionsTests help/info expectations, PACKAGE.md, and the class doc comment.
Show a summary per file
FileDescription
GitHubActionsAnnotationReporter.csAdds skipped-test branch + WriteSkippedAnnotationAsync / GetSkippedAnnotation emitting title-only ::warning; updates doc comment
Resources/GitHubActionsResources.resxAdds SkippedAnnotationTitle / NoSkipReasonFallback; broadens annotations option description
Resources/xlf/*.xlf (13 files)Regenerated via UpdateXlf with the two new trans-units and updated option description (correct alphabetical id order)
GitHubActionsAnnotationReporterTests.csAdds two tests for the skipped-annotation reason and fallback paths, including escaping
HelpInfoAllExtensionsTests.csUpdates --help and --info expectations to the new option description
PACKAGE.mdDocuments skipped-test ::warning behavior and updates the options table row

The change is additive, well-scoped, and consistent with the existing failure-annotation path: both branches use the same GetTestName, newline-prepend, and escaping conventions. The unit tests match the existing "test the pure formatter helper" convention, help/info expectations are the only place the option description is asserted and are updated, and the .xlf regeneration preserves correct alphabetical id ordering. I found no objective issues.

Review details

  • Files reviewed: 18/18 changed files
  • Comments generated: 0
  • Review effort level: Medium

@github-actions

Copy link
Copy Markdown
Contributor

🧪 Test quality grade — PR #9641

GradeTestNotes
B (80–89)mod HelpInfoAllExtensionsTests.
Help_
WithAllExtensionsRegistered_
OutputFullHelpContent
Strong snapshot assertions on full help output; ~200-line body exceeds the integration leniency threshold — split by extension group for narrower failure scope.
B (80–89)mod HelpInfoAllExtensionsTests.
Info_
WithAllExtensionsRegistered_
OutputFullInfoContent
Strong assertions on full info output; ~560-line snapshot exceeds the integration leniency threshold — split by extension group for narrower failure scope.
A (90–100)new GitHubActionsAnnotationReporterTests.
GetSkippedAnnotation_
EmitsTitleOnlyWarningWithReasonAndEscaping
No issues found.
A (90–100)new GitHubActionsAnnotationReporterTests.
GetSkippedAnnotation_
FallsBackToDefaultReason_
WhenNoExplanation
No issues found.

This advisory comment was generated automatically. Grades are heuristic
and informational — they do not block merging. Re-run with
/grade-tests.

🤖 Automated content by GitHub Copilot. Posted via a maintainer's GitHub token, so it appears under their account — the account owner did not write or approve this content personally. Generated by the Grade Tests on PR (on open / sync) workflow. · 87 AIC · ⌖ 10.7 AIC · ⊞ 9.5K · [◷]( · )

@github-actionsgithub-actionsBot 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.

Note

🤖 Automated review by GitHub Copilot. Posted via a maintainer's GitHub token, so it appears under their account — the account owner did not write or approve this content personally. Generated by the Expert Code Review workflow. To request a follow-up action, reply by tagging @copilot directly.

Summary

Clean implementation that follows established patterns. No blocking issues found.

✅ What looks good

  • Correctness: Skipped test handling is correctly placed in the failure is null branch of ConsumeAsync, wrapped by the existing try/catch for graceful degradation.
  • Escaping: Uses the same GitHubActionsEscaper.EscapeProperty/EscapeData pipeline as error annotations — unit tests confirm \n%0A and \r%0D handling.
  • API surface: GetSkippedAnnotation is internal static — no public API change; no PublicAPI.Unshipped.txt entry required.
  • Resources/XLF: New strings added correctly with format comments; UpdateXlf regenerated all 14 locale files. As a bonus, the regeneration incidentally fixes a pre-existing typo in pt-BR and zh-Hans XLFs (both had stale/incorrect source text for AnnotationsOptionDescription).
  • Testing: Two new unit tests covering explanation-present and null-explanation paths. Pattern is consistent with existing GetErrorAnnotation tests.
  • ConfigureAwait(false): Correctly applied on the new async path.

📝 Minor observations (non-blocking)

  1. Unrelated change: The .mcp.json deletion is bundled in this PR — not harmful, but ideally would be a separate commit for a cleaner history.
  2. GitHub annotation limit awareness: GitHub Actions silently caps annotations at ~10 per type per step. Suites with many skipped tests will see truncation on the Annotations tab. Not a code defect (the reporter can't work around it), but worth a note in PACKAGE.md if users report confusion in the future.

LGTM — no changes requested.

@Evangelink
Amaury Levé (Evangelink) merged commit 1604c5e into mainJul 5, 2026
42 checks passed
@Evangelink
Amaury Levé (Evangelink) deleted the dev/amauryleve/github-report-gaps branch July 5, 2026 20:51
Amaury Levé (Evangelink) added a commit that referenced this pull request Jul 5, 2026
… by @Evangelink in #9641 (backport to rel/4.3) (#9644)
Co-authored-by: Amaury Levé <amauryleve@microsoft.com>
Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
github-actionsBot added a commit that referenced this pull request Jul 6, 2026
Add a new ## G section with a GitHubActionsReport entry covering the
Microsoft.Testing.Extensions.GitHubActionsReport MTP extension. The
entry documents all four CLI features (log groups, failure/skip
annotations, job summary, slow-test notices), MSTest.Sdk opt-in,
and NativeAOT/VSTest limitations.
Identified from PR #9641 (weekly full scan, 2026-07-06).
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
github-actionsBot added a commit that referenced this pull request Jul 6, 2026
…ped-test warnings)
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Amaury Levé (Evangelink) added a commit that referenced this pull request Jul 7, 2026
Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
Amaury Levé (Evangelink) added a commit that referenced this pull request Jul 7, 2026
Reference PR #9541 (which introduced the extension) as the introduction,
and attribute the skipped-test ::warning annotations to PR #9641.
Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

state/needs-reviewAwaiting review from the team.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants

@Evangelink@0101
, '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

Emit ::warning annotations for skipped tests in GitHubActionsReport - #9641

Merged
Amaury Levé (Evangelink) merged 1 commit into
mainfrom
dev/amauryleve/github-report-gaps
Jul 5, 2026
Merged

Emit ::warning annotations for skipped tests in GitHubActionsReport#9641
Amaury Levé (Evangelink) merged 1 commit into
mainfrom
dev/amauryleve/github-report-gaps

Conversation

@Evangelink

Copy link
Copy Markdown
Member

What

Adds skipped-test annotations to Microsoft.Testing.Extensions.GitHubActionsReport. Previously, only failing tests produced ::error annotations; skipped tests were silently absent from the GitHub Actions Annotations tab. This change surfaces each skipped test as a title-only ::warning workflow command so intentionally/unexpectedly skipped tests are visible alongside failures.

Why

While assessing RFC #9003 against the shipped extension, this was the one clearly-scoped Tier 1 (no-auth, workflow-command) gap. The RFC explicitly lists "::warning … for skipped" in Tier 1. Tiers 2/3 (Check Runs and sticky PR comments via the GitHub API + GITHUB_TOKEN) remain a separate follow-up.

How

  • GitHubActionsAnnotationReporter now handles SkippedTestNodeStateProperty and emits a title-only ::warning (skipped nodes carry no exception/stack trace, so there is no file:line to pin to). Added a testable GetSkippedAnnotation helper mirroring GetErrorAnnotation.
  • Folded into the existing --report-gh-annotations knob (no new CLI option); broadened its description to "failed and skipped tests".
  • New resources SkippedAnnotationTitle / NoSkipReasonFallback; regenerated all 14 .xlf files via UpdateXlf.
  • Updated HelpInfoAllExtensionsTests (--help + --info) and PACKAGE.md to match.
  • Added unit tests for the reason and fallback paths.

Behavioral notes

::warning is purely informational in GitHub Actions — it does not affect step/job pass-fail (that's driven solely by the process exit code, which this reporter never touches). The reporter's ConsumeAsync is wrapped in try/catch that degrades to "no annotation" on any exception. The feature stays behind the --report-gh master switch (off by default) and the on-by-default --report-gh-annotations knob.

Verification

  • Extension + Microsoft.Testing.Extensions.UnitTests build clean (0 warnings/errors).
  • Full extensions unit-test suite passes on net9.0 (failed: 0), including the 2 new tests.

🤖 Assisted by GitHub Copilot CLI.

Skipped tests were previously invisible in the GitHub Actions Annotations tab. Surface them as title-only ::warning workflow commands under the existing --report-gh-annotations knob, mirroring the RFC #9003 Tier 1 design.
Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
CopilotAI review requested due to automatic review settings July 5, 2026 19:50
@EvangelinkAmaury Levé (Evangelink) added the state/needs-review Awaiting review from the team. label Jul 5, 2026
@Evangelink
Amaury Levé (Evangelink) enabled auto-merge (squash) July 5, 2026 19:51
@Evangelink

Copy link
Copy Markdown
MemberAuthor

/backport to rel/4.3

@github-actions

Copy link
Copy Markdown
Contributor

Started backporting to rel/4.3: https://github.com/microsoft/testfx/actions/runs/28752868353

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 Microsoft.Testing.Extensions.GitHubActionsReport so that skipped tests now surface in the GitHub Actions Annotations tab. Previously only failing tests produced ::error annotations; skipped tests were silently absent. This implements the clearly-scoped Tier 1 gap from RFC #9003 (::warning for skipped tests), while Tiers 2/3 (Check Runs / sticky PR comments needing GITHUB_TOKEN) remain follow-ups.

Changes:

  • GitHubActionsAnnotationReporter now handles SkippedTestNodeStateProperty and emits a title-only ::warning via a new testable GetSkippedAnnotation helper that mirrors GetErrorAnnotation.
  • Adds resources SkippedAnnotationTitle / NoSkipReasonFallback, regenerates all 13 .xlf files, and broadens the --report-gh-annotations description to cover "failed and skipped tests" (no new CLI option).
  • Updates unit tests, the HelpInfoAllExtensionsTests help/info expectations, PACKAGE.md, and the class doc comment.
Show a summary per file
FileDescription
GitHubActionsAnnotationReporter.csAdds skipped-test branch + WriteSkippedAnnotationAsync / GetSkippedAnnotation emitting title-only ::warning; updates doc comment
Resources/GitHubActionsResources.resxAdds SkippedAnnotationTitle / NoSkipReasonFallback; broadens annotations option description
Resources/xlf/*.xlf (13 files)Regenerated via UpdateXlf with the two new trans-units and updated option description (correct alphabetical id order)
GitHubActionsAnnotationReporterTests.csAdds two tests for the skipped-annotation reason and fallback paths, including escaping
HelpInfoAllExtensionsTests.csUpdates --help and --info expectations to the new option description
PACKAGE.mdDocuments skipped-test ::warning behavior and updates the options table row

The change is additive, well-scoped, and consistent with the existing failure-annotation path: both branches use the same GetTestName, newline-prepend, and escaping conventions. The unit tests match the existing "test the pure formatter helper" convention, help/info expectations are the only place the option description is asserted and are updated, and the .xlf regeneration preserves correct alphabetical id ordering. I found no objective issues.

Review details

  • Files reviewed: 18/18 changed files
  • Comments generated: 0
  • Review effort level: Medium

@github-actions

Copy link
Copy Markdown
Contributor

🧪 Test quality grade — PR #9641

GradeTestNotes
B (80–89)mod HelpInfoAllExtensionsTests.
Help_
WithAllExtensionsRegistered_
OutputFullHelpContent
Strong snapshot assertions on full help output; ~200-line body exceeds the integration leniency threshold — split by extension group for narrower failure scope.
B (80–89)mod HelpInfoAllExtensionsTests.
Info_
WithAllExtensionsRegistered_
OutputFullInfoContent
Strong assertions on full info output; ~560-line snapshot exceeds the integration leniency threshold — split by extension group for narrower failure scope.
A (90–100)new GitHubActionsAnnotationReporterTests.
GetSkippedAnnotation_
EmitsTitleOnlyWarningWithReasonAndEscaping
No issues found.
A (90–100)new GitHubActionsAnnotationReporterTests.
GetSkippedAnnotation_
FallsBackToDefaultReason_
WhenNoExplanation
No issues found.

This advisory comment was generated automatically. Grades are heuristic
and informational — they do not block merging. Re-run with
/grade-tests.

🤖 Automated content by GitHub Copilot. Posted via a maintainer's GitHub token, so it appears under their account — the account owner did not write or approve this content personally. Generated by the Grade Tests on PR (on open / sync) workflow. · 87 AIC · ⌖ 10.7 AIC · ⊞ 9.5K · [◷]( · )

@github-actionsgithub-actionsBot 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.

Note

🤖 Automated review by GitHub Copilot. Posted via a maintainer's GitHub token, so it appears under their account — the account owner did not write or approve this content personally. Generated by the Expert Code Review workflow. To request a follow-up action, reply by tagging @copilot directly.

Summary

Clean implementation that follows established patterns. No blocking issues found.

✅ What looks good

  • Correctness: Skipped test handling is correctly placed in the failure is null branch of ConsumeAsync, wrapped by the existing try/catch for graceful degradation.
  • Escaping: Uses the same GitHubActionsEscaper.EscapeProperty/EscapeData pipeline as error annotations — unit tests confirm \n%0A and \r%0D handling.
  • API surface: GetSkippedAnnotation is internal static — no public API change; no PublicAPI.Unshipped.txt entry required.
  • Resources/XLF: New strings added correctly with format comments; UpdateXlf regenerated all 14 locale files. As a bonus, the regeneration incidentally fixes a pre-existing typo in pt-BR and zh-Hans XLFs (both had stale/incorrect source text for AnnotationsOptionDescription).
  • Testing: Two new unit tests covering explanation-present and null-explanation paths. Pattern is consistent with existing GetErrorAnnotation tests.
  • ConfigureAwait(false): Correctly applied on the new async path.

📝 Minor observations (non-blocking)

  1. Unrelated change: The .mcp.json deletion is bundled in this PR — not harmful, but ideally would be a separate commit for a cleaner history.
  2. GitHub annotation limit awareness: GitHub Actions silently caps annotations at ~10 per type per step. Suites with many skipped tests will see truncation on the Annotations tab. Not a code defect (the reporter can't work around it), but worth a note in PACKAGE.md if users report confusion in the future.

LGTM — no changes requested.

@Evangelink
Amaury Levé (Evangelink) merged commit 1604c5e into mainJul 5, 2026
42 checks passed
@Evangelink
Amaury Levé (Evangelink) deleted the dev/amauryleve/github-report-gaps branch July 5, 2026 20:51
Amaury Levé (Evangelink) added a commit that referenced this pull request Jul 5, 2026
… by @Evangelink in #9641 (backport to rel/4.3) (#9644)
Co-authored-by: Amaury Levé <amauryleve@microsoft.com>
Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
github-actionsBot added a commit that referenced this pull request Jul 6, 2026
Add a new ## G section with a GitHubActionsReport entry covering the
Microsoft.Testing.Extensions.GitHubActionsReport MTP extension. The
entry documents all four CLI features (log groups, failure/skip
annotations, job summary, slow-test notices), MSTest.Sdk opt-in,
and NativeAOT/VSTest limitations.
Identified from PR #9641 (weekly full scan, 2026-07-06).
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
github-actionsBot added a commit that referenced this pull request Jul 6, 2026
…ped-test warnings)
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Amaury Levé (Evangelink) added a commit that referenced this pull request Jul 7, 2026
Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
Amaury Levé (Evangelink) added a commit that referenced this pull request Jul 7, 2026
Reference PR #9541 (which introduced the extension) as the introduction,
and attribute the skipped-test ::warning annotations to PR #9641.
Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

state/needs-reviewAwaiting review from the team.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants

@Evangelink@0101
, '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

Emit ::warning annotations for skipped tests in GitHubActionsReport - #9641

Merged
Amaury Levé (Evangelink) merged 1 commit into
mainfrom
dev/amauryleve/github-report-gaps
Jul 5, 2026
Merged

Emit ::warning annotations for skipped tests in GitHubActionsReport#9641
Amaury Levé (Evangelink) merged 1 commit into
mainfrom
dev/amauryleve/github-report-gaps

Conversation

@Evangelink

Copy link
Copy Markdown
Member

What

Adds skipped-test annotations to Microsoft.Testing.Extensions.GitHubActionsReport. Previously, only failing tests produced ::error annotations; skipped tests were silently absent from the GitHub Actions Annotations tab. This change surfaces each skipped test as a title-only ::warning workflow command so intentionally/unexpectedly skipped tests are visible alongside failures.

Why

While assessing RFC #9003 against the shipped extension, this was the one clearly-scoped Tier 1 (no-auth, workflow-command) gap. The RFC explicitly lists "::warning … for skipped" in Tier 1. Tiers 2/3 (Check Runs and sticky PR comments via the GitHub API + GITHUB_TOKEN) remain a separate follow-up.

How

  • GitHubActionsAnnotationReporter now handles SkippedTestNodeStateProperty and emits a title-only ::warning (skipped nodes carry no exception/stack trace, so there is no file:line to pin to). Added a testable GetSkippedAnnotation helper mirroring GetErrorAnnotation.
  • Folded into the existing --report-gh-annotations knob (no new CLI option); broadened its description to "failed and skipped tests".
  • New resources SkippedAnnotationTitle / NoSkipReasonFallback; regenerated all 14 .xlf files via UpdateXlf.
  • Updated HelpInfoAllExtensionsTests (--help + --info) and PACKAGE.md to match.
  • Added unit tests for the reason and fallback paths.

Behavioral notes

::warning is purely informational in GitHub Actions — it does not affect step/job pass-fail (that's driven solely by the process exit code, which this reporter never touches). The reporter's ConsumeAsync is wrapped in try/catch that degrades to "no annotation" on any exception. The feature stays behind the --report-gh master switch (off by default) and the on-by-default --report-gh-annotations knob.

Verification

  • Extension + Microsoft.Testing.Extensions.UnitTests build clean (0 warnings/errors).
  • Full extensions unit-test suite passes on net9.0 (failed: 0), including the 2 new tests.

🤖 Assisted by GitHub Copilot CLI.

Skipped tests were previously invisible in the GitHub Actions Annotations tab. Surface them as title-only ::warning workflow commands under the existing --report-gh-annotations knob, mirroring the RFC #9003 Tier 1 design.
Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
CopilotAI review requested due to automatic review settings July 5, 2026 19:50
@EvangelinkAmaury Levé (Evangelink) added the state/needs-review Awaiting review from the team. label Jul 5, 2026
@Evangelink
Amaury Levé (Evangelink) enabled auto-merge (squash) July 5, 2026 19:51
@Evangelink

Copy link
Copy Markdown
MemberAuthor

/backport to rel/4.3

@github-actions

Copy link
Copy Markdown
Contributor

Started backporting to rel/4.3: https://github.com/microsoft/testfx/actions/runs/28752868353

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 Microsoft.Testing.Extensions.GitHubActionsReport so that skipped tests now surface in the GitHub Actions Annotations tab. Previously only failing tests produced ::error annotations; skipped tests were silently absent. This implements the clearly-scoped Tier 1 gap from RFC #9003 (::warning for skipped tests), while Tiers 2/3 (Check Runs / sticky PR comments needing GITHUB_TOKEN) remain follow-ups.

Changes:

  • GitHubActionsAnnotationReporter now handles SkippedTestNodeStateProperty and emits a title-only ::warning via a new testable GetSkippedAnnotation helper that mirrors GetErrorAnnotation.
  • Adds resources SkippedAnnotationTitle / NoSkipReasonFallback, regenerates all 13 .xlf files, and broadens the --report-gh-annotations description to cover "failed and skipped tests" (no new CLI option).
  • Updates unit tests, the HelpInfoAllExtensionsTests help/info expectations, PACKAGE.md, and the class doc comment.
Show a summary per file
FileDescription
GitHubActionsAnnotationReporter.csAdds skipped-test branch + WriteSkippedAnnotationAsync / GetSkippedAnnotation emitting title-only ::warning; updates doc comment
Resources/GitHubActionsResources.resxAdds SkippedAnnotationTitle / NoSkipReasonFallback; broadens annotations option description
Resources/xlf/*.xlf (13 files)Regenerated via UpdateXlf with the two new trans-units and updated option description (correct alphabetical id order)
GitHubActionsAnnotationReporterTests.csAdds two tests for the skipped-annotation reason and fallback paths, including escaping
HelpInfoAllExtensionsTests.csUpdates --help and --info expectations to the new option description
PACKAGE.mdDocuments skipped-test ::warning behavior and updates the options table row

The change is additive, well-scoped, and consistent with the existing failure-annotation path: both branches use the same GetTestName, newline-prepend, and escaping conventions. The unit tests match the existing "test the pure formatter helper" convention, help/info expectations are the only place the option description is asserted and are updated, and the .xlf regeneration preserves correct alphabetical id ordering. I found no objective issues.

Review details

  • Files reviewed: 18/18 changed files
  • Comments generated: 0
  • Review effort level: Medium

@github-actions

Copy link
Copy Markdown
Contributor

🧪 Test quality grade — PR #9641

GradeTestNotes
B (80–89)mod HelpInfoAllExtensionsTests.
Help_
WithAllExtensionsRegistered_
OutputFullHelpContent
Strong snapshot assertions on full help output; ~200-line body exceeds the integration leniency threshold — split by extension group for narrower failure scope.
B (80–89)mod HelpInfoAllExtensionsTests.
Info_
WithAllExtensionsRegistered_
OutputFullInfoContent
Strong assertions on full info output; ~560-line snapshot exceeds the integration leniency threshold — split by extension group for narrower failure scope.
A (90–100)new GitHubActionsAnnotationReporterTests.
GetSkippedAnnotation_
EmitsTitleOnlyWarningWithReasonAndEscaping
No issues found.
A (90–100)new GitHubActionsAnnotationReporterTests.
GetSkippedAnnotation_
FallsBackToDefaultReason_
WhenNoExplanation
No issues found.

This advisory comment was generated automatically. Grades are heuristic
and informational — they do not block merging. Re-run with
/grade-tests.

🤖 Automated content by GitHub Copilot. Posted via a maintainer's GitHub token, so it appears under their account — the account owner did not write or approve this content personally. Generated by the Grade Tests on PR (on open / sync) workflow. · 87 AIC · ⌖ 10.7 AIC · ⊞ 9.5K · [◷]( · )

@github-actionsgithub-actionsBot 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.

Note

🤖 Automated review by GitHub Copilot. Posted via a maintainer's GitHub token, so it appears under their account — the account owner did not write or approve this content personally. Generated by the Expert Code Review workflow. To request a follow-up action, reply by tagging @copilot directly.

Summary

Clean implementation that follows established patterns. No blocking issues found.

✅ What looks good

  • Correctness: Skipped test handling is correctly placed in the failure is null branch of ConsumeAsync, wrapped by the existing try/catch for graceful degradation.
  • Escaping: Uses the same GitHubActionsEscaper.EscapeProperty/EscapeData pipeline as error annotations — unit tests confirm \n%0A and \r%0D handling.
  • API surface: GetSkippedAnnotation is internal static — no public API change; no PublicAPI.Unshipped.txt entry required.
  • Resources/XLF: New strings added correctly with format comments; UpdateXlf regenerated all 14 locale files. As a bonus, the regeneration incidentally fixes a pre-existing typo in pt-BR and zh-Hans XLFs (both had stale/incorrect source text for AnnotationsOptionDescription).
  • Testing: Two new unit tests covering explanation-present and null-explanation paths. Pattern is consistent with existing GetErrorAnnotation tests.
  • ConfigureAwait(false): Correctly applied on the new async path.

📝 Minor observations (non-blocking)

  1. Unrelated change: The .mcp.json deletion is bundled in this PR — not harmful, but ideally would be a separate commit for a cleaner history.
  2. GitHub annotation limit awareness: GitHub Actions silently caps annotations at ~10 per type per step. Suites with many skipped tests will see truncation on the Annotations tab. Not a code defect (the reporter can't work around it), but worth a note in PACKAGE.md if users report confusion in the future.

LGTM — no changes requested.

@Evangelink
Amaury Levé (Evangelink) merged commit 1604c5e into mainJul 5, 2026
42 checks passed
@Evangelink
Amaury Levé (Evangelink) deleted the dev/amauryleve/github-report-gaps branch July 5, 2026 20:51
Amaury Levé (Evangelink) added a commit that referenced this pull request Jul 5, 2026
… by @Evangelink in #9641 (backport to rel/4.3) (#9644)
Co-authored-by: Amaury Levé <amauryleve@microsoft.com>
Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
github-actionsBot added a commit that referenced this pull request Jul 6, 2026
Add a new ## G section with a GitHubActionsReport entry covering the
Microsoft.Testing.Extensions.GitHubActionsReport MTP extension. The
entry documents all four CLI features (log groups, failure/skip
annotations, job summary, slow-test notices), MSTest.Sdk opt-in,
and NativeAOT/VSTest limitations.
Identified from PR #9641 (weekly full scan, 2026-07-06).
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
github-actionsBot added a commit that referenced this pull request Jul 6, 2026
…ped-test warnings)
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Amaury Levé (Evangelink) added a commit that referenced this pull request Jul 7, 2026
Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
Amaury Levé (Evangelink) added a commit that referenced this pull request Jul 7, 2026
Reference PR #9541 (which introduced the extension) as the introduction,
and attribute the skipped-test ::warning annotations to PR #9641.
Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

state/needs-reviewAwaiting review from the team.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants

@Evangelink@0101
, '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

Emit ::warning annotations for skipped tests in GitHubActionsReport - #9641

Merged
Amaury Levé (Evangelink) merged 1 commit into
mainfrom
dev/amauryleve/github-report-gaps
Jul 5, 2026
Merged

Emit ::warning annotations for skipped tests in GitHubActionsReport#9641
Amaury Levé (Evangelink) merged 1 commit into
mainfrom
dev/amauryleve/github-report-gaps

Conversation

@Evangelink

Copy link
Copy Markdown
Member

What

Adds skipped-test annotations to Microsoft.Testing.Extensions.GitHubActionsReport. Previously, only failing tests produced ::error annotations; skipped tests were silently absent from the GitHub Actions Annotations tab. This change surfaces each skipped test as a title-only ::warning workflow command so intentionally/unexpectedly skipped tests are visible alongside failures.

Why

While assessing RFC #9003 against the shipped extension, this was the one clearly-scoped Tier 1 (no-auth, workflow-command) gap. The RFC explicitly lists "::warning … for skipped" in Tier 1. Tiers 2/3 (Check Runs and sticky PR comments via the GitHub API + GITHUB_TOKEN) remain a separate follow-up.

How

  • GitHubActionsAnnotationReporter now handles SkippedTestNodeStateProperty and emits a title-only ::warning (skipped nodes carry no exception/stack trace, so there is no file:line to pin to). Added a testable GetSkippedAnnotation helper mirroring GetErrorAnnotation.
  • Folded into the existing --report-gh-annotations knob (no new CLI option); broadened its description to "failed and skipped tests".
  • New resources SkippedAnnotationTitle / NoSkipReasonFallback; regenerated all 14 .xlf files via UpdateXlf.
  • Updated HelpInfoAllExtensionsTests (--help + --info) and PACKAGE.md to match.
  • Added unit tests for the reason and fallback paths.

Behavioral notes

::warning is purely informational in GitHub Actions — it does not affect step/job pass-fail (that's driven solely by the process exit code, which this reporter never touches). The reporter's ConsumeAsync is wrapped in try/catch that degrades to "no annotation" on any exception. The feature stays behind the --report-gh master switch (off by default) and the on-by-default --report-gh-annotations knob.

Verification

  • Extension + Microsoft.Testing.Extensions.UnitTests build clean (0 warnings/errors).
  • Full extensions unit-test suite passes on net9.0 (failed: 0), including the 2 new tests.

🤖 Assisted by GitHub Copilot CLI.

Skipped tests were previously invisible in the GitHub Actions Annotations tab. Surface them as title-only ::warning workflow commands under the existing --report-gh-annotations knob, mirroring the RFC #9003 Tier 1 design.
Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
CopilotAI review requested due to automatic review settings July 5, 2026 19:50
@EvangelinkAmaury Levé (Evangelink) added the state/needs-review Awaiting review from the team. label Jul 5, 2026
@Evangelink
Amaury Levé (Evangelink) enabled auto-merge (squash) July 5, 2026 19:51
@Evangelink

Copy link
Copy Markdown
MemberAuthor

/backport to rel/4.3

@github-actions

Copy link
Copy Markdown
Contributor

Started backporting to rel/4.3: https://github.com/microsoft/testfx/actions/runs/28752868353

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 Microsoft.Testing.Extensions.GitHubActionsReport so that skipped tests now surface in the GitHub Actions Annotations tab. Previously only failing tests produced ::error annotations; skipped tests were silently absent. This implements the clearly-scoped Tier 1 gap from RFC #9003 (::warning for skipped tests), while Tiers 2/3 (Check Runs / sticky PR comments needing GITHUB_TOKEN) remain follow-ups.

Changes:

  • GitHubActionsAnnotationReporter now handles SkippedTestNodeStateProperty and emits a title-only ::warning via a new testable GetSkippedAnnotation helper that mirrors GetErrorAnnotation.
  • Adds resources SkippedAnnotationTitle / NoSkipReasonFallback, regenerates all 13 .xlf files, and broadens the --report-gh-annotations description to cover "failed and skipped tests" (no new CLI option).
  • Updates unit tests, the HelpInfoAllExtensionsTests help/info expectations, PACKAGE.md, and the class doc comment.
Show a summary per file
FileDescription
GitHubActionsAnnotationReporter.csAdds skipped-test branch + WriteSkippedAnnotationAsync / GetSkippedAnnotation emitting title-only ::warning; updates doc comment
Resources/GitHubActionsResources.resxAdds SkippedAnnotationTitle / NoSkipReasonFallback; broadens annotations option description
Resources/xlf/*.xlf (13 files)Regenerated via UpdateXlf with the two new trans-units and updated option description (correct alphabetical id order)
GitHubActionsAnnotationReporterTests.csAdds two tests for the skipped-annotation reason and fallback paths, including escaping
HelpInfoAllExtensionsTests.csUpdates --help and --info expectations to the new option description
PACKAGE.mdDocuments skipped-test ::warning behavior and updates the options table row

The change is additive, well-scoped, and consistent with the existing failure-annotation path: both branches use the same GetTestName, newline-prepend, and escaping conventions. The unit tests match the existing "test the pure formatter helper" convention, help/info expectations are the only place the option description is asserted and are updated, and the .xlf regeneration preserves correct alphabetical id ordering. I found no objective issues.

Review details

  • Files reviewed: 18/18 changed files
  • Comments generated: 0
  • Review effort level: Medium

@github-actions

Copy link
Copy Markdown
Contributor

🧪 Test quality grade — PR #9641

GradeTestNotes
B (80–89)mod HelpInfoAllExtensionsTests.
Help_
WithAllExtensionsRegistered_
OutputFullHelpContent
Strong snapshot assertions on full help output; ~200-line body exceeds the integration leniency threshold — split by extension group for narrower failure scope.
B (80–89)mod HelpInfoAllExtensionsTests.
Info_
WithAllExtensionsRegistered_
OutputFullInfoContent
Strong assertions on full info output; ~560-line snapshot exceeds the integration leniency threshold — split by extension group for narrower failure scope.
A (90–100)new GitHubActionsAnnotationReporterTests.
GetSkippedAnnotation_
EmitsTitleOnlyWarningWithReasonAndEscaping
No issues found.
A (90–100)new GitHubActionsAnnotationReporterTests.
GetSkippedAnnotation_
FallsBackToDefaultReason_
WhenNoExplanation
No issues found.

This advisory comment was generated automatically. Grades are heuristic
and informational — they do not block merging. Re-run with
/grade-tests.

🤖 Automated content by GitHub Copilot. Posted via a maintainer's GitHub token, so it appears under their account — the account owner did not write or approve this content personally. Generated by the Grade Tests on PR (on open / sync) workflow. · 87 AIC · ⌖ 10.7 AIC · ⊞ 9.5K · [◷]( · )

@github-actionsgithub-actionsBot 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.

Note

🤖 Automated review by GitHub Copilot. Posted via a maintainer's GitHub token, so it appears under their account — the account owner did not write or approve this content personally. Generated by the Expert Code Review workflow. To request a follow-up action, reply by tagging @copilot directly.

Summary

Clean implementation that follows established patterns. No blocking issues found.

✅ What looks good

  • Correctness: Skipped test handling is correctly placed in the failure is null branch of ConsumeAsync, wrapped by the existing try/catch for graceful degradation.
  • Escaping: Uses the same GitHubActionsEscaper.EscapeProperty/EscapeData pipeline as error annotations — unit tests confirm \n%0A and \r%0D handling.
  • API surface: GetSkippedAnnotation is internal static — no public API change; no PublicAPI.Unshipped.txt entry required.
  • Resources/XLF: New strings added correctly with format comments; UpdateXlf regenerated all 14 locale files. As a bonus, the regeneration incidentally fixes a pre-existing typo in pt-BR and zh-Hans XLFs (both had stale/incorrect source text for AnnotationsOptionDescription).
  • Testing: Two new unit tests covering explanation-present and null-explanation paths. Pattern is consistent with existing GetErrorAnnotation tests.
  • ConfigureAwait(false): Correctly applied on the new async path.

📝 Minor observations (non-blocking)

  1. Unrelated change: The .mcp.json deletion is bundled in this PR — not harmful, but ideally would be a separate commit for a cleaner history.
  2. GitHub annotation limit awareness: GitHub Actions silently caps annotations at ~10 per type per step. Suites with many skipped tests will see truncation on the Annotations tab. Not a code defect (the reporter can't work around it), but worth a note in PACKAGE.md if users report confusion in the future.

LGTM — no changes requested.

@Evangelink
Amaury Levé (Evangelink) merged commit 1604c5e into mainJul 5, 2026
42 checks passed
@Evangelink
Amaury Levé (Evangelink) deleted the dev/amauryleve/github-report-gaps branch July 5, 2026 20:51
Amaury Levé (Evangelink) added a commit that referenced this pull request Jul 5, 2026
… by @Evangelink in #9641 (backport to rel/4.3) (#9644)
Co-authored-by: Amaury Levé <amauryleve@microsoft.com>
Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
github-actionsBot added a commit that referenced this pull request Jul 6, 2026
Add a new ## G section with a GitHubActionsReport entry covering the
Microsoft.Testing.Extensions.GitHubActionsReport MTP extension. The
entry documents all four CLI features (log groups, failure/skip
annotations, job summary, slow-test notices), MSTest.Sdk opt-in,
and NativeAOT/VSTest limitations.
Identified from PR #9641 (weekly full scan, 2026-07-06).
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
github-actionsBot added a commit that referenced this pull request Jul 6, 2026
…ped-test warnings)
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Amaury Levé (Evangelink) added a commit that referenced this pull request Jul 7, 2026
Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
Amaury Levé (Evangelink) added a commit that referenced this pull request Jul 7, 2026
Reference PR #9541 (which introduced the extension) as the introduction,
and attribute the skipped-test ::warning annotations to PR #9641.
Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

state/needs-reviewAwaiting review from the team.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants

@Evangelink@0101
, '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

Emit ::warning annotations for skipped tests in GitHubActionsReport - #9641

Merged
Amaury Levé (Evangelink) merged 1 commit into
mainfrom
dev/amauryleve/github-report-gaps
Jul 5, 2026
Merged

Emit ::warning annotations for skipped tests in GitHubActionsReport#9641
Amaury Levé (Evangelink) merged 1 commit into
mainfrom
dev/amauryleve/github-report-gaps

Conversation

@Evangelink

Copy link
Copy Markdown
Member

What

Adds skipped-test annotations to Microsoft.Testing.Extensions.GitHubActionsReport. Previously, only failing tests produced ::error annotations; skipped tests were silently absent from the GitHub Actions Annotations tab. This change surfaces each skipped test as a title-only ::warning workflow command so intentionally/unexpectedly skipped tests are visible alongside failures.

Why

While assessing RFC #9003 against the shipped extension, this was the one clearly-scoped Tier 1 (no-auth, workflow-command) gap. The RFC explicitly lists "::warning … for skipped" in Tier 1. Tiers 2/3 (Check Runs and sticky PR comments via the GitHub API + GITHUB_TOKEN) remain a separate follow-up.

How

  • GitHubActionsAnnotationReporter now handles SkippedTestNodeStateProperty and emits a title-only ::warning (skipped nodes carry no exception/stack trace, so there is no file:line to pin to). Added a testable GetSkippedAnnotation helper mirroring GetErrorAnnotation.
  • Folded into the existing --report-gh-annotations knob (no new CLI option); broadened its description to "failed and skipped tests".
  • New resources SkippedAnnotationTitle / NoSkipReasonFallback; regenerated all 14 .xlf files via UpdateXlf.
  • Updated HelpInfoAllExtensionsTests (--help + --info) and PACKAGE.md to match.
  • Added unit tests for the reason and fallback paths.

Behavioral notes

::warning is purely informational in GitHub Actions — it does not affect step/job pass-fail (that's driven solely by the process exit code, which this reporter never touches). The reporter's ConsumeAsync is wrapped in try/catch that degrades to "no annotation" on any exception. The feature stays behind the --report-gh master switch (off by default) and the on-by-default --report-gh-annotations knob.

Verification

  • Extension + Microsoft.Testing.Extensions.UnitTests build clean (0 warnings/errors).
  • Full extensions unit-test suite passes on net9.0 (failed: 0), including the 2 new tests.

🤖 Assisted by GitHub Copilot CLI.

Skipped tests were previously invisible in the GitHub Actions Annotations tab. Surface them as title-only ::warning workflow commands under the existing --report-gh-annotations knob, mirroring the RFC #9003 Tier 1 design.
Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
CopilotAI review requested due to automatic review settings July 5, 2026 19:50
@EvangelinkAmaury Levé (Evangelink) added the state/needs-review Awaiting review from the team. label Jul 5, 2026
@Evangelink
Amaury Levé (Evangelink) enabled auto-merge (squash) July 5, 2026 19:51
@Evangelink

Copy link
Copy Markdown
MemberAuthor

/backport to rel/4.3

@github-actions

Copy link
Copy Markdown
Contributor

Started backporting to rel/4.3: https://github.com/microsoft/testfx/actions/runs/28752868353

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 Microsoft.Testing.Extensions.GitHubActionsReport so that skipped tests now surface in the GitHub Actions Annotations tab. Previously only failing tests produced ::error annotations; skipped tests were silently absent. This implements the clearly-scoped Tier 1 gap from RFC #9003 (::warning for skipped tests), while Tiers 2/3 (Check Runs / sticky PR comments needing GITHUB_TOKEN) remain follow-ups.

Changes:

  • GitHubActionsAnnotationReporter now handles SkippedTestNodeStateProperty and emits a title-only ::warning via a new testable GetSkippedAnnotation helper that mirrors GetErrorAnnotation.
  • Adds resources SkippedAnnotationTitle / NoSkipReasonFallback, regenerates all 13 .xlf files, and broadens the --report-gh-annotations description to cover "failed and skipped tests" (no new CLI option).
  • Updates unit tests, the HelpInfoAllExtensionsTests help/info expectations, PACKAGE.md, and the class doc comment.
Show a summary per file
FileDescription
GitHubActionsAnnotationReporter.csAdds skipped-test branch + WriteSkippedAnnotationAsync / GetSkippedAnnotation emitting title-only ::warning; updates doc comment
Resources/GitHubActionsResources.resxAdds SkippedAnnotationTitle / NoSkipReasonFallback; broadens annotations option description
Resources/xlf/*.xlf (13 files)Regenerated via UpdateXlf with the two new trans-units and updated option description (correct alphabetical id order)
GitHubActionsAnnotationReporterTests.csAdds two tests for the skipped-annotation reason and fallback paths, including escaping
HelpInfoAllExtensionsTests.csUpdates --help and --info expectations to the new option description
PACKAGE.mdDocuments skipped-test ::warning behavior and updates the options table row

The change is additive, well-scoped, and consistent with the existing failure-annotation path: both branches use the same GetTestName, newline-prepend, and escaping conventions. The unit tests match the existing "test the pure formatter helper" convention, help/info expectations are the only place the option description is asserted and are updated, and the .xlf regeneration preserves correct alphabetical id ordering. I found no objective issues.

Review details

  • Files reviewed: 18/18 changed files
  • Comments generated: 0
  • Review effort level: Medium

@github-actions

Copy link
Copy Markdown
Contributor

🧪 Test quality grade — PR #9641

GradeTestNotes
B (80–89)mod HelpInfoAllExtensionsTests.
Help_
WithAllExtensionsRegistered_
OutputFullHelpContent
Strong snapshot assertions on full help output; ~200-line body exceeds the integration leniency threshold — split by extension group for narrower failure scope.
B (80–89)mod HelpInfoAllExtensionsTests.
Info_
WithAllExtensionsRegistered_
OutputFullInfoContent
Strong assertions on full info output; ~560-line snapshot exceeds the integration leniency threshold — split by extension group for narrower failure scope.
A (90–100)new GitHubActionsAnnotationReporterTests.
GetSkippedAnnotation_
EmitsTitleOnlyWarningWithReasonAndEscaping
No issues found.
A (90–100)new GitHubActionsAnnotationReporterTests.
GetSkippedAnnotation_
FallsBackToDefaultReason_
WhenNoExplanation
No issues found.

This advisory comment was generated automatically. Grades are heuristic
and informational — they do not block merging. Re-run with
/grade-tests.

🤖 Automated content by GitHub Copilot. Posted via a maintainer's GitHub token, so it appears under their account — the account owner did not write or approve this content personally. Generated by the Grade Tests on PR (on open / sync) workflow. · 87 AIC · ⌖ 10.7 AIC · ⊞ 9.5K · [◷]( · )

@github-actionsgithub-actionsBot 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.

Note

🤖 Automated review by GitHub Copilot. Posted via a maintainer's GitHub token, so it appears under their account — the account owner did not write or approve this content personally. Generated by the Expert Code Review workflow. To request a follow-up action, reply by tagging @copilot directly.

Summary

Clean implementation that follows established patterns. No blocking issues found.

✅ What looks good

  • Correctness: Skipped test handling is correctly placed in the failure is null branch of ConsumeAsync, wrapped by the existing try/catch for graceful degradation.
  • Escaping: Uses the same GitHubActionsEscaper.EscapeProperty/EscapeData pipeline as error annotations — unit tests confirm \n%0A and \r%0D handling.
  • API surface: GetSkippedAnnotation is internal static — no public API change; no PublicAPI.Unshipped.txt entry required.
  • Resources/XLF: New strings added correctly with format comments; UpdateXlf regenerated all 14 locale files. As a bonus, the regeneration incidentally fixes a pre-existing typo in pt-BR and zh-Hans XLFs (both had stale/incorrect source text for AnnotationsOptionDescription).
  • Testing: Two new unit tests covering explanation-present and null-explanation paths. Pattern is consistent with existing GetErrorAnnotation tests.
  • ConfigureAwait(false): Correctly applied on the new async path.

📝 Minor observations (non-blocking)

  1. Unrelated change: The .mcp.json deletion is bundled in this PR — not harmful, but ideally would be a separate commit for a cleaner history.
  2. GitHub annotation limit awareness: GitHub Actions silently caps annotations at ~10 per type per step. Suites with many skipped tests will see truncation on the Annotations tab. Not a code defect (the reporter can't work around it), but worth a note in PACKAGE.md if users report confusion in the future.

LGTM — no changes requested.

@Evangelink
Amaury Levé (Evangelink) merged commit 1604c5e into mainJul 5, 2026
42 checks passed
@Evangelink
Amaury Levé (Evangelink) deleted the dev/amauryleve/github-report-gaps branch July 5, 2026 20:51
Amaury Levé (Evangelink) added a commit that referenced this pull request Jul 5, 2026
… by @Evangelink in #9641 (backport to rel/4.3) (#9644)
Co-authored-by: Amaury Levé <amauryleve@microsoft.com>
Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
github-actionsBot added a commit that referenced this pull request Jul 6, 2026
Add a new ## G section with a GitHubActionsReport entry covering the
Microsoft.Testing.Extensions.GitHubActionsReport MTP extension. The
entry documents all four CLI features (log groups, failure/skip
annotations, job summary, slow-test notices), MSTest.Sdk opt-in,
and NativeAOT/VSTest limitations.
Identified from PR #9641 (weekly full scan, 2026-07-06).
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
github-actionsBot added a commit that referenced this pull request Jul 6, 2026
…ped-test warnings)
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Amaury Levé (Evangelink) added a commit that referenced this pull request Jul 7, 2026
Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
Amaury Levé (Evangelink) added a commit that referenced this pull request Jul 7, 2026
Reference PR #9541 (which introduced the extension) as the introduction,
and attribute the skipped-test ::warning annotations to PR #9641.
Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

state/needs-reviewAwaiting review from the team.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants

@Evangelink@0101