コンテンツにスキップ

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

概要

Pants では、テストを実行する際にカバレッジを取得できます(Pants の coverage-py リファレンス)。

カバレッジを取得する

カバレッジの取得には、実行時に--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 の例では、式${{ env.PANTS_COVERAGE_PY_FILTER }}で値を埋め込む方法で実行できました。これは当時の構成での結果で、変数展開を使う方法が失敗する一般的な条件を示すものではありません。