Stop reading raw logs to find failures
The default test output in CI is a wall of console text. Real test reporting extracts structured data — what passed, what failed, how long each took, where it broke — and surfaces it on the PR or in the run summary.
Two layers
1) Test result formats
- JUnit XML — universal.
pytest --junitxml=report.xml,vitest --reporter=junit, etc. - SARIF — for security scanners, surfaces in PR review UI.
- Cobertura / lcov — coverage formats.
2) Renderers
- GitHub Step Summary — append markdown to
$GITHUB_STEP_SUMMARYfrom any step. Renders on the run page. - PR Comment — third-party actions like
EnricoMi/publish-unit-test-result-actionpost a sticky comment summarizing the test run. - Coverage badge — push to Codecov or Coveralls; their actions also comment on PRs.
- Annotations — emit
::error file=foo.py,line=12::messagefrom a step to make GitHub draw inline annotations on the PR diff.