【Unity】テスト(Unity Test Runner)を使ってみる
前回
今回は実際にどういう風に運用するのがいいのかを考えてみます。
変数として以下のものを使います。
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 } };
テストケースを記述する部分が切り離されたので、テストケースを別ファイルに書いて読み込みとかもできるかも・・・
近いうちに作ります!