Skip to content

Commit 81d31a7

Browse files
committed
Adding code coverage to tests in workflow
This is using the pattern from the Aspire Community Toolkit which will publish coverage results to the GitHub Actions summary, as well as a comment on the PR (if the job was run by someone with permissions to write comments). Also added the GitHubActionsTestLogger so that it writes a nicer log out to the run. Fixes #11
1 parent a97a74f commit 81d31a7

File tree

4 files changed

+137
-40
lines changed

4 files changed

+137
-40
lines changed

.github/workflows/ci.yml

Lines changed: 27 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -48,4 +48,30 @@ jobs:
4848
run: dotnet build --configuration ${{ matrix.configuration }}
4949

5050
- name: Test
51-
run: dotnet test --filter '(Execution!=Manual)' --no-build --configuration ${{ matrix.configuration }}
51+
run: >-
52+
dotnet test
53+
--filter '(Execution!=Manual)'
54+
--no-build
55+
--configuration ${{ matrix.configuration }}
56+
--logger "console;verbosity=normal"
57+
--logger "trx"
58+
--logger "GitHubActions;summary.includePassedTests=true;summary.includeSkippedTests=true"
59+
--blame
60+
--blame-hang-timeout 7m
61+
--blame-crash
62+
--results-directory testresults
63+
--collect "XPlat Code Coverage"
64+
-- RunConfiguration.CollectSourceInformation=true
65+
66+
- name: Upload test results artifact
67+
if: always()
68+
uses: actions/upload-artifact@v4
69+
with:
70+
name: testresults-${{ matrix.os }}-${{ matrix.configuration }}
71+
path: testresults/**
72+
73+
publish-coverage:
74+
if: github.actor != 'dependabot[bot]'
75+
needs: build
76+
uses: ./.github/workflows/code-coverage.yml
77+
secrets: inherit
Lines changed: 65 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,65 @@
1+
name: Code Coverage
2+
3+
on:
4+
workflow_call:
5+
6+
jobs:
7+
publish-coverage:
8+
runs-on: ubuntu-latest
9+
steps:
10+
- uses: actions/checkout@v4
11+
12+
- name: Download test results
13+
uses: actions/download-artifact@v4
14+
with:
15+
pattern: testresults-*
16+
17+
- name: Combine coverage reports
18+
uses: danielpalme/[email protected]
19+
with:
20+
reports: "**/*.cobertura.xml"
21+
targetdir: "${{ github.workspace }}/report"
22+
reporttypes: "HtmlSummary;Cobertura;MarkdownSummary;MarkdownSummaryGithub"
23+
verbosity: "Info"
24+
title: "Code Coverage"
25+
tag: "${{ github.run_number }}_${{ github.run_id }}"
26+
customSettings: ""
27+
toolpath: "reportgeneratortool"
28+
29+
- name: Upload combined coverage XML
30+
uses: actions/upload-artifact@v4
31+
with:
32+
name: coverage
33+
path: ${{ github.workspace }}/report
34+
retention-days: 7
35+
36+
- name: Publish code coverage report
37+
uses: irongut/[email protected]
38+
with:
39+
filename: "report/Cobertura.xml"
40+
badge: true
41+
fail_below_min: true
42+
format: markdown
43+
hide_branch_rate: false
44+
hide_complexity: false
45+
indicators: true
46+
output: both
47+
thresholds: "60 80"
48+
49+
- name: Upload combined coverage markdown
50+
uses: actions/upload-artifact@v4
51+
with:
52+
name: coverage-markdown
53+
path: ${{ github.workspace }}/code-coverage-results.md
54+
retention-days: 7
55+
56+
- name: Add Coverage PR Comment
57+
uses: marocchino/sticky-pull-request-comment@v2
58+
if: github.event_name == 'pull_request' && github.event.pull_request.head.repo.full_name == github.repository
59+
with:
60+
recreate: true
61+
path: ${{ github.workspace }}/code-coverage-results.md
62+
63+
- name: Coverage on step summary
64+
if: always()
65+
run: cat "${{ github.workspace }}/report/SummaryGithub.md" >> $GITHUB_STEP_SUMMARY

Directory.Packages.props

Lines changed: 41 additions & 39 deletions
Original file line numberDiff line numberDiff line change
@@ -1,40 +1,42 @@
1-
<Project>
2-
<PropertyGroup>
3-
<ManagePackageVersionsCentrally>true</ManagePackageVersionsCentrally>
4-
<SystemVersion>9.0.3</SystemVersion>
5-
<System10Version>10.0.0-preview.2.25163.2</System10Version>
6-
<MicrosoftExtensionsVersion>9.0.3</MicrosoftExtensionsVersion>
7-
<MicrosoftExtensionsAIVersion>9.3.0-preview.1.25161.3</MicrosoftExtensionsAIVersion>
8-
</PropertyGroup>
9-
<ItemGroup>
10-
<!-- Product dependencies -->
11-
<PackageVersion Include="Microsoft.Bcl.Memory" Version="$(SystemVersion)" />
12-
<PackageVersion Include="Microsoft.Extensions.AI" Version="$(MicrosoftExtensionsAIVersion)" />
13-
<PackageVersion Include="Microsoft.Extensions.AI.Abstractions" Version="$(MicrosoftExtensionsAIVersion)" />
14-
<PackageVersion Include="Microsoft.Extensions.Hosting.Abstractions" Version="$(MicrosoftExtensionsVersion)" />
15-
<PackageVersion Include="Microsoft.Extensions.Logging.Abstractions" Version="$(MicrosoftExtensionsVersion)" />
16-
<PackageVersion Include="System.Net.ServerSentEvents" Version="$(System10Version)" />
17-
<PackageVersion Include="System.Text.Json" Version="$(SystemVersion)" />
18-
<PackageVersion Include="System.Threading.Channels" Version="$(SystemVersion)" />
19-
20-
<!-- Build Infra & Packaging -->
21-
<PackageVersion Include="Microsoft.SourceLink.GitHub" Version="8.0.0" />
22-
23-
<!-- Testing dependencies -->
24-
<PackageVersion Include="Anthropic.SDK" Version="4.7.1" />
25-
<PackageVersion Include="Microsoft.Extensions.AI.OpenAI" Version="$(MicrosoftExtensionsAIVersion)" />
26-
<PackageVersion Include="Microsoft.Extensions.Hosting" Version="$(MicrosoftExtensionsVersion)" />
27-
<PackageVersion Include="Microsoft.Extensions.Logging" Version="$(MicrosoftExtensionsVersion)" />
28-
<PackageVersion Include="Microsoft.Extensions.Logging.Console" Version="$(MicrosoftExtensionsVersion)" />
29-
<PackageVersion Include="Microsoft.NET.Test.Sdk" Version="17.12.0" />
30-
<PackageVersion Include="Moq" Version="4.20.72" />
31-
<PackageVersion Include="Serilog.Extensions.Hosting" Version="9.0.0" />
32-
<PackageVersion Include="Serilog.Extensions.Logging" Version="9.0.0" />
33-
<PackageVersion Include="Serilog.Sinks.Console" Version="6.0.0" />
34-
<PackageVersion Include="Serilog.Sinks.Debug" Version="3.0.0" />
35-
<PackageVersion Include="Serilog.Sinks.File" Version="6.0.0" />
36-
<PackageVersion Include="System.Linq.AsyncEnumerable" Version="$(System10Version)" />
37-
<PackageVersion Include="xunit.v3" Version="1.1.0" />
38-
<PackageVersion Include="xunit.runner.visualstudio" Version="3.0.2" />
39-
</ItemGroup>
1+
<Project>
2+
<PropertyGroup>
3+
<ManagePackageVersionsCentrally>true</ManagePackageVersionsCentrally>
4+
<SystemVersion>9.0.3</SystemVersion>
5+
<System10Version>10.0.0-preview.2.25163.2</System10Version>
6+
<MicrosoftExtensionsVersion>9.0.3</MicrosoftExtensionsVersion>
7+
<MicrosoftExtensionsAIVersion>9.3.0-preview.1.25161.3</MicrosoftExtensionsAIVersion>
8+
</PropertyGroup>
9+
<ItemGroup>
10+
<!-- Product dependencies -->
11+
<PackageVersion Include="GitHubActionsTestLogger" Version="2.4.1">
12+
<IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
13+
<PrivateAssets>all</PrivateAssets>
14+
</PackageVersion>
15+
<PackageVersion Include="Microsoft.Bcl.Memory" Version="$(SystemVersion)" />
16+
<PackageVersion Include="Microsoft.Extensions.AI" Version="$(MicrosoftExtensionsAIVersion)" />
17+
<PackageVersion Include="Microsoft.Extensions.AI.Abstractions" Version="$(MicrosoftExtensionsAIVersion)" />
18+
<PackageVersion Include="Microsoft.Extensions.Hosting.Abstractions" Version="$(MicrosoftExtensionsVersion)" />
19+
<PackageVersion Include="Microsoft.Extensions.Logging.Abstractions" Version="$(MicrosoftExtensionsVersion)" />
20+
<PackageVersion Include="System.Net.ServerSentEvents" Version="$(System10Version)" />
21+
<PackageVersion Include="System.Text.Json" Version="$(SystemVersion)" />
22+
<PackageVersion Include="System.Threading.Channels" Version="$(SystemVersion)" />
23+
<!-- Build Infra & Packaging -->
24+
<PackageVersion Include="Microsoft.SourceLink.GitHub" Version="8.0.0" />
25+
<!-- Testing dependencies -->
26+
<PackageVersion Include="Anthropic.SDK" Version="4.7.1" />
27+
<PackageVersion Include="Microsoft.Extensions.AI.OpenAI" Version="$(MicrosoftExtensionsAIVersion)" />
28+
<PackageVersion Include="Microsoft.Extensions.Hosting" Version="$(MicrosoftExtensionsVersion)" />
29+
<PackageVersion Include="Microsoft.Extensions.Logging" Version="$(MicrosoftExtensionsVersion)" />
30+
<PackageVersion Include="Microsoft.Extensions.Logging.Console" Version="$(MicrosoftExtensionsVersion)" />
31+
<PackageVersion Include="Microsoft.NET.Test.Sdk" Version="17.12.0" />
32+
<PackageVersion Include="Moq" Version="4.20.72" />
33+
<PackageVersion Include="Serilog.Extensions.Hosting" Version="9.0.0" />
34+
<PackageVersion Include="Serilog.Extensions.Logging" Version="9.0.0" />
35+
<PackageVersion Include="Serilog.Sinks.Console" Version="6.0.0" />
36+
<PackageVersion Include="Serilog.Sinks.Debug" Version="3.0.0" />
37+
<PackageVersion Include="Serilog.Sinks.File" Version="6.0.0" />
38+
<PackageVersion Include="System.Linq.AsyncEnumerable" Version="$(System10Version)" />
39+
<PackageVersion Include="xunit.v3" Version="1.1.0" />
40+
<PackageVersion Include="xunit.runner.visualstudio" Version="3.0.2" />
41+
</ItemGroup>
4042
</Project>

tests/ModelContextProtocol.Tests/ModelContextProtocol.Tests.csproj

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,10 @@
1212
</PropertyGroup>
1313

1414
<ItemGroup>
15+
<PackageReference Include="GitHubActionsTestLogger">
16+
<IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
17+
<PrivateAssets>all</PrivateAssets>
18+
</PackageReference>
1519
<PackageReference Include="Microsoft.Extensions.AI.OpenAI" />
1620
<PackageReference Include="Microsoft.Extensions.Logging" />
1721
<PackageReference Include="Microsoft.Extensions.Logging.Console" />

0 commit comments

Comments
 (0)