コンテンツにスキップ

Pants のテストでカバレッジを取得する

概要

Pants では、テストを実行する際にカバレッジを取得できる(link)。

カバレッジを取得する

Pants でカバレッジを取得するには、実行時に--use-coverageを指定するか、設定ファイルに[test]セクションを追加する。

$ pants test --use-coverage ::
[test]
use_coverage = true

カバレッジを取得するファイルを指定する

Pants は推移的に依存するファイル全てを対象にカバレッジを取得するが、filter 機能を使うとカバレッジを取得するファイルを制限できる。

カバレッジ対象を推移的な依存を含まずに、なるべく変更があったファイルだけにする例を GitHub Actions でやってみると次のようになる

# 省略
- name: set coverage filter
  run: |
    # coverageの対象となる変更のあったソースファイルを指定する。
    filter=$(pants --changed-since=origin/main --changed-dependents=transitive --filter-target-type=python_source peek | jq '.[].sources[]' | xargs dirname | sed ':a;N;$!ba;s/\n/","/g' | sed 's/^/"/;s/$/"/')
    echo "PANTS_COVERAGE_PY_FILTER='[${filter}]'" >> $GITHUB_ENV

- name: Test and Report Coverage
  run: |
    echo ${{ env.PANTS_COVERAGE_PY_FILTER }}

    PANTS_COVERAGE_PY_FILTER=${{ env.PANTS_COVERAGE_PY_FILTER }} pants --changed-since=origin/main --changed-dependents=transitive test

気になるところ

$filterに対象のファイルの配列を代入し、pants test --coverage-py-filter=${filter}で展開させて実行しようとすると、うまく filter を指定できず実行できなかった。それもあって、GitHub Actions のJavaScriptの機能で展開するとうまくできた。