トーフメモ

主にゲーム制作

【Unity】テスト(Unity Test Runner)を使ってみる

前回

tofgame.hatenablog.com

今回は実際にどういう風に運用するのがいいのかを考えてみます。

変数として以下のものを使います。

private Vector2Int pos = new Vector2Int(0,0);
private float moveY = 1;
private int fieldSize = 10;

テストを行うために初期化処理を加えます。

[SetUp]
public void SetupTest () {
    pos = new Vector2Int(0,0);
}

SetUpAttributeを付与するとテストが行われるごとに呼ばれます。

例1 グリッド移動するときのチェック(Greater、Less)

[TestCase(-1,-1)]
[TestCase(0,0)]
[TestCase(10,10)]
public void Move (int x,int y) {
    pos.x += x;
    pos.y += y;
    Assert.Greater(pos.x,-1,"x方向の位置が範囲外です:" + pos.x);
    Assert.Less(pos.x,fieldSize-1,"x方向の位置が範囲外です:" + pos.x);

    Assert.Greater(pos.y,-1,"y方向の位置が範囲外です:" + pos.y);
    Assert.Less(pos.y,fieldSize-1,"y方向の位置が範囲外です:" + pos.y);
}

移動させたい範囲外の時にAssertをします。
明示的にはなるけど、これは微妙・・・

例2 グリッド移動するときのチェック(IsTrue)

[TestCase(-1,-1)]
[TestCase(0,0)]
[TestCase(10,10)]
public void Move2 (int x,int y) {
    pos.x += x;
    pos.y += y;
    Assert.IsTrue(pos.x >= 0 && pos.x <= (fieldSize - 1),"x方向の位置が範囲外です:" + pos.x);
    Assert.IsTrue(pos.y >= 0 && pos.y <= (fieldSize - 1),"y方向の位置が範囲外です:" + pos.y);
}

だいぶすっきりしました。
IsTrueはboolでの結果なので、どれくらいの粒度でテストしたいか、で条件式を分けるとよさそうです。

また、TestCaseAttributeはテストケースが多くなると管理しにくくなるので、TestCaseSourceAttributeを使って配列を読み取ります。

例3 グリッド移動するときのチェック(TestCaseSource使用)

[TestCaseSource("DivideCases")]
public void Move2 (int x,int y) {
    pos.x += x;
    pos.y += y;
    Assert.IsTrue(pos.x >= 0 && pos.x <= (fieldSize - 1),"x方向の位置が範囲外です:" + pos.x);
    Assert.IsTrue(pos.y >= 0 && pos.y <= (fieldSize - 1),"y方向の位置が範囲外です:" + pos.y);
}

static object[] DivideCases ={
    new object[] { -1, -1 },
    new object[] { 0, 0 },
    new object[] { 10, 10 }
};

テストケースを記述する部分が切り離されたので、テストケースを別ファイルに書いて読み込みとかもできるかも・・・
近いうちに作ります!

参考

qiita.com