From 41d35fe745e7b474763195355ab7b9e965666cbf Mon Sep 17 00:00:00 2001 From: Thilo Schwarz Date: Sat, 27 Jun 2026 19:02:19 +0200 Subject: [PATCH] Add JaCoCo coverage parsing to `publish-report` action; enhance Markdown report with coverage details. --- .github/actions/publish-report/action.yml | 53 +++++++++++++++++++---- 1 file changed, 44 insertions(+), 9 deletions(-) diff --git a/.github/actions/publish-report/action.yml b/.github/actions/publish-report/action.yml index 48b1678..9e9d00b 100644 --- a/.github/actions/publish-report/action.yml +++ b/.github/actions/publish-report/action.yml @@ -25,11 +25,12 @@ runs: mkdir -p reports python3 - <<'EOF' import glob, xml.etree.ElementTree as ET - + + # --- JUnit --- files = glob.glob("junit-short/*.xml") total_tests = total_failures = total_errors = total_skipped = 0 - rows = [] - + test_rows = [] + for f in sorted(files): tree = ET.parse(f) r = tree.getroot() @@ -46,22 +47,56 @@ runs: total_failures += failures total_errors += errors total_skipped += skipped - rows.append(f"| {status} | {name} | {tests} | {passed} | {failures + errors} | {skipped} |") - + test_rows.append(f"| {status} | {name} | {tests} | {passed} | {failures + errors} | {skipped} |") + total_passed = total_tests - total_failures - total_errors - total_skipped overall = "✅ All tests passed" if (total_failures + total_errors) == 0 else "❌ Some tests failed" - + + # --- JaCoCo --- + def counter(el, type_): + c = next((x for x in el.findall("counter") if x.get("type") == type_), None) + if c is None: + return 0, 0 + covered = int(c.get("covered", 0)) + missed = int(c.get("missed", 0)) + return covered, covered + missed + + cov_rows = [] + jacoco_files = glob.glob("**/target/site/jacoco/jacoco.xml", recursive=True) + + for jf in sorted(jacoco_files): + tree = ET.parse(jf) + root = tree.getroot() + for pkg in root.findall("package"): + name = pkg.get("name", "").replace("/", ".") + line_cov, line_total = counter(pkg, "LINE") + branch_cov, branch_total = counter(pkg, "BRANCH") + line_pct = f"{100 * line_cov / line_total:.0f}%" if line_total else "n/a" + branch_pct = f"{100 * branch_cov / branch_total:.0f}%" if branch_total else "n/a" + cov_rows.append(f"| {name} | {line_pct} ({line_cov}/{line_total}) | {branch_pct} ({branch_cov}/{branch_total}) |") + + # --- Markdown zusammenbauen --- md = ( "# Test Report\n\n" f"**{overall}**\n\n" + "## Test Results\n\n" "| | Tests | Passed | Failed | Skipped |\n" "|---|---|---|---|---|\n" f"| **Total** | {total_tests} | {total_passed} | {total_failures + total_errors} | {total_skipped} |\n\n" - "## Details\n\n" + "### Details\n\n" "| Status | Suite | Tests | Passed | Failed | Skipped |\n" "|---|---|---|---|---|---|\n" - ) + "\n".join(rows) + "\n" - + ) + "\n".join(test_rows) + "\n\n" + + if cov_rows: + md += ( + "## Coverage\n\n" + "| Package | Line Coverage | Branch Coverage |\n" + "|---|---|---|\n" + ) + "\n".join(cov_rows) + "\n" + else: + md += "_No JaCoCo report found._\n" + with open("reports/index.md", "w") as out: out.write(md) print(md)