1
0

Unity Test Framework でテスト中に無限ループに陥ったときの対処

Last updated at Posted at 2024-03-17

テスト対象の関数にバグがあり、無限ループに陥ったときの症状と、対処方法です。

症状

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 から先に進みません。
image.png

Cancel を押しても止めることはできません。
image.png

対処

(事前にこのUnityプロジェクトのソースを Visual Studio で開いていると仮定しています。テストを実行したあとで Visual Studio を開く方法もあると思いますが、私は試していません)

デバッガを起動する

  1. Visual Studio で「Unity にアタッチ」
  2. デバッグ → すべて中断

問題箇所を特定する

  1. 「呼び出し履歴」で「すべてのスレッドを表示」image.png
  2. 「並列スタック」ウィンドウが表示されるので、スクロールして怪しい関数を実行しているスレッド (自分が書いた関数が最も怪しい) を見つける。
  3. その関数をダブルクリックする。
    image.png

デバッガを駆使して脱出する

image.png

  • ステップ実行して「なぜ無限ループに陥っているのか」を理解し、ウォッチやイミディエイト ウィンドウで変数を書き換えてループを抜けられるようにする。
  • 左端の黄色矢印を return の行までドラッグして脱出する。

などの方法で関数を脱出してください。

関数やループ部分があまりにも短いと、脱出する方法がないこともあります。その場合、 Ctrl + Alt + Del で Unity ごと落とすしかないかもしれません。

1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0