Unity Test Runnerで-runTestsと-quitを併用するとテストが実行されない

確認環境

Unity
6000.3.8f1
対象
Unity Editor / command-line Test Runner
検証OS
macOS 26.5.2 / Apple silicon Mac
関連Package
Unity Test Framework 1.6.4

結論

-runTestsと-quitを同時に指定すると、今回確認した構成ではTest Runnerが開始する前にEditorが終了しました。

-quitを外し、テスト完了後の終了はUnity Test Framework自身に任せます。今回の環境では、テスト完了後にUnity processが終了し、結果XMLも生成されました。

症状

  • Unity Editorが起動後すぐに終了する
  • RunStartedやTestStartedが記録されない
  • -testResultsで指定したXMLが生成されない
  • テストコードが1件も実行されていない

原因

command-line Test Runnerの開始処理は、Editor起動後の最初のupdateへ予約されていました。

一方、built-inの-quitはその前に処理されたため、Test Runnerが開始状態になる前にEditorが終了していました。

この場合はテスト失敗ではなく、テスト自体が開始していません。

解決方法

実行コマンドから-quitを外す

問題が発生したコマンドは次の形でした。

Unity -batchmode -runTests -testPlatform PlayMode -testResults results.xml -quit

次のように変更します。

Unity -batchmode -runTests -testPlatform PlayMode -testResults results.xml

今回の環境では、テスト完了後にUnity Test FrameworkがEditorを終了しました。

結果XMLまで確認する

processが終了しただけでは、テストが実行されたとは判断できません。次を確認します。

  1. Unity processが終了した
  2. -testResultsで指定したXMLが生成された
  3. XMLに実行件数と結果が記録された

結果XMLがない場合は、成功扱いにせずEditor logでRunStartedまたはTestStartedを確認します。

独自launcherでは併用を開始前に拒否する

CI用launcherやEditor初期化コードで引数を組み立てている場合は、-runTestsと-quitの併用を同期的に検出し、テスト用の一時状態を作る前にエラー終了させます。

今回の修正では、併用時に明示的なerrorを出し、non-zero exitにしました。

delayCallなどで後から検出すると、built-inのquit処理に間に合わない場合があります。

-quitを外しても終了しない場合

テストが開始した後にUnity processが停止し続ける問題は、今回の「開始前に終了する問題」とは別です。

この場合も-quitを戻して解決しようとせず、次のどちらかで停止させます。

  • CIやlauncherに既存のtimeout機能がある場合は、制限時間超過としてprocessを終了しjobを失敗にする
  • ローカル実行で外部timeoutがない場合は、停止したUnity processを手動で終了する

今回のIncidentでは、汎用的なtimeout実装までは公開可能な形で確認していないため、この記事では具体的なCI設定やlauncherコードを掲載していません。

関連記事

Unity Test Runnerの基本は、Unity Test Runnerとは?基本と使い方で説明しています。

参考資料