コンテンツにスキップ

Pants Test の Coverage 対象のファイルを Filter する

背景

Pants Test の Coverage は、対象ファイルの推移的な依存までカバレッジ対象に含めてしまう。 テストの中で推移的な依存ファイルの一部のクラスや関数だけ使われるという場合に、テストのカバレッジが低くなってしまう。 推移的な依存ファイルをなるべく除外し、テストのカバレッジを正確に測るためにできるだけ変更があったソースファイルのみをカバレッジ対象に含めるようにしたい。

解決策

Pants Test の Coverage 対象のファイルをFilterできる。

filter sample
pants test --coverage-py-filter='["foo_dir", "foo_dir/bar_dir"]'

上記の場合、foo_dirfoo_dir/bar_dirのファイルのみがカバレッジ対象になる。 この filter 機能を使って、変更があったソースコードのみを対象にすることで、必要ない推移的な依存ファイルをカバレッジ対象から除外できる。

次のように変更があったファイルのディレクトリのみを取得し、それを filter に指定すると推移的な依存ファイルを除外したテストのカバレッジを取得できる。dirnameでディレクトリ名のみを取得しているのは、filter にはディレクトリを指定する必要があるため。 ${{ env.PANTS_COVERAGE_PY_FILTER }}に filter を設定しておくことで、pants testの実行時に filter を指定できる。これは、GitHub Actionsenvコマンドを使って設定している。shell の${filter}を使って展開したものを設定するとうまくうごかなかったため、GitHub Actions の env コマンドを使って設定している。

filter
1
2
3
4
# 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
PANTS_COVERAGE_PY_FILTER=${{ env.PANTS_COVERAGE_PY_FILTER }} pants --changed-since=origin/main --changed-dependents=transitive test