結論
-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が終了しただけでは、テストが実行されたとは判断できません。次を確認します。
- Unity processが終了した
-testResultsで指定したXMLが生成された- 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とは?基本と使い方で説明しています。