トラブルシューティング
各項目は、目にした症状から始まります。どの場合も、-v を指定するとすべての判断とその理由が stderr に書き込まれます。ほとんどの疑問はこのログで解決でき、当社にお送りいただきたいのもこのログです。
td affected --base origin/main -v
テストプロジェクト全体が実行された
出力の中でそのプロジェクトを探してください。理由が横に表示されています。よくある原因は、ビルド全体に関わるファイル、プロジェクト内の C# 以外のファイル、global using、リフレクションで検出される型です。すべての原因はすべてが実行される変更に一覧があります。-v のログでは、affects whole project: True のような行にそのファイルが示されます。
カバレッジマップが使われなかった
マップがない場合、選択は名前によるトレースで行われ、範囲が広くなります。マップがなかった理由はログに示されます。
No coverage maps within 50 commits before the merge base:既定のブランチで最近何も記録されていません。既定のブランチへのプッシュごとにマップを記録してください。アクションのrecordモードがこれを行います。Ignoring the coverage map of … which is not an ancestor of the base:マップが別のブランチのもの、またはフォースプッシュや長期間存続するブランチより前のものです。既定のブランチで記録し直すか、--max-map-ageを引き上げてください。--maps-dir … does not exist:実行前にマップのフォルダーが復元されていません。- GitHub Actions では、マップを格納したキャッシュエントリを一覧表示するために、ジョブに
actions: readのアクセス許可が必要です。
ベースコミットが見つからない
TestDetta はブランチをマージベースと比較するため、両方の履歴が必要です。アクションは次のメッセージで停止します。
TestDetta compares with a base commit and needs the full history. Use actions/checkout with fetch-depth: 0.
fetch-depth: 0 でチェックアウトしてください。ほかの CI システムでは、シャロークローンを無効にし、明示的な refspec でターゲットブランチをフェッチします。各システムでの方法はその他の CI システムを参照してください。
スキップされたテストが想定より少ない
- マップがマージベースより古く、その間にビルドファイルや構成ファイルが変更されている場合:影響を受けるプロジェクトは丸ごと実行されます。
--drift-fallback nameを指定すると、代わりに名前で絞り込みます。 - 変更に触れていないテストクラスが選択される。名前によるトレースは慎重に働きます。変更された型を名前で参照しているクラスは、カバレッジでは除外できる場合でも選択されます。
is not in the coverage map of … Record the map againのようなログ行は、そのプロジェクトのマップが古くなっていることを示します。 - 中心的なヘルパーが変更された。共有の基底クラスやシリアライザーなど、ほとんどのテストが実行するコードを変更すると、ほとんどのテストが選択されます。これは正しい動作です。
フィルターがどのテストにも一致しなかった
プロジェクトのフィルターがどのテストも選択しなかった場合、TestDetta はフィルターなしでそのプロジェクトを再実行し、The filter for … matched no test; running it unfiltered とログに出力します。見逃しは生じませんが、これは当社側のバグです。-v のログをお送りください。
スカッシュマージ、リベース、フォースプッシュ
マップは既定のブランチのコミットに対して記録され、プルリクエストはマージベース時点またはそれ以前の最新のマップを探します。スカッシュマージやリベースを行うと既定のブランチに新しいコミットが作成されます。次のプッシュでそのコミットのマップが記録され、それまでの間、プルリクエストはドリフトブリッジを介して以前のマップを使用します。プルリクエストのブランチへのフォースプッシュでは何も変わりません。マージベースが計算し直されるだけです。
フォークからのプルリクエスト
CI システムは、フォークからのプルリクエストにシークレットを渡しません。パブリックリポジトリにはライセンスが不要なため、何も変わりません。プライベートリポジトリでは、ライセンスなしの実行となり、TestDetta がない場合と同じようにすべてのテストを実行します。
よくある質問
選択して実行した場合のコードカバレッジは完全ですか?
いいえ。テストをスキップした実行では、カバレッジは部分的になります。カバレッジは既定のブランチでの完全な実行から公開してください。そこでは記録がすべてのテストを実行します。
テストを再試行できますか?
はい。フレームワーク独自の再試行オプションを使ってください。-- 以降はすべてそのまま dotnet test に渡されます。
選択されたテストを並列ジョブに分割できますか?
td affected --format commands は、テストプロジェクトごとに 1 つ、フィルター付きの dotnet test コマンドを出力します。それらの行を各ジョブに割り振ってください。