CLI リファレンス

すべてのコマンド、オプション、環境変数について、その動作、既定値、例を示します。簡易版を見るには td --help を実行してください。

td affected [options]              Print the projects and tests a change affects
td test [options] [-- <args>]      Run only the tests a change affects
td record [options]                Run all tests with coverage and store the map
td license status [options]        Check the license and show what it covers
td license install <license|file>  Store a license in ~/.testdetta/license

すべての分析に共通のオプション

これらは affected、test、record で使用できます。

--base <ref>

比較対象の git ref です。TestDetta は作業ツリーを、HEAD とこの ref のマージベースと比較します。そのため、ブランチを作成した後にベースブランチに取り込まれたコミットは、ご自身の変更としては数えられません。既定値:origin/main。

td test --base origin/develop
td affected --base HEAD~3      # the last three commits and anything uncommitted

--repo <path>

分析するリポジトリ内の任意のパスです。既定値:カレントディレクトリ。

td affected --repo ../shop

-v、--verbose、--log-level <level>

ログは stderr に出力されるため、stdout は機械可読な状態に保たれます。-v はデバッグログを有効にし、プロジェクトが影響を受ける理由、テストクラスがどのメンバーを実行したか、トレースがどの名前をたどったかなど、すべての判断を説明します。--log-level では trace、debug、information、warning(既定値)、error、none のいずれかを選択できます。trace では git の生の出力も加わります。

td affected -v 2> testdetta-debug.log
td test --log-level information

--max-map-age <n>

マージベース自体にカバレッジマップがない場合に、マージベースから最大 n 個の first-parent コミット前までに記録されたマップを使用します。その間の変更は橋渡しされます。つまり、マップ以降に変更されたメンバーのうち、今回の変更に到達しうるものを実行したクラスも選択されます。0 を指定すると、マージベースで記録されたマップだけを使用します。既定値:50。選択のしくみを参照してください。

td test --max-map-age 20

--drift-fallback <all|name>

古いマップ以降の変更に、ビルドファイル、構成、グローバル using など、メンバー単位で表せないものが含まれる場合の動作を指定します。all(既定値)は影響を受けるテストプロジェクトを丸ごと実行し、name は名前で判断します。後者は高速ですが、構成やリフレクションによってつながった呼び出しは捉えられません。

td test --drift-fallback name

--maps-dir <dir>

カバレッジマップをリポジトリの外に、コミットごとに 1 フォルダーで保持します。record は <dir>/<commit>/ に保存し、affected と test は --max-map-age の範囲内で最新のものを復元します。GitHub Actions 以外の CI システムで、共有ディスクまたは同期したオブジェクトストレージとともに使用します。既定値:マップはリポジトリ内の .testdetta/coverage に置かれます。

td record --maps-dir /srv/testdetta-maps/shop
td test --base origin/main --maps-dir /srv/testdetta-maps/shop

td affected

何もビルドや実行をせずに、変更が何に影響するかをその理由とともに出力します。

--format <text|json|paths|commands>

形式出力用途
text(既定値)影響を受けるプロジェクトとその理由、続いてテスト計画人が読む
jsonすべてのプロジェクトとテストクラスについて、判断、根拠、推定時間スクリプト、ダッシュボード
paths影響を受けるテストの .csproj を 1 行に 1 つ別のツールへの入力
commandsテストプロジェクトごとに 1 つの dotnet test コマンド(フィルター付き)独自の方法でのテスト実行
td affected --format json > plan.json
td affected --format paths | xargs -n1 dotnet build

--tests-only

影響を受けるテストプロジェクトだけを一覧表示し、途中にある本番コードのプロジェクトは含めません。

td test

影響を受けるテストだけをビルドして実行します。一部のクラスだけが影響を受ける場合はテストプロジェクトごとにフィルターを使い、すべてのクラスが影響を受ける場合や変更を絞り込めない場合はプロジェクト全体を実行し、どのクラスも影響を受けない場合は何も実行しません。いずれかのテストが失敗すると、終了コードは 3 になります。

--dry-run

dotnet test コマンドを実行せずに出力します。global.json がサブフォルダーにあるプロジェクトは、(cd src && dotnet test ...) のように出力されます。

--summary-file <path>

Markdown のサマリーを追記します。内容は、各プロジェクトの結果、実行されたクラスとその理由、スキップされたクラス、記録済みのテスト時間のうち節約できた分です。GitHub Actions では $GITHUB_STEP_SUMMARY を指定します(アクションが自動的に行います)。例をご覧ください。

td test --summary-file "$GITHUB_STEP_SUMMARY"

-- <dotnet test arguments>

-- の後に指定したものはすべて、各 dotnet test の呼び出しに渡されます。

td test -- -c Release --logger trx
td test -- --no-restore

td record

すべてのテストをカバレッジ付きで実行し、テストプロジェクトごとに 1 つのマップを .testdetta/coverage(または --maps-dir)に書き込みます。既定のブランチで実行してください。これはそのブランチの完全なテスト実行も兼ねます。テストが失敗すると終了コードは 3 になりますが、マップは書き込まれ、失敗したクラスは以後常に選択されます。

-c、--configuration <name>

ビルド構成です。既定値:Debug。

-f、--framework <tfm>

複数のターゲットフレームワークを持つテストプロジェクトで記録するターゲットフレームワークです。既定値:プロジェクトの最初のターゲットフレームワーク。

td record -f net10.0

--project <path>

このテストプロジェクトだけを記録します。パスはリポジトリのルートからの相対パスで、複数指定する場合は繰り返します。データベースが必要な統合テストなど、CI で実行できないプロジェクトは除外してください。それらは名前で判断されます。

td record --project tests/Shop.Tests/Shop.Tests.csproj --project tests/Api.Tests/Api.Tests.csproj

--parallel <n>

記録を高速化するため、各プロジェクトのテストクラスを n 個のテストプロセスに分散します。各プロセスはテストを 1 つずつ実行します。テストスイートが複数のテストプロセスの同時実行に耐えられる必要があります(固定ポートや共有ファイルを使わないこと)。既定値:1。

--no-build

再ビルドせずに、同じ構成で事前に行ったビルドの出力を記録します。

dotnet build -c Release
td record -c Release --no-build

td license

td license status は、td test と同じ方法でライセンスを確認し、ライセンシー、シート数、過去 30 日間のアクティブなコミッター、ボットの一覧、スコープ、終了日といった対象範囲を出力します。個人データをどこかに送信することはありません。td license install <license|file> はライセンスを ~/.testdetta/license に保存します。CI のシークレットにライセンスを保持できないマシン向けです。ライセンスを参照してください。

環境変数

変数動作
TESTDETTA_LICENSECI のシークレットから渡すライセンス文字列。
TESTDETTA_LICENSE_FILEライセンス文字列を格納したファイル。
TESTDETTA_LICENSE_REFRESH=off1 日 1 回のライセンス更新を無効にします。ライセンスサービスに接続できないネットワーク向けです。
TESTDETTA_LICENSE_SCOPEorigin リモートがライセンスの対象リポジトリを示していない場合(ローカルのミラーなど)に、ライセンスが対象とすべきリポジトリ。
HTTPS_PROXYライセンス更新に使用するプロキシ。

終了コード

コード意味
0成功(「テスト不要」の場合を含む)。
1分析に失敗しました(git、ファイルシステム、またはプロジェクトファイル)。
2コマンドラインが無効です。
3テストが失敗しました(test と record)。