はじめに

TestDetta はブランチをそのベースと比較し、変更を検出できるテストプロジェクトとテストクラスを割り出して、それらだけを実行します。確信が持てないときは、少なくではなく多めに実行します。

要件

クイックスタート

GitHub Actions

GitHub Action が TestDetta をビルドするため、インストールするものはありません。ワークフローに 2 つのステップを追加します。1 つは既定のブランチへのプッシュ時にカバレッジマップを記録し、もう 1 つはプルリクエストで影響を受けるテストだけを実行します。

- if: github.event_name == 'push'
  uses: <owner>/testdetta@<sha>
  with:
    mode: record

- if: github.event_name == 'pull_request'
  uses: <owner>/testdetta@<sha>
  with:
    mode: test

ワークフロー全体、必要なアクセス許可、すべての入力については GitHub Actions を参照してください。

その他の CI システム

GitLab CI、Jenkins、Azure DevOps、Bitbucket、オンプレミス環境でも同じ 2 つのコマンドを実行します。コミットごとのカバレッジマップを格納するフォルダー(--maps-dir)は、共有ディスクまたはオブジェクトストレージに保持します。TestDetta は .NET ツールとしてインストールします。

dotnet tool install --global <package>

パッケージ名はリリース時に決定します。それまでは dotnet build src/TestDetta.Cli -c Release -o testdetta-bin でソースからツールをビルドし、td と書かれている箇所では代わりに dotnet testdetta-bin/TestDetta.Cli.dll を呼び出してください。

各システム向けのパイプラインはその他の CI システムにあります。

最初に試すコマンド

これらはリポジトリ内のどこからでも実行できます。--base の既定値は origin/main です。

# What does my branch affect, and why?
td affected --base origin/main

# Run only the affected tests (add --dry-run to print the dotnet test commands)
td test --base origin/main

# Run every test with coverage and write one map per test project to .testdetta/coverage
td record

カバレッジマップがなくても td test は動作します。その場合は名前だけで判断するため、安全ですが選択されるテストは多くなります。ブランチのベースで td record を一度実行すれば、選択は精密になります。

.testdetta/ を .gitignore に追加してください。このフォルダーにはカバレッジマップとキャッシュが格納され、コミットすべきものは含まれません。

コマンド

コマンド動作
td affected [--format text|json|paths|commands]変更が何に影響するか、その理由とともに出力します。--tests-only を指定すると、影響を受けるテストプロジェクトだけを一覧表示します。
td test [--dry-run] [--summary-file <path>] [-- <dotnet test args>]影響を受けるテストだけを実行します。--summary-file は Markdown のサマリーを、たとえば $GITHUB_STEP_SUMMARY に追記します。-- の後の引数はすべての dotnet test に渡されます(例:-- -c Release)。
td record [--project <csproj>]... [-c <configuration>] [-f <tfm>] [--parallel <n>] [--no-build]すべてのテストをカバレッジ付きで実行し、テストプロジェクトごとに 1 つのマップを .testdetta/coverage に書き込みます。--parallel は各プロジェクトのテストクラスを n 個のテストプロセスに分散し、--no-build は同じ構成で事前に行ったビルドの出力を記録します。
td license statusライセンスを確認し、その対象範囲を表示します。
td license install <license|file>ライセンスを ~/.testdetta/license に保存します。CI のシークレットにライセンスを保持できないマシン向けです。

共通オプション

オプション意味
--base <ref>比較対象の Git ref。既定値:origin/main。
--repo <path>リポジトリ内の任意のパス。既定値:カレントディレクトリ。
--max-map-age <n>マージベースから最大 n コミット前までに記録されたカバレッジマップを使用し、その間の変更を橋渡しします。既定値:50。0 を指定すると完全に一致するマップだけを使用します。選択のしくみを参照してください。
--maps-dir <dir>リポジトリの外に保持するカバレッジマップ(コミットごとに 1 フォルダー)。record はここに保存し、affected と test は --max-map-age の範囲内で最新のものを復元します。GitHub Actions 以外の CI システム向けです。
--drift-fallback <all|name>古いマップ以降の変更にビルドファイル、構成、グローバル using が含まれる場合に、影響を受けるテストプロジェクトを丸ごと実行する(all、既定値)か、名前で判断する(name)かを指定します。
-v、--verboseデバッグログを stderr に書き込みます。ユーザーが疑問に思いそうなすべての判断を、その理由とともに出力します。
--log-level <level>trace、debug、information、warning(既定値)、error、none のいずれか。

ログは stderr に出力されます。stdout にはコマンドの出力が流れ、機械可読な状態に保たれます。

終了コード

コード意味
0成功。
1分析に失敗しました。
2コマンドラインが無効です。
3テストが失敗しました。