テスト対象の関数にバグがあり、無限ループに陥ったときの症状と、対処方法です。
症状
MyGameLogic.cs
public class MyGameLogic
{
// テスト対象の関数。無限ループバグあり。
// このサンプルではどの関数に問題があるかすぐわかるが、
// 実際には「どの関数で止まっているかわからない!」はず。
public static int InfLoop(int a)
{
int count = 0;
while (count < a)
{
count = count + 0;//bug
}
return count;
}
}
TestMyGameLogic.cs
using NUnit.Framework;
public class TestMyGameLogic
{
// テストする側
[Test]
public void TestInfLoop()
{
Assert.AreEqual( MyGameLogic.InfLoop(9), 9 );
}
}
これをうっかり実行すると、下のようなダイアログが出ます。プログレスバーは進まず、 Create New Scene から先に進みません。
対処
(事前にこのUnityプロジェクトのソースを Visual Studio で開いていると仮定しています。テストを実行したあとで Visual Studio を開く方法もあると思いますが、私は試していません)
デバッガを起動する
- Visual Studio で「Unity にアタッチ」
- デバッグ → すべて中断
問題箇所を特定する
- 「呼び出し履歴」で「すべてのスレッドを表示」
- 「並列スタック」ウィンドウが表示されるので、スクロールして怪しい関数を実行しているスレッド (自分が書いた関数が最も怪しい) を見つける。
- その関数をダブルクリックする。
デバッガを駆使して脱出する
- ステップ実行して「なぜ無限ループに陥っているのか」を理解し、ウォッチやイミディエイト ウィンドウで変数を書き換えてループを抜けられるようにする。
- 左端の黄色矢印を return の行までドラッグして脱出する。
などの方法で関数を脱出してください。
関数やループ部分があまりにも短いと、脱出する方法がないこともあります。その場合、 Ctrl + Alt + Del で Unity ごと落とすしかないかもしれません。