Install any skill in seconds. Free to start, no credit card required.
Get Started Free →Generate comprehensive test reports with metrics, coverage, and visualizations. Use when performing specialized testing. Trigger with phrases like "generate test report", "create test documentation", or "show test metrics".
.claude/skills/jeremylongshore-generating-test-reports/SKILL.md| Test case | Without → With | Effect | Δ tokens | Δ turns |
|---|---|---|---|---|
| case-02 | ✗→✓ | ▲ Improved | 13% | 0% |
| case-08 | ✗→✓ | ▲ Improved | 41% | 0% |
| case-09 | ✗→✓ | ▲ Improved | 25% | 0% |
| case-10 | ✗→✓ | ▲ Improved | 55% | 0% |
| case-12 | ✗→✓ | ▲ Improved | -22% | 0% |
Generate structured, human-readable test reports from raw test runner output including JUnit XML, Jest JSON, pytest results, and coverage data. Produces Markdown summaries, HTML dashboards, and CI-compatible annotations.
--json, pytest --junitxml, or TAP)coverage-summary.json, lcov.info, or coverage.xml)**/junit.xml, **/test-results.json, **/coverage/lcov.info).test-report.md -- Markdown summary with pass/fail table, coverage stats, and failure detailstest-report.html -- Self-contained HTML report (optional)::error format)| Error | Cause | Solution | |-------|-------|---------| | No test result files found | Tests did not run or output path is incorrect | Verify test runner --outputFile or --junitxml flag; check the output directory exists | | Malformed JUnit XML | Test runner crashed mid-output or encoding issues | Validate XML with xmllint; re-run failed test suite; check for binary output in XML | | Coverage data missing | Tests ran without --coverage flag | Add --coverage to the test command; verify coverage reporter is configured | | Metric trend unavailable | No previous report to compare against | Generate baseline report first; store reports as CI artifacts for historical comparison | | Report exceeds GitHub comment limit | Too many failures produce oversized Markdown | Truncate failure details to top 20; link to full report artifact |
Markdown report structure:
markdown## Test Results -- 2026-03-10 | Metric | Value | |--------|-------| | Total Tests | 847 | # 847 = configured value | Passed | 839 (99.1%) | # 839 = configured value | Failed | 5 | | Skipped | 3 | | Duration | 42.3s | ### Coverage | Category | Current | Threshold | Status | |----------|---------|-----------|--------| | Lines | 87.2% | 80% | PASS | | Branches | 74.1% | 70% | PASS | | Functions | 91.5% | 85% | PASS | ### Failed Tests 1. `src/utils/parser.test.ts` -- "handles malformed input" -- Expected Error but received null 2. `src/api/auth.test.ts` -- "rejects expired tokens" -- Timeout after 5000ms
GitHub Actions job summary integration:
bashcat test-report.md >> "$GITHUB_STEP_SUMMARY"
--json reporter: https://jestjs.io/docs/cli#--json| Case | Status | Duration (ms) | Turns | Tokens | Tool calls | ||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| Without | With | Δ | Without | With | Δ | Without | With | Δ | Without | With | Δ | ||
case-01 | fail→fail | 22,774 | 32,620 | +43% | 1 | 1 | 0% | 5,073 | 7,004 | +38% | 0 | 0 | — |
case-02 | fail→pass | 41,171 | 35,787 | -13% | 1 | 1 | 0% | 8,250 | 9,304 | +13% | 0 | 0 | — |
case-03 | fail→fail | 34,892 | 41,840 | +20% | 1 | 1 | 0% | 6,800 | 8,318 | +22% | 0 | 0 | — |
case-04 | pass→pass | 21,187 | 13,193 | -38% | 1 | 1 | 0% | 3,139 | 3,806 | +21% | 0 | 0 | — |
case-05 | pass→pass | 12,492 | 7,709 | -38% | 1 | 1 | 0% | 1,492 | 2,480 | +66% | 0 | 0 | — |
case-06 | pass→pass | 9,699 | 9,232 | -5% | 1 | 1 | 0% | 982 | 1,799 | +83% | 0 | 0 | — |
case-07 | fail→fail | 19,230 | 12,524 | -35% | 1 | 1 | 0% | 2,578 | 3,248 | +26% | 0 | 0 | — |
case-08 | fail→pass | 16,099 | 22,839 | +42% | 1 | 1 | 0% | 2,977 | 4,208 | +41% | 0 | 0 | — |
case-09 | fail→pass | 13,290 | 10,422 | -22% | 1 | 1 | 0% | 2,572 | 3,224 | +25% | 0 | 0 | — |
case-10 | fail→pass | 16,301 | 17,053 | +5% | 1 | 1 | 0% | 2,258 | 3,511 | +55% | 0 | 0 | — |
case-11 | fail→fail | 13,823 | 8,474 | -39% | 1 | 1 | 0% | 1,705 | 2,724 | +60% | 0 | 0 | — |
case-12 | fail→pass | 8,551 | 6,410 | -25% | 1 | 1 | 0% | 1,733 | 1,358 | -22% | 0 | 0 | — |
case-13 | fail→pass | 2,752 | 4,164 | +51% | 1 | 1 | 0% | 448 | 1,578 | +252% | 0 | 0 | — |
case-14 | pass→pass | 10,835 | 16,288 | +50% | 1 | 1 | 0% | 2,170 | 3,482 | +60% | 0 | 0 | — |
case-15 | pass→pass | 11,168 | 9,077 | -19% | 1 | 1 | 0% | 2,263 | 1,953 | -14% | 0 | 0 | — |
case-16 | fail→fail | 17,136 | 15,096 | -12% | 1 | 1 | 0% | 2,107 | 3,130 | +49% | 0 | 0 | — |
case-17 | fail→fail | 15,714 | 12,833 | -18% | 1 | 1 | 0% | 2,327 | 2,262 | -3% | 0 | 0 | — |
case-18 | pass→pass | 16,388 | 13,290 | -19% | 1 | 1 | 0% | 1,963 | 2,589 | +32% | 0 | 0 | — |
case-19 | fail→pass | 13,910 | 14,152 | +2% | 1 | 1 | 0% | 2,125 | 3,133 | +47% | 0 | 0 | — |
case-20 | fail→pass | 18,536 | 9,287 | -50% | 1 | 1 | 0% | 2,107 | 2,482 | +18% | 0 | 0 | — |
case-21 | pass→pass | 18,462 | 8,111 | -56% | 1 | 1 | 0% | 2,297 | 2,358 | +3% | 0 | 0 | — |
case-22 | pass→pass | 19,208 | 13,474 | -30% | 1 | 1 | 0% | 2,354 | 2,467 | +5% | 0 | 0 | — |
DecimalAI ran this skill against gemini-3.6-flash twice over the same eval suite — once with the skill loaded and once without — and compared the two runs case by case. 22 cases were attempted. The headline lift of +36 percentage points is the difference between those two pass rates over the 22 comparable cases.
Without the skill loaded, the model failed this case. With it loaded, the same prompt on the same model passed. This is one improved case from the latest verified run; every case, including any that regressed, is in the table above.
Other measured skills in the registry, with their headline benchmark lift.