📊

pytest-covとoctocovの連携:なぜカバレッジ連携が可能なのか

に公開

はじめに

GitHub Actionsoctocov を使ってカバレッジレポートを表示する際、pytest-covで生成したXMLファイルをoctocovが問題なく読み込めることに疑問を持ったのでまとめます。

前提

pytest-covとは

pytest-cov は、Python のテストフレームワークである pytest
カバレッジ計測機能を統合するためのプラグインです。

内部では coverage.py ライブラリを利用しており、
テスト実行と同時にソースコードの網羅率を計測できます。

結果は ターミナル出力・XML・HTML など、さまざまな形式でレポートとして出力可能です。
https://pytest-cov.readthedocs.io/en/latest/readme.html

octocovとは

octocov は CI上でカバレッジやテスト統計を可視化するツールです。
「Coverage: 90.0%」などのコメントをPR上に自動で投稿できる便利な仕組みを提供しています。
https://github.com/k1LoW/octocov

なぜ連携させるのか

pytest-covoctocov を組み合わせることで、テスト結果をPRに自動でコメント表示することができます。
また、複数リポジトリのカバレッジ率を一元管理することも可能です。

octocovがサポートするカバレッジフォーマット

octocovREADMEを見ると、
以下の6つのカバレッジレポートフォーマットに対応しています。

  1. Go coverage: coverage.out
  2. LCOV: coverage/lcov.info(SF/DA のみ対応)
  3. SimpleCov: coverage/.resultset.json
  4. Clover: coverage.xml
  5. Cobertura: coverage.xml
  6. 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.

https://coverage.readthedocs.io/en/7.10.7/commands/cmd_xml.html

つまり、 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-covoctocov の連携が可能な理由は、両者がCobertura形式という共通のフォーマットを介しているためです。
これにより、pytest-cov で生成したカバレッジを、追加の変換なしで octocov で可視化できます。

参考URL

https://github.com/k1LoW/octocov/
https://pytest-cov.readthedocs.io/en/latest/readme.html
https://coverage.readthedocs.io/en/7.10.7/other.html
https://cobertura.github.io/cobertura/
https://stackoverflow.com/questions/71116554/is-the-cobertura-report-format-standardized

ENECHANGE

Discussion