From 88e4f0fd0893ab6d9a38180ba3efbfcadbd19c66 Mon Sep 17 00:00:00 2001 From: Hardi Shah Date: Mon, 29 Dec 2025 12:46:07 +0530 Subject: [PATCH 01/13] test --- .github/workflows/dotnet.yml | 71 ++++++++++++++++++++++++++++++++++-- 1 file changed, 67 insertions(+), 4 deletions(-) diff --git a/.github/workflows/dotnet.yml b/.github/workflows/dotnet.yml index e69c99e..5dfd7ec 100644 --- a/.github/workflows/dotnet.yml +++ b/.github/workflows/dotnet.yml @@ -44,12 +44,75 @@ jobs: run: dotnet build ${{ env.SOLUTION_PATH }} --configuration ${{ env.BUILD_CONFIGURATION }} --no-restore - name: Run Unit Tests - run: dotnet test ${{ env.TEST_PROJECT }} --configuration Release --no-build --logger "trx;LogFileName=test_results.trx" + run: dotnet test ${{ env.TEST_PROJECT }} \ + --configuration ${{ env.BUILD_CONFIGURATION }} \ + --no-build \ + --logger "trx;LogFileName=unit_test_results.trx" \ + --collect:"XPlat Code Coverage" \ + --settings source/coverlet.runsettings # https://github.com/dorny/test-reporter - name: Publish Test Results - uses: dorny/test-reporter@fe45e9537387dac839af0d33ba56eed8e24189e8 # v2.3.0 + uses: dorny/test-reporter@v2 + id: test-results + if: github.event.pull_request.head.repo.fork == false with: - name: Unit Tests - path: "**/test_results.trx" + name: Test Results (Unit & Module) + path: "**/*_test_results.trx" reporter: dotnet-trx + + - name: Combine Test Results into PR Comment + if: github.event.pull_request.head.repo.fork == false + run: | + echo "# Test & Coverage Report" > results.md + echo "" >> results.md + echo "## Test Results Summary" >> results.md + echo "" >> results.md + echo "| Metric | Count |" >> results.md + echo "|--------|-------|" >> results.md + echo "| โœ… Passed | ${{ steps.test-results.outputs.passed }} |" >> results.md + echo "| โŒ Failed | ${{ steps.test-results.outputs.failed }} |" >> results.md + echo "| โญ๏ธ Skipped | ${{ steps.test-results.outputs.skipped }} |" >> results.md + echo "" >> results.md + + - name: Install ReportGenerator + if: github.event.pull_request.head.repo.fork == false + run: dotnet tool install --global dotnet-reportgenerator-globaltool + + - name: Generate Code Coverage Report (HTML + Cobertura) + if: github.event.pull_request.head.repo.fork == false + run: | + reportgenerator \ + -reports:"source/**/TestResults/**/coverage.cobertura.xml" \ + -targetdir:"coverlet/reports" \ + -reporttypes:"Html;HtmlSummary;Cobertura" + + - name: Add Code Coverage to PR Comment + if: github.event.pull_request.head.repo.fork == false + run: | + echo "" >> results.md + echo "## ๐Ÿ“Š Code Coverage" >> results.md + echo "" >> results.md + echo "- Full HTML coverage report available in workflow artifacts." >> results.md + echo "- Download **code-coverage-report** and open \`index.html\` for per-file details." >> results.md + + - name: Add PR Comment + if: github.event.pull_request.head.repo.fork == false + uses: marocchino/sticky-pull-request-comment@v2 + with: + recreate: true + path: results.md + + - name: Upload TRX as Artifact (Fork PR fallback) + if: github.event.pull_request.head.repo.fork == true + uses: actions/upload-artifact@v5 + with: + name: test-results + path: "**/*_test_results.trx" + + - name: Upload Code Coverage Report as Artifact + if: github.event.pull_request.head.repo.fork == false + uses: actions/upload-artifact@v5 + with: + name: code-coverage-report + path: coverlet/reports \ No newline at end of file From 57c7d14d54d85b57240347142f44fad9a5c87414 Mon Sep 17 00:00:00 2001 From: Hardi Shah Date: Mon, 29 Dec 2025 12:51:30 +0530 Subject: [PATCH 02/13] refactor command in one line --- .github/workflows/dotnet.yml | 10 ++-------- 1 file changed, 2 insertions(+), 8 deletions(-) diff --git a/.github/workflows/dotnet.yml b/.github/workflows/dotnet.yml index 5dfd7ec..37a0a91 100644 --- a/.github/workflows/dotnet.yml +++ b/.github/workflows/dotnet.yml @@ -44,14 +44,8 @@ jobs: run: dotnet build ${{ env.SOLUTION_PATH }} --configuration ${{ env.BUILD_CONFIGURATION }} --no-restore - name: Run Unit Tests - run: dotnet test ${{ env.TEST_PROJECT }} \ - --configuration ${{ env.BUILD_CONFIGURATION }} \ - --no-build \ - --logger "trx;LogFileName=unit_test_results.trx" \ - --collect:"XPlat Code Coverage" \ - --settings source/coverlet.runsettings - - # https://github.com/dorny/test-reporter + run: dotnet test ${{ env.TEST_PROJECT }} --configuration ${{ env.BUILD_CONFIGURATION }} --no-build --logger "trx;LogFileName=unit_test_results.trx" --collect:"XPlat Code Coverage" --settings source/coverlet.runsettings + - name: Publish Test Results uses: dorny/test-reporter@v2 id: test-results From 1972f8594a9aa877d04a33f1d55d703d12e68721 Mon Sep 17 00:00:00 2001 From: Hardi Shah Date: Mon, 29 Dec 2025 12:59:41 +0530 Subject: [PATCH 03/13] Enhance code coverage reporting by adding JSON output and improving PR comment summary --- .github/workflows/dotnet.yml | 19 +++++++++++++------ 1 file changed, 13 insertions(+), 6 deletions(-) diff --git a/.github/workflows/dotnet.yml b/.github/workflows/dotnet.yml index 37a0a91..8f306be 100644 --- a/.github/workflows/dotnet.yml +++ b/.github/workflows/dotnet.yml @@ -73,22 +73,29 @@ jobs: if: github.event.pull_request.head.repo.fork == false run: dotnet tool install --global dotnet-reportgenerator-globaltool - - name: Generate Code Coverage Report (HTML + Cobertura) + - name: Generate Code Coverage Report (HTML + Cobertura + JSON) if: github.event.pull_request.head.repo.fork == false run: | reportgenerator \ -reports:"source/**/TestResults/**/coverage.cobertura.xml" \ -targetdir:"coverlet/reports" \ - -reporttypes:"Html;HtmlSummary;Cobertura" + -reporttypes:"Html;HtmlSummary;Cobertura;JsonSummary" - - name: Add Code Coverage to PR Comment + - name: Add Code Coverage Summary to PR Comment if: github.event.pull_request.head.repo.fork == false run: | + COVERAGE_JSON=coverlet/reports/Summary.json + LINE=$(jq '.line' $COVERAGE_JSON) + BRANCH=$(jq '.branch' $COVERAGE_JSON) + echo "## ๐Ÿ“Š Code Coverage Summary" >> results.md echo "" >> results.md - echo "## ๐Ÿ“Š Code Coverage" >> results.md + echo "- Line coverage: $LINE%" >> results.md + echo "- Branch coverage: $BRANCH%" >> results.md echo "" >> results.md - echo "- Full HTML coverage report available in workflow artifacts." >> results.md - echo "- Download **code-coverage-report** and open \`index.html\` for per-file details." >> results.md + echo "### Files below ${{ env.COVERAGE_THRESHOLD }}% line coverage:" >> results.md + jq -r '.Files[] | select(.line < '${{ env.COVERAGE_THRESHOLD }}') | "\(.Name): \(.line)%"' $COVERAGE_JSON >> results.md + echo "" >> results.md + echo "- Full HTML coverage report is available in workflow artifacts." >> results.md - name: Add PR Comment if: github.event.pull_request.head.repo.fork == false From 64c27a2b31689dbc9fc13fd1ad947fbfc128ab89 Mon Sep 17 00:00:00 2001 From: Hardi Shah Date: Mon, 29 Dec 2025 13:15:10 +0530 Subject: [PATCH 04/13] Update coverage threshold in report to 80% --- .github/workflows/dotnet.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/dotnet.yml b/.github/workflows/dotnet.yml index 8f306be..c203f3d 100644 --- a/.github/workflows/dotnet.yml +++ b/.github/workflows/dotnet.yml @@ -92,8 +92,8 @@ jobs: echo "- Line coverage: $LINE%" >> results.md echo "- Branch coverage: $BRANCH%" >> results.md echo "" >> results.md - echo "### Files below ${{ env.COVERAGE_THRESHOLD }}% line coverage:" >> results.md - jq -r '.Files[] | select(.line < '${{ env.COVERAGE_THRESHOLD }}') | "\(.Name): \(.line)%"' $COVERAGE_JSON >> results.md + echo "### Files below 80% line coverage:" >> results.md + jq -r '.Files[] | select(.line < 80) | "\(.Name): \(.line)%"' $COVERAGE_JSON >> results.md echo "" >> results.md echo "- Full HTML coverage report is available in workflow artifacts." >> results.md From 25613091d749d4fc316ec4fc73e76cee7510ee23 Mon Sep 17 00:00:00 2001 From: Hardi Shah Date: Mon, 29 Dec 2025 13:21:05 +0530 Subject: [PATCH 05/13] Improve code coverage reporting by adding checks for coverage data availability --- .github/workflows/dotnet.yml | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/.github/workflows/dotnet.yml b/.github/workflows/dotnet.yml index c203f3d..9f09b87 100644 --- a/.github/workflows/dotnet.yml +++ b/.github/workflows/dotnet.yml @@ -93,9 +93,12 @@ jobs: echo "- Branch coverage: $BRANCH%" >> results.md echo "" >> results.md echo "### Files below 80% line coverage:" >> results.md - jq -r '.Files[] | select(.line < 80) | "\(.Name): \(.line)%"' $COVERAGE_JSON >> results.md + if jq -e '.Files' $COVERAGE_JSON > /dev/null 2>&1; then + jq -r '.Files[] | select(.line < 80) | "\(.Name): \(.line)%"' $COVERAGE_JSON >> results.md || echo "None" >> results.md + else + echo "No file coverage data available" >> results.md + fi echo "" >> results.md - echo "- Full HTML coverage report is available in workflow artifacts." >> results.md - name: Add PR Comment if: github.event.pull_request.head.repo.fork == false From 4d30146bbd124560b9ec2cdebae48bcfa9a23105 Mon Sep 17 00:00:00 2001 From: Hardi Shah Date: Mon, 29 Dec 2025 13:24:37 +0530 Subject: [PATCH 06/13] Enhance code coverage summary by improving JSON data extraction and updating coverage thresholds --- .github/workflows/dotnet.yml | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/.github/workflows/dotnet.yml b/.github/workflows/dotnet.yml index 9f09b87..1876c26 100644 --- a/.github/workflows/dotnet.yml +++ b/.github/workflows/dotnet.yml @@ -85,18 +85,18 @@ jobs: if: github.event.pull_request.head.repo.fork == false run: | COVERAGE_JSON=coverlet/reports/Summary.json - LINE=$(jq '.line' $COVERAGE_JSON) - BRANCH=$(jq '.branch' $COVERAGE_JSON) + LINE=$(jq -r '.summary.linecoverage // "N/A"' $COVERAGE_JSON) + BRANCH=$(jq -r '.summary.branchcoverage // "N/A"' $COVERAGE_JSON) echo "## ๐Ÿ“Š Code Coverage Summary" >> results.md echo "" >> results.md echo "- Line coverage: $LINE%" >> results.md echo "- Branch coverage: $BRANCH%" >> results.md echo "" >> results.md echo "### Files below 80% line coverage:" >> results.md - if jq -e '.Files' $COVERAGE_JSON > /dev/null 2>&1; then - jq -r '.Files[] | select(.line < 80) | "\(.Name): \(.line)%"' $COVERAGE_JSON >> results.md || echo "None" >> results.md + if jq -e '.assemblies' $COVERAGE_JSON > /dev/null 2>&1; then + jq -r '.assemblies[].classes[] | select(.linecoverage < 80) | "\(.name): \(.linecoverage)%"' $COVERAGE_JSON >> results.md || echo "None" >> results.md else - echo "No file coverage data available" >> results.md + echo "No detailed file coverage data available" >> results.md fi echo "" >> results.md From 8f13288040d1e04c1c33fc815bd0f879f6dd53f8 Mon Sep 17 00:00:00 2001 From: Hardi Shah Date: Mon, 29 Dec 2025 13:35:06 +0530 Subject: [PATCH 07/13] Enhance code coverage reporting by adding detailed summary to workflow output --- .github/workflows/dotnet.yml | 46 ++++++++++++++++++++++++++++++++++++ 1 file changed, 46 insertions(+) diff --git a/.github/workflows/dotnet.yml b/.github/workflows/dotnet.yml index 1876c26..d9e0d29 100644 --- a/.github/workflows/dotnet.yml +++ b/.github/workflows/dotnet.yml @@ -100,6 +100,52 @@ jobs: fi echo "" >> results.md + - name: Publish Coverage to Workflow Summary + if: always() + run: | + COVERAGE_JSON=coverlet/reports/Summary.json + + # Add header + echo "# ๐Ÿ“Š Code Coverage Report" >> $GITHUB_STEP_SUMMARY + echo "" >> $GITHUB_STEP_SUMMARY + + # Overall Summary + LINE=$(jq -r '.summary.linecoverage // "N/A"' $COVERAGE_JSON) + BRANCH=$(jq -r '.summary.branchcoverage // "N/A"' $COVERAGE_JSON) + COVERED_LINES=$(jq -r '.summary.coveredlines // 0' $COVERAGE_JSON) + COVERABLE_LINES=$(jq -r '.summary.coverablelines // 0' $COVERAGE_JSON) + COVERED_BRANCHES=$(jq -r '.summary.coveredbranches // 0' $COVERAGE_JSON) + TOTAL_BRANCHES=$(jq -r '.summary.totalbranches // 0' $COVERAGE_JSON) + + echo "## Overall Coverage" >> $GITHUB_STEP_SUMMARY + echo "" >> $GITHUB_STEP_SUMMARY + echo "| Metric | Coverage | Details |" >> $GITHUB_STEP_SUMMARY + echo "|--------|----------|---------|" >> $GITHUB_STEP_SUMMARY + echo "| **Line Coverage** | **$LINE%** | $COVERED_LINES / $COVERABLE_LINES lines |" >> $GITHUB_STEP_SUMMARY + echo "| **Branch Coverage** | **$BRANCH%** | $COVERED_BRANCHES / $TOTAL_BRANCHES branches |" >> $GITHUB_STEP_SUMMARY + echo "" >> $GITHUB_STEP_SUMMARY + + # Per-Assembly Coverage + echo "## Coverage by Assembly" >> $GITHUB_STEP_SUMMARY + echo "" >> $GITHUB_STEP_SUMMARY + echo "| Assembly | Line Coverage | Branch Coverage |" >> $GITHUB_STEP_SUMMARY + echo "|----------|---------------|-----------------|" >> $GITHUB_STEP_SUMMARY + jq -r '.assemblies[] | "| \(.name) | \(.linecoverage)% | \(.branchcoverage)% |"' $COVERAGE_JSON >> $GITHUB_STEP_SUMMARY + echo "" >> $GITHUB_STEP_SUMMARY + + # Files below 80% coverage + echo "## โš ๏ธ Files Below 80% Line Coverage" >> $GITHUB_STEP_SUMMARY + echo "" >> $GITHUB_STEP_SUMMARY + if jq -e '.assemblies[].classes[] | select(.linecoverage < 80)' $COVERAGE_JSON > /dev/null 2>&1; then + echo "| Class | Line Coverage | Covered/Total Lines |" >> $GITHUB_STEP_SUMMARY + echo "|-------|---------------|---------------------|" >> $GITHUB_STEP_SUMMARY + jq -r '.assemblies[].classes[] | select(.linecoverage < 80) | "| \(.name) | \(.linecoverage)% | \(.coveredlines)/\(.coverablelines) |"' $COVERAGE_JSON >> $GITHUB_STEP_SUMMARY + else + echo "โœ… All files have at least 80% line coverage!" >> $GITHUB_STEP_SUMMARY + fi + echo "" >> $GITHUB_STEP_SUMMARY + echo "๐Ÿ“„ Full HTML coverage report is available in the workflow artifacts." >> $GITHUB_STEP_SUMMARY + - name: Add PR Comment if: github.event.pull_request.head.repo.fork == false uses: marocchino/sticky-pull-request-comment@v2 From fb3aaa2e390dbdce68db1269efdaece9f28e4686 Mon Sep 17 00:00:00 2001 From: Hardi Shah Date: Mon, 29 Dec 2025 13:46:16 +0530 Subject: [PATCH 08/13] Enhance code coverage summary by adding checks for assembly data availability and improving handling of low coverage classes --- .github/workflows/dotnet.yml | 17 +++++++++++------ 1 file changed, 11 insertions(+), 6 deletions(-) diff --git a/.github/workflows/dotnet.yml b/.github/workflows/dotnet.yml index d9e0d29..b2d376e 100644 --- a/.github/workflows/dotnet.yml +++ b/.github/workflows/dotnet.yml @@ -128,18 +128,23 @@ jobs: # Per-Assembly Coverage echo "## Coverage by Assembly" >> $GITHUB_STEP_SUMMARY echo "" >> $GITHUB_STEP_SUMMARY - echo "| Assembly | Line Coverage | Branch Coverage |" >> $GITHUB_STEP_SUMMARY - echo "|----------|---------------|-----------------|" >> $GITHUB_STEP_SUMMARY - jq -r '.assemblies[] | "| \(.name) | \(.linecoverage)% | \(.branchcoverage)% |"' $COVERAGE_JSON >> $GITHUB_STEP_SUMMARY - echo "" >> $GITHUB_STEP_SUMMARY + if jq -e '.assemblies' $COVERAGE_JSON > /dev/null 2>&1; then + echo "| Assembly | Line Coverage | Branch Coverage |" >> $GITHUB_STEP_SUMMARY + echo "|----------|---------------|-----------------|" >> $GITHUB_STEP_SUMMARY + jq -r '.assemblies[]? | "| \(.name) | \(.linecoverage)% | \(.branchcoverage)% |"' $COVERAGE_JSON >> $GITHUB_STEP_SUMMARY + echo "" >> $GITHUB_STEP_SUMMARY + fi # Files below 80% coverage echo "## โš ๏ธ Files Below 80% Line Coverage" >> $GITHUB_STEP_SUMMARY echo "" >> $GITHUB_STEP_SUMMARY - if jq -e '.assemblies[].classes[] | select(.linecoverage < 80)' $COVERAGE_JSON > /dev/null 2>&1; then + + LOW_COVERAGE=$(jq -r '[.assemblies[]?.classes[]? | select(.linecoverage != null and .linecoverage < 80)] | length' $COVERAGE_JSON) + + if [ "$LOW_COVERAGE" -gt 0 ]; then echo "| Class | Line Coverage | Covered/Total Lines |" >> $GITHUB_STEP_SUMMARY echo "|-------|---------------|---------------------|" >> $GITHUB_STEP_SUMMARY - jq -r '.assemblies[].classes[] | select(.linecoverage < 80) | "| \(.name) | \(.linecoverage)% | \(.coveredlines)/\(.coverablelines) |"' $COVERAGE_JSON >> $GITHUB_STEP_SUMMARY + jq -r '.assemblies[]?.classes[]? | select(.linecoverage != null and .linecoverage < 80) | "| \(.name) | \(.linecoverage)% | \(.coveredlines)/\(.coverablelines) |"' $COVERAGE_JSON >> $GITHUB_STEP_SUMMARY else echo "โœ… All files have at least 80% line coverage!" >> $GITHUB_STEP_SUMMARY fi From ae0aa4f3f63ef86e7e468df574cf99ff57604275 Mon Sep 17 00:00:00 2001 From: Hardi Shah Date: Mon, 29 Dec 2025 14:25:42 +0530 Subject: [PATCH 09/13] Refactor code coverage reporting by simplifying steps and enhancing summary output --- .github/workflows/dotnet.yml | 64 ++++++------------------------------ 1 file changed, 10 insertions(+), 54 deletions(-) diff --git a/.github/workflows/dotnet.yml b/.github/workflows/dotnet.yml index b2d376e..36515fc 100644 --- a/.github/workflows/dotnet.yml +++ b/.github/workflows/dotnet.yml @@ -48,68 +48,31 @@ jobs: - name: Publish Test Results uses: dorny/test-reporter@v2 - id: test-results if: github.event.pull_request.head.repo.fork == false with: name: Test Results (Unit & Module) path: "**/*_test_results.trx" reporter: dotnet-trx - - name: Combine Test Results into PR Comment - if: github.event.pull_request.head.repo.fork == false - run: | - echo "# Test & Coverage Report" > results.md - echo "" >> results.md - echo "## Test Results Summary" >> results.md - echo "" >> results.md - echo "| Metric | Count |" >> results.md - echo "|--------|-------|" >> results.md - echo "| โœ… Passed | ${{ steps.test-results.outputs.passed }} |" >> results.md - echo "| โŒ Failed | ${{ steps.test-results.outputs.failed }} |" >> results.md - echo "| โญ๏ธ Skipped | ${{ steps.test-results.outputs.skipped }} |" >> results.md - echo "" >> results.md - - name: Install ReportGenerator - if: github.event.pull_request.head.repo.fork == false run: dotnet tool install --global dotnet-reportgenerator-globaltool - - name: Generate Code Coverage Report (HTML + Cobertura + JSON) - if: github.event.pull_request.head.repo.fork == false + - name: Generate Code Coverage Report run: | reportgenerator \ -reports:"source/**/TestResults/**/coverage.cobertura.xml" \ -targetdir:"coverlet/reports" \ -reporttypes:"Html;HtmlSummary;Cobertura;JsonSummary" - - name: Add Code Coverage Summary to PR Comment - if: github.event.pull_request.head.repo.fork == false - run: | - COVERAGE_JSON=coverlet/reports/Summary.json - LINE=$(jq -r '.summary.linecoverage // "N/A"' $COVERAGE_JSON) - BRANCH=$(jq -r '.summary.branchcoverage // "N/A"' $COVERAGE_JSON) - echo "## ๐Ÿ“Š Code Coverage Summary" >> results.md - echo "" >> results.md - echo "- Line coverage: $LINE%" >> results.md - echo "- Branch coverage: $BRANCH%" >> results.md - echo "" >> results.md - echo "### Files below 80% line coverage:" >> results.md - if jq -e '.assemblies' $COVERAGE_JSON > /dev/null 2>&1; then - jq -r '.assemblies[].classes[] | select(.linecoverage < 80) | "\(.name): \(.linecoverage)%"' $COVERAGE_JSON >> results.md || echo "None" >> results.md - else - echo "No detailed file coverage data available" >> results.md - fi - echo "" >> results.md - - - name: Publish Coverage to Workflow Summary - if: always() + - name: Publish Code Coverage to Workflow Summary + if: success() || failure() run: | COVERAGE_JSON=coverlet/reports/Summary.json - # Add header echo "# ๐Ÿ“Š Code Coverage Report" >> $GITHUB_STEP_SUMMARY echo "" >> $GITHUB_STEP_SUMMARY - # Overall Summary + # Extract coverage metrics LINE=$(jq -r '.summary.linecoverage // "N/A"' $COVERAGE_JSON) BRANCH=$(jq -r '.summary.branchcoverage // "N/A"' $COVERAGE_JSON) COVERED_LINES=$(jq -r '.summary.coveredlines // 0' $COVERAGE_JSON) @@ -117,6 +80,7 @@ jobs: COVERED_BRANCHES=$(jq -r '.summary.coveredbranches // 0' $COVERAGE_JSON) TOTAL_BRANCHES=$(jq -r '.summary.totalbranches // 0' $COVERAGE_JSON) + # Overall summary table echo "## Overall Coverage" >> $GITHUB_STEP_SUMMARY echo "" >> $GITHUB_STEP_SUMMARY echo "| Metric | Coverage | Details |" >> $GITHUB_STEP_SUMMARY @@ -125,17 +89,17 @@ jobs: echo "| **Branch Coverage** | **$BRANCH%** | $COVERED_BRANCHES / $TOTAL_BRANCHES branches |" >> $GITHUB_STEP_SUMMARY echo "" >> $GITHUB_STEP_SUMMARY - # Per-Assembly Coverage - echo "## Coverage by Assembly" >> $GITHUB_STEP_SUMMARY - echo "" >> $GITHUB_STEP_SUMMARY + # Assembly-level coverage if jq -e '.assemblies' $COVERAGE_JSON > /dev/null 2>&1; then + echo "## Coverage by Assembly" >> $GITHUB_STEP_SUMMARY + echo "" >> $GITHUB_STEP_SUMMARY echo "| Assembly | Line Coverage | Branch Coverage |" >> $GITHUB_STEP_SUMMARY echo "|----------|---------------|-----------------|" >> $GITHUB_STEP_SUMMARY jq -r '.assemblies[]? | "| \(.name) | \(.linecoverage)% | \(.branchcoverage)% |"' $COVERAGE_JSON >> $GITHUB_STEP_SUMMARY echo "" >> $GITHUB_STEP_SUMMARY fi - # Files below 80% coverage + # Low coverage files echo "## โš ๏ธ Files Below 80% Line Coverage" >> $GITHUB_STEP_SUMMARY echo "" >> $GITHUB_STEP_SUMMARY @@ -151,13 +115,6 @@ jobs: echo "" >> $GITHUB_STEP_SUMMARY echo "๐Ÿ“„ Full HTML coverage report is available in the workflow artifacts." >> $GITHUB_STEP_SUMMARY - - name: Add PR Comment - if: github.event.pull_request.head.repo.fork == false - uses: marocchino/sticky-pull-request-comment@v2 - with: - recreate: true - path: results.md - - name: Upload TRX as Artifact (Fork PR fallback) if: github.event.pull_request.head.repo.fork == true uses: actions/upload-artifact@v5 @@ -165,8 +122,7 @@ jobs: name: test-results path: "**/*_test_results.trx" - - name: Upload Code Coverage Report as Artifact - if: github.event.pull_request.head.repo.fork == false + - name: Upload Code Coverage Report uses: actions/upload-artifact@v5 with: name: code-coverage-report From 5fc4e99fe6debb504ecad701e6d232ea2477adb0 Mon Sep 17 00:00:00 2001 From: Hardi Shah Date: Mon, 29 Dec 2025 14:31:37 +0530 Subject: [PATCH 10/13] Refactor code coverage reporting by integrating ReportGenerator and simplifying summary publication --- .github/workflows/dotnet.yml | 68 +++++------------------------------- 1 file changed, 9 insertions(+), 59 deletions(-) diff --git a/.github/workflows/dotnet.yml b/.github/workflows/dotnet.yml index 36515fc..7e94c9b 100644 --- a/.github/workflows/dotnet.yml +++ b/.github/workflows/dotnet.yml @@ -54,66 +54,16 @@ jobs: path: "**/*_test_results.trx" reporter: dotnet-trx - - name: Install ReportGenerator - run: dotnet tool install --global dotnet-reportgenerator-globaltool - - - name: Generate Code Coverage Report - run: | - reportgenerator \ - -reports:"source/**/TestResults/**/coverage.cobertura.xml" \ - -targetdir:"coverlet/reports" \ - -reporttypes:"Html;HtmlSummary;Cobertura;JsonSummary" - - - name: Publish Code Coverage to Workflow Summary - if: success() || failure() - run: | - COVERAGE_JSON=coverlet/reports/Summary.json - - echo "# ๐Ÿ“Š Code Coverage Report" >> $GITHUB_STEP_SUMMARY - echo "" >> $GITHUB_STEP_SUMMARY - - # Extract coverage metrics - LINE=$(jq -r '.summary.linecoverage // "N/A"' $COVERAGE_JSON) - BRANCH=$(jq -r '.summary.branchcoverage // "N/A"' $COVERAGE_JSON) - COVERED_LINES=$(jq -r '.summary.coveredlines // 0' $COVERAGE_JSON) - COVERABLE_LINES=$(jq -r '.summary.coverablelines // 0' $COVERAGE_JSON) - COVERED_BRANCHES=$(jq -r '.summary.coveredbranches // 0' $COVERAGE_JSON) - TOTAL_BRANCHES=$(jq -r '.summary.totalbranches // 0' $COVERAGE_JSON) - - # Overall summary table - echo "## Overall Coverage" >> $GITHUB_STEP_SUMMARY - echo "" >> $GITHUB_STEP_SUMMARY - echo "| Metric | Coverage | Details |" >> $GITHUB_STEP_SUMMARY - echo "|--------|----------|---------|" >> $GITHUB_STEP_SUMMARY - echo "| **Line Coverage** | **$LINE%** | $COVERED_LINES / $COVERABLE_LINES lines |" >> $GITHUB_STEP_SUMMARY - echo "| **Branch Coverage** | **$BRANCH%** | $COVERED_BRANCHES / $TOTAL_BRANCHES branches |" >> $GITHUB_STEP_SUMMARY - echo "" >> $GITHUB_STEP_SUMMARY - - # Assembly-level coverage - if jq -e '.assemblies' $COVERAGE_JSON > /dev/null 2>&1; then - echo "## Coverage by Assembly" >> $GITHUB_STEP_SUMMARY - echo "" >> $GITHUB_STEP_SUMMARY - echo "| Assembly | Line Coverage | Branch Coverage |" >> $GITHUB_STEP_SUMMARY - echo "|----------|---------------|-----------------|" >> $GITHUB_STEP_SUMMARY - jq -r '.assemblies[]? | "| \(.name) | \(.linecoverage)% | \(.branchcoverage)% |"' $COVERAGE_JSON >> $GITHUB_STEP_SUMMARY - echo "" >> $GITHUB_STEP_SUMMARY - fi - - # Low coverage files - echo "## โš ๏ธ Files Below 80% Line Coverage" >> $GITHUB_STEP_SUMMARY - echo "" >> $GITHUB_STEP_SUMMARY - - LOW_COVERAGE=$(jq -r '[.assemblies[]?.classes[]? | select(.linecoverage != null and .linecoverage < 80)] | length' $COVERAGE_JSON) + - name: Generate and Publish Code Coverage Report + uses: danielpalme/ReportGenerator-GitHub-Action@5.4.2 + with: + reports: 'source/**/TestResults/**/coverage.cobertura.xml' + targetdir: 'coverlet/reports' + reporttypes: 'Html;HtmlSummary;Cobertura;MarkdownSummaryGithub' - if [ "$LOW_COVERAGE" -gt 0 ]; then - echo "| Class | Line Coverage | Covered/Total Lines |" >> $GITHUB_STEP_SUMMARY - echo "|-------|---------------|---------------------|" >> $GITHUB_STEP_SUMMARY - jq -r '.assemblies[]?.classes[]? | select(.linecoverage != null and .linecoverage < 80) | "| \(.name) | \(.linecoverage)% | \(.coveredlines)/\(.coverablelines) |"' $COVERAGE_JSON >> $GITHUB_STEP_SUMMARY - else - echo "โœ… All files have at least 80% line coverage!" >> $GITHUB_STEP_SUMMARY - fi - echo "" >> $GITHUB_STEP_SUMMARY - echo "๐Ÿ“„ Full HTML coverage report is available in the workflow artifacts." >> $GITHUB_STEP_SUMMARY + - name: Publish Code Coverage Summary + if: success() || failure() + run: cat coverlet/reports/SummaryGithub.md >> $GITHUB_STEP_SUMMARY - name: Upload TRX as Artifact (Fork PR fallback) if: github.event.pull_request.head.repo.fork == true From 3cb7bce62461ec0e6d3be944062b5840d81ab4ef Mon Sep 17 00:00:00 2001 From: Hardi Shah Date: Mon, 29 Dec 2025 14:38:04 +0530 Subject: [PATCH 11/13] Enhance code coverage reporting by adding JSON summary output and enforcing an 80% coverage threshold --- .github/workflows/dotnet.yml | 17 ++++++++++++++++- 1 file changed, 16 insertions(+), 1 deletion(-) diff --git a/.github/workflows/dotnet.yml b/.github/workflows/dotnet.yml index 7e94c9b..0239fb4 100644 --- a/.github/workflows/dotnet.yml +++ b/.github/workflows/dotnet.yml @@ -59,12 +59,27 @@ jobs: with: reports: 'source/**/TestResults/**/coverage.cobertura.xml' targetdir: 'coverlet/reports' - reporttypes: 'Html;HtmlSummary;Cobertura;MarkdownSummaryGithub' + reporttypes: 'Html;HtmlSummary;Cobertura;MarkdownSummaryGithub;JsonSummary' - name: Publish Code Coverage Summary if: success() || failure() run: cat coverlet/reports/SummaryGithub.md >> $GITHUB_STEP_SUMMARY + - name: Enforce 80% Code Coverage Threshold + run: | + COVERAGE_JSON=coverlet/reports/Summary.json + LINE_COVERAGE=$(jq -r '.summary.linecoverage // 0' $COVERAGE_JSON) + + echo "Current Line Coverage: $LINE_COVERAGE%" + + if (( $(echo "$LINE_COVERAGE < 80" | bc -l) )); then + echo "โŒ Code coverage is below 80% threshold!" + echo "Required: 80%, Current: $LINE_COVERAGE%" + exit 1 + else + echo "โœ… Code coverage meets the 80% threshold" + fi + - name: Upload TRX as Artifact (Fork PR fallback) if: github.event.pull_request.head.repo.fork == true uses: actions/upload-artifact@v5 From 565ca6164b016b9e95e9441ba7413703842b2ca9 Mon Sep 17 00:00:00 2001 From: Hardi Shah Date: Mon, 29 Dec 2025 15:34:13 +0530 Subject: [PATCH 12/13] Enhance code coverage reporting by adding module test execution and generating detailed PR comments with test and coverage results --- .github/workflows/dotnet.yml | 54 ++++++++++++++++++++++++++++++++++-- 1 file changed, 51 insertions(+), 3 deletions(-) diff --git a/.github/workflows/dotnet.yml b/.github/workflows/dotnet.yml index 0239fb4..74e8285 100644 --- a/.github/workflows/dotnet.yml +++ b/.github/workflows/dotnet.yml @@ -17,6 +17,7 @@ env: BUILD_CONFIGURATION: "Release" SOLUTION_PATH: source/AAS.TwinEngine.DataEngine.sln TEST_PROJECT: source/AAS.TwinEngine.DataEngine.UnitTests/AAS.TwinEngine.DataEngine.UnitTests.csproj + MODULE_TEST_PROJECT: source/AAS.TwinEngine.DataEngine.IntegrationTests/AAS.TwinEngine.DataEngine.ModuleTests.csproj jobs: @@ -46,22 +47,26 @@ jobs: - name: Run Unit Tests run: dotnet test ${{ env.TEST_PROJECT }} --configuration ${{ env.BUILD_CONFIGURATION }} --no-build --logger "trx;LogFileName=unit_test_results.trx" --collect:"XPlat Code Coverage" --settings source/coverlet.runsettings + - name: Run Module Tests + run: dotnet test ${{ env.MODULE_TEST_PROJECT }} --configuration ${{ env.BUILD_CONFIGURATION }} --no-build --logger "trx;LogFileName=module_test_results.trx" --collect:"XPlat Code Coverage" --settings source/coverlet.runsettings + - name: Publish Test Results uses: dorny/test-reporter@v2 + id: test-results if: github.event.pull_request.head.repo.fork == false with: name: Test Results (Unit & Module) path: "**/*_test_results.trx" reporter: dotnet-trx - - name: Generate and Publish Code Coverage Report + - name: Generate Combined Code Coverage Report uses: danielpalme/ReportGenerator-GitHub-Action@5.4.2 with: reports: 'source/**/TestResults/**/coverage.cobertura.xml' targetdir: 'coverlet/reports' reporttypes: 'Html;HtmlSummary;Cobertura;MarkdownSummaryGithub;JsonSummary' - - - name: Publish Code Coverage Summary + + - name: Publish Code Coverage to Workflow Summary if: success() || failure() run: cat coverlet/reports/SummaryGithub.md >> $GITHUB_STEP_SUMMARY @@ -80,6 +85,49 @@ jobs: echo "โœ… Code coverage meets the 80% threshold" fi + - name: Create PR Comment with Test & Coverage Results + if: github.event.pull_request.head.repo.fork == false + run: | + COVERAGE_JSON=coverlet/reports/Summary.json + LINE=$(jq -r '.summary.linecoverage // "N/A"' $COVERAGE_JSON) + BRANCH=$(jq -r '.summary.branchcoverage // "N/A"' $COVERAGE_JSON) + COVERED_LINES=$(jq -r '.summary.coveredlines // 0' $COVERAGE_JSON) + COVERABLE_LINES=$(jq -r '.summary.coverablelines // 0' $COVERAGE_JSON) + + echo "# ๐Ÿงช Test & Coverage Report" > results.md + echo "" >> results.md + + echo "## Test Results Summary" >> results.md + echo "" >> results.md + echo "| Metric | Count |" >> results.md + echo "|--------|-------|" >> results.md + echo "| โœ… Passed | ${{ steps.test-results.outputs.passed }} |" >> results.md + echo "| โŒ Failed | ${{ steps.test-results.outputs.failed }} |" >> results.md + echo "| โญ๏ธ Skipped | ${{ steps.test-results.outputs.skipped }} |" >> results.md + echo "" >> results.md + + echo "## ๐Ÿ“Š Code Coverage Summary" >> results.md + echo "" >> results.md + echo "| Metric | Coverage | Details |" >> results.md + echo "|--------|----------|---------|" >> results.md + echo "| **Line Coverage** | **$LINE%** | $COVERED_LINES / $COVERABLE_LINES lines |" >> results.md + echo "| **Branch Coverage** | **$BRANCH%** | Combined Unit + Module Tests |" >> results.md + echo "" >> results.md + + if (( $(echo "$LINE < 80" | bc -l) )); then + echo "โš ๏ธ **Warning:** Code coverage is below 80% threshold" >> results.md + echo "" >> results.md + fi + + echo "[๐Ÿ“„ View Full Coverage Report in Workflow Artifacts](${{ github.server_url }}/${{ github.repository }}/actions/runs/${{ github.run_id }})" >> results.md + + - name: Add PR Comment + if: github.event.pull_request.head.repo.fork == false + uses: marocchino/sticky-pull-request-comment@v2 + with: + recreate: true + path: results.md + - name: Upload TRX as Artifact (Fork PR fallback) if: github.event.pull_request.head.repo.fork == true uses: actions/upload-artifact@v5 From 4904773f0cb325779f62a21771c1fd6a90b1d247 Mon Sep 17 00:00:00 2001 From: Hardi Shah Date: Mon, 29 Dec 2025 15:39:17 +0530 Subject: [PATCH 13/13] Refactor code coverage reporting by removing 80% threshold enforcement and enhancing PR comment generation with detailed coverage metrics --- .github/workflows/dotnet.yml | 70 +++++++++--------------------------- 1 file changed, 17 insertions(+), 53 deletions(-) diff --git a/.github/workflows/dotnet.yml b/.github/workflows/dotnet.yml index 74e8285..61983a3 100644 --- a/.github/workflows/dotnet.yml +++ b/.github/workflows/dotnet.yml @@ -48,7 +48,7 @@ jobs: run: dotnet test ${{ env.TEST_PROJECT }} --configuration ${{ env.BUILD_CONFIGURATION }} --no-build --logger "trx;LogFileName=unit_test_results.trx" --collect:"XPlat Code Coverage" --settings source/coverlet.runsettings - name: Run Module Tests - run: dotnet test ${{ env.MODULE_TEST_PROJECT }} --configuration ${{ env.BUILD_CONFIGURATION }} --no-build --logger "trx;LogFileName=module_test_results.trx" --collect:"XPlat Code Coverage" --settings source/coverlet.runsettings + run: dotnet test ${{ env.MODULE_TEST_PROJECT }} --configuration Release --no-build --logger "trx;LogFileName=module_test_results.trx" --collect:"XPlat Code Coverage" --settings source/coverlet.runsettings - name: Publish Test Results uses: dorny/test-reporter@v2 @@ -70,63 +70,27 @@ jobs: if: success() || failure() run: cat coverlet/reports/SummaryGithub.md >> $GITHUB_STEP_SUMMARY - - name: Enforce 80% Code Coverage Threshold - run: | - COVERAGE_JSON=coverlet/reports/Summary.json - LINE_COVERAGE=$(jq -r '.summary.linecoverage // 0' $COVERAGE_JSON) - - echo "Current Line Coverage: $LINE_COVERAGE%" - - if (( $(echo "$LINE_COVERAGE < 80" | bc -l) )); then - echo "โŒ Code coverage is below 80% threshold!" - echo "Required: 80%, Current: $LINE_COVERAGE%" - exit 1 - else - echo "โœ… Code coverage meets the 80% threshold" - fi - - - name: Create PR Comment with Test & Coverage Results + - name: Generate and Post PR Comment with Coverage if: github.event.pull_request.head.repo.fork == false - run: | - COVERAGE_JSON=coverlet/reports/Summary.json - LINE=$(jq -r '.summary.linecoverage // "N/A"' $COVERAGE_JSON) - BRANCH=$(jq -r '.summary.branchcoverage // "N/A"' $COVERAGE_JSON) - COVERED_LINES=$(jq -r '.summary.coveredlines // 0' $COVERAGE_JSON) - COVERABLE_LINES=$(jq -r '.summary.coverablelines // 0' $COVERAGE_JSON) - - echo "# ๐Ÿงช Test & Coverage Report" > results.md - echo "" >> results.md - - echo "## Test Results Summary" >> results.md - echo "" >> results.md - echo "| Metric | Count |" >> results.md - echo "|--------|-------|" >> results.md - echo "| โœ… Passed | ${{ steps.test-results.outputs.passed }} |" >> results.md - echo "| โŒ Failed | ${{ steps.test-results.outputs.failed }} |" >> results.md - echo "| โญ๏ธ Skipped | ${{ steps.test-results.outputs.skipped }} |" >> results.md - echo "" >> results.md - - echo "## ๐Ÿ“Š Code Coverage Summary" >> results.md - echo "" >> results.md - echo "| Metric | Coverage | Details |" >> results.md - echo "|--------|----------|---------|" >> results.md - echo "| **Line Coverage** | **$LINE%** | $COVERED_LINES / $COVERABLE_LINES lines |" >> results.md - echo "| **Branch Coverage** | **$BRANCH%** | Combined Unit + Module Tests |" >> results.md - echo "" >> results.md - - if (( $(echo "$LINE < 80" | bc -l) )); then - echo "โš ๏ธ **Warning:** Code coverage is below 80% threshold" >> results.md - echo "" >> results.md - fi - - echo "[๐Ÿ“„ View Full Coverage Report in Workflow Artifacts](${{ github.server_url }}/${{ github.repository }}/actions/runs/${{ github.run_id }})" >> results.md - - - name: Add PR Comment + uses: irongut/CodeCoverageSummary@v1.3.0 + with: + filename: 'coverlet/reports/Cobertura.xml' + badge: true + fail_below_min: true + format: markdown + hide_branch_rate: false + hide_complexity: false + indicators: true + output: both + thresholds: '80 80' + + - name: Add Test Results to PR Comment if: github.event.pull_request.head.repo.fork == false uses: marocchino/sticky-pull-request-comment@v2 with: recreate: true - path: results.md + path: code-coverage-results.md + header: test-coverage-report - name: Upload TRX as Artifact (Fork PR fallback) if: github.event.pull_request.head.repo.fork == true