uloop-run-tests について
uloop-run-testsは、UnityプロジェクトでUnity Test Runnerを実行するスキルです。テスト前にスクリプトをコンパイルし、未保存のシーン変更を処理して、失敗時にはNUnit XMLを保存します。
主な機能
- 01EditModeまたはPlayModeテストの実行
- 02名前、正規表現、アセンブリによる絞り込み
- 03テスト前のスクリプトコンパイル
- 04未保存のシーンとPrefab変更の処理
- 05失敗時のNUnit XML保存
活用シーン
- 01スクリプト変更がテストに通るか確認
- 02失敗したテストとスタックトレースを調査
- 03テストアセンブリがない場合の設定案を取得
インストール
コマンドをコピーしてターミナルで実行します。
npx skills add https:/ / github.com/ hatayama/ unity-cli-loop --skill uloop-run-testsインストール後、Claude Code で/uloop-run-testsを入力して読み込まれたか確認します。
詳細
uloop run-tests
Unity Test Runner を実行します。テストが失敗すると、エラーメッセージとスタックトレースを含む NUnit XML の結果が自動的に保存されます。失敗の詳細を診断するには、XmlPath の XML ファイルを読み取ってください。
uloop run-tests はテストを実行する前に、保留中のスクリプト変更を自動的にコンパイルします。--skip-compile は、コンパイルによってクリアされるアクティブなホットリロードパッチを検証する場合にのみ指定してください。それ以外の場合は、デフォルトのコンパイルでエラーを検出し、現在のスクリプトで実行してください。--skip-compile がスキップするのは CLI 側のコンパイルだけです。Unity は最後のコンパイル以降に保存されたスクリプトの編集内容を引き続きインポートし、実行によってアセンブリロックが解放されるとすぐに、そのインポートでドメインがリロードされ、アクティブなパッチが破棄されてリクエストが終了します。
テストの実行前に、uloop run-tests は --unsaved-changes(デフォルトは save)に従って、未保存の読み込み済み Scene と Prefab Stage の変更を処理します。save は先に変更を保存し、fail は未保存の変更が残っている場合に停止し、discard はディスク上の状態を再読み込みして、保存済みのファイルを対象にテストを実行します。名前のないシーンは破棄できず、エラーになります。選択したモードで処理を続行できない場合、Success: false を返し、TestCount を 0 のままにして、項目を Message に列挙し、Unity Test Runner を起動しません。
テスト実行が始まる前に、アクティブな一時停止ポイントは自動的にクリアされます(基となるコードパッチも削除されます)。クリアされた ID は、レスポンスの ClearedPausePointIds フィールドに報告されます。
テスト実行の終了時に、アクティブなホットリロード変更が破棄されることがあります。実行中にインポートされたスクリプトの編集内容は、テストランナーがアセンブリのリロードロックを解放したときにコンパイルされます。この遅延されたドメインリロードによって、テスト自体はパッチを適用した状態で実行されていても、パッチは消去されます。レスポンスの Warning フィールドにこの内容が報告されます。次の Play またはテスト実行の前に、'uloop hot-reload' を再適用するか、'uloop compile' で編集内容を反映してください。
NoTestsFound は、一致するテストが 0 件だったことを意味し、テストの失敗ではありません。asmdef に関するヒントは NoTestsFoundExplanation と Message を確認してください。フィルターなしの実行でテストが見つからず、プロジェクトに TestMode 用のテストアセンブリがない場合、ProposedTestAsmdef に、すぐに書き込める .asmdef が含まれます。Content を AssetPath に保存し、テストスクリプトをそのフォルダーに移動してから、コンパイルして再実行してください。
使用方法
uloop run-tests [options]
パラメーター
| パラメーター | 型 | デフォルト | 説明 |
|---|---|---|---|
--test-mode | 文字列 | EditMode | テストモード:EditMode、PlayMode |
--filter-type | 文字列 | all | フィルタータイプ:all、exact、regex、assembly、class |
--filter-value | 文字列 | - | フィルター値(テスト名、パターン、アセンブリ、またはクラス名) |
--unsaved-changes | 文字列 | save | save は未保存の Scene/Prefab Stage の変更を書き込みます。fail は未保存の変更が残っている場合に停止します。discard はディスク上の状態を再読み込みします(Untitled シーンでは失敗します) |
--skip-compile | フラグ | - | テスト実行前の CLI 側でのコンパイルをスキップします。アクティブなホットリロードパッチを検証する場合にのみ使用してください。Unity は、最後のコンパイル以降に保存されたスクリプトの編集を引き続きインポートします。 |
--timeout-seconds | 整数 | 600 | await をキャンセルするまでに RunFinished を待つ最大秒数(最大 1500)。長時間かかるスイートでは増やしてください。タイムアウト後も、停止処理が完了するまでは Test Runner が実行中の場合があります |
--respect-enter-play-mode-settings | フラグ | - | PlayMode のみ:Domain Reload をオフに強制せず、プロジェクトの Enter Play Mode 設定を維持します。実行中に Domain Reload が発生しても、その後リロード後に結果を復元します。Play に入る際に Domain Reload が必要なライブラリを使用するプロジェクトで利用してください。 |
デフォルトでは、PlayMode は引き続き Domain Reload をオフに強制します。--respect-enter-play-mode-settings を指定すると、Domain Reload が実行される場合があり、コマンドの実行時間が長くなります。リロード後に復元された結果では、一時停止ポイントとホットリロードに関する注記は省略されます。この経路では、CLI をキャンセル(Ctrl-C)しても Unity 側の実行は停止しません。
exact はテスト名全体(Namespace.Class.Method)と完全一致します。class は、単独名または名前空間修飾名で指定したクラスのすべてのテストを実行します。例:--filter-type class --filter-value PlayerTests。名前は文字列全体で照合されるため、PlayerTests を指定しても EnemyPlayerTests は実行されません。regex は、テスト名全体に対して .NET 正規表現で照合します。例:--filter-type regex --filter-value '^MyGame.Tests.'
出力
以下を含む JSON を返します。
Success(boolean):すべてのテストに合格したかどうかStatus(string):Passed、Failed、NoTestsFound、ExecutionFailedなどの機械可読な実行ステータスHasFailures(boolean):検出されたテストに失敗があったかどうかMessage(string):概要メッセージNoTestsFound(boolean):Unity Test Runner が一致するテストを 1 件も検出しなかったかどうかNoTestsFoundExplanation(string):NoTestsFoundが true の場合にエージェント向けの説明を返します。それ以外の場合は空ですCompletedAt(string):実行完了時の ISO タイムスタンプTestCount(number):実行したテストの合計数PassedCount(number):合格したテスト数FailedCount(number):失敗したテスト数SkippedCount(number):スキップされたテスト数XmlPath(string):NUnit XML 結果ファイルのパス。XML が保存されていない場合(通常はSuccess: trueの場合)は空文字列です。テストが失敗し、XML ファイルがディスク上に存在する場合にのみ値が設定されますClearedPausePointIds(string[]、任意):テスト実行前に解除された一時停止ポイントの ID。一時停止ポイントが有効になっていなかった場合、JSON には含まれませんFailedTests(array、任意):失敗したリーフテストのうち最大 10 件。各テストにはFullName、Message、およびスタックトレースにパスと行番号が含まれる場合はFileとLineが含まれます。テストが失敗していない場合は含まれません。FailedCountが 10 を超える場合、Messageはfirst 10 of N failures listed; see XmlPath for full results.で終わりますSkippedTests(string[]、任意):スキップされたリーフテストの完全名を最大 10 件返します。テストがスキップされていない場合は含まれません。SkippedCountが 10 を超える場合、最初の 10 件の名前のみが列挙されますProposedTestAsmdef(object、任意):書き込み可能な状態のテスト用.asmdefのAssetPathとContent(テストアセンブリの構成、およびテスト対象プロジェクトのアセンブリへの参照)。フィルターなしの実行でテストが見つからず、TestMode 用のテストアセンブリも存在しない場合にのみ含まれますCompileNote(string、任意):テスト実行前に自動コンパイルが行われ、成功したことを示し、オプトアウト用の--skip-compileを記載します。コンパイル応答に Warning が含まれていた場合(たとえば、ドメインリロードによってアクティブなホットリロードの変更が破棄された場合)、この注記にも同じ内容が記載されます。--skip-compileが指定された場合は含まれません。コンパイルに失敗した場合は、代わりにコンパイルエラー応答が返されます
XML 結果ファイル
テストが失敗すると、NUnit XML の結果が {project_root}/.uloop/outputs/TestResults/<timestamp>.xml に自動保存されます。XML には、テストケースごとに次の結果が含まれます。
- テスト名と完全名
- 合格/失敗/スキップのステータスと実行時間
- 失敗したテストの場合:
<message>(アサーションエラー)と<stack-trace>