pytest-covとoctocovの連携:なぜカバレッジ連携が可能なのか
はじめに
GitHub Actions
で octocov
を使ってカバレッジレポートを表示する際、pytest-covで生成したXMLファイルをoctocovが問題なく読み込めることに疑問を持ったのでまとめます。
前提
pytest-covとは
pytest-cov
は、Python のテストフレームワークである pytest
に
カバレッジ計測機能を統合するためのプラグインです。
内部では coverage.py
ライブラリを利用しており、
テスト実行と同時にソースコードの網羅率を計測できます。
結果は ターミナル出力・XML・HTML など、さまざまな形式でレポートとして出力可能です。
octocovとは
octocov
は CI上でカバレッジやテスト統計を可視化するツールです。
「Coverage: 90.0%」などのコメントをPR上に自動で投稿できる便利な仕組みを提供しています。
なぜ連携させるのか
pytest-cov
と octocov
を組み合わせることで、テスト結果をPRに自動でコメント表示することができます。
また、複数リポジトリのカバレッジ率を一元管理することも可能です。
octocovがサポートするカバレッジフォーマット
octocov
のREADMEを見ると、
以下の6つのカバレッジレポートフォーマットに対応しています。
- Go coverage:
coverage.out
- LCOV:
coverage/lcov.info
(SF/DA のみ対応) - SimpleCov:
coverage/.resultset.json
- Clover:
coverage.xml
- Cobertura:
coverage.xml
- JaCoCo:
build/reports/jacoco/test/jacocoTestReport.xml
coverage.pyのXML出力形式
pytest-cov
の内部で使われている coverage.py
のドキュメントに下記の記載があります。
The xml command writes coverage data to a 'coverage.xml' file in a format compatible with Cobertura.
つまり、 coverage.py
が生成するXMLファイルは Cobertura形式 です。
Cobertura形式とは
Cobertura形式は、Javaのカバレッジツール「Cobertura」 が定義した XMLスキーマ
(coverage-04.dtd)に基づいています。
テストカバレッジ結果を統一的に扱うための事実上の共通フォーマットです。
実際のコード
# .github/workflows/test.yml
- name: Run tests with coverage
run: |
pytest --cov=dir_name \
--cov-report=xml
- name: Run octocov
uses: k1LoW/octocov-action@v1
# .octocov.yml
coverage:
paths:
- coverage.xml
codeToTestRatio:
code:
- "**/*.py"
test:
- "**/test_*.py"
- "**/tests.py"
- "**/tests_*.py"
comment:
if: is_pull_request
まとめ
pytest-cov
と octocov
の連携が可能な理由は、両者がCobertura形式という共通のフォーマットを介しているためです。
これにより、pytest-cov
で生成したカバレッジを、追加の変換なしで octocov
で可視化できます。
参考URL

ENECHANGEグループは、「エネルギー革命」を技術革新により推進し、より良い世界を創出することをミッションとするエネルギーベンチャー企業です。 enechange.co.jp/
Discussion