[Unity Test Tools][UnitTest] 特定の値を指定してテストを生成する

ヨメレバCSS
オリジナルCSS

特定の値を指定してテストしたい場合、RangeやValueの属性を使います。

一定の範囲の数値を与える

一定の範囲の数値を与えてテストするためにはRangeを使います。

[Test]
public void RangeTest([NUnit.Framework.Range(1, 10)] int x) {
	Assert.Pass ();
}

TestRunnerではこのように、指定した範囲のテストが自動生成されています。

UnityTestTools_1_5_range

これで引数にxを取るメソッドをテストすれば、1~10の範囲のテストが実行されるのでfor文などで回さなくてもよくなります。

指定の数値で増やしていきたい場合は、第三引数に指定すると、

[Test]
public void RangeTest([NUnit.Framework.Range(1, 10, 2)] int x) {
	Assert.Pass ();
}

UnityTesttools_1_6_range2

このようにその数値だけ間を開けてテストが生成されます。

引数にはintのほかにdouble, float, longも取れます。

指定した値を与える

Rangeと違い、ひとつひとつの値を指定したい場合はValuesを使います。

[Test]
public void ValuesTest([Values(1, 2, 5, 10)] int x) {
	Assert.Pass ();
}

とすると、

UnityTestTools_1_6_values

というように指定した値だけでテストが生成されます。

これはobjectで値を指定できるので、文字なんかでも大丈夫。

[Test]
public void ValuesTest([Values("test", "test2", "test3")] string x) {
	Assert.Pass ();
}

UnityTestTools_1_6_values2

こんな感じで。

RangeとValuesの両方を使うとどうなるか

じゃあこれを両方指定したらどうなるか

[Test]
public void RangeValuesTest([NUnit.Framework.Range(1, 10)] int x,
                            [Values("test", "test2", "test3")] string y) {
	Assert.Pass ();
}

みたいにすると、

UnityTestTools_1_6_rangevalues

というように、両方の値を網羅したテストが作られます。

結果とセットでの指定ができないので、結果が一定の場合(trueであるとか、例外が発生しないこととか)で使うことになるかなと思いますけど、forループをテストコード中に書くよりはコードがすっきりすると思います。

セットでループしたい場合はTestCaseSourceでイテレータを作るといいかもしれません。

参考:[Unity Test Tools][UnitTest] 異なる引数を取るテストを実行する

ValuesとRangeをセットで指定する

…結果とセットでの指定ができない。そう思っていた時期が僕にもありました。

Sequential属性をつけることで、ValuesおよびRangeの値の代入が、セットで順番づつになります。

先ほどのメソッドを

[Test, Sequential]
public void RangeValuesTest([NUnit.Framework.Range(1, 10)] int x,
                            [Values("test", "test2", "test3")] string y) {
	Assert.Pass ();
}

と変更すると、

UnityTestTools_1_6_seq

というように、1項目づつ代入していってくれます。

配列数が足りないところはnullがはいるよう。

これで、結果とセットでテストを設定することができます。

スポンサーリンク
GoogleAdSence レクタングル(大)

シェアする

スポンサーリンク
GoogleAdSence レクタングル(大)