特定の値を指定してテストしたい場合、RangeやValueの属性を使います。
一定の範囲の数値を与える
一定の範囲の数値を与えてテストするためにはRangeを使います。
[Test] public void RangeTest([NUnit.Framework.Range(1, 10)] int x) { Assert.Pass (); }
TestRunnerではこのように、指定した範囲のテストが自動生成されています。
これで引数にxを取るメソッドをテストすれば、1~10の範囲のテストが実行されるのでfor文などで回さなくてもよくなります。
指定の数値で増やしていきたい場合は、第三引数に指定すると、
[Test] public void RangeTest([NUnit.Framework.Range(1, 10, 2)] int x) { Assert.Pass (); }
このようにその数値だけ間を開けてテストが生成されます。
引数にはintのほかにdouble, float, longも取れます。
指定した値を与える
Rangeと違い、ひとつひとつの値を指定したい場合はValuesを使います。
[Test] public void ValuesTest([Values(1, 2, 5, 10)] int x) { Assert.Pass (); }
とすると、
というように指定した値だけでテストが生成されます。
これはobjectで値を指定できるので、文字なんかでも大丈夫。
[Test] public void ValuesTest([Values("test", "test2", "test3")] string x) { Assert.Pass (); }
こんな感じで。
RangeとValuesの両方を使うとどうなるか
じゃあこれを両方指定したらどうなるか
[Test] public void RangeValuesTest([NUnit.Framework.Range(1, 10)] int x, [Values("test", "test2", "test3")] string y) { Assert.Pass (); }
みたいにすると、
というように、両方の値を網羅したテストが作られます。
結果とセットでの指定ができないので、結果が一定の場合(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 (); }
と変更すると、
というように、1項目づつ代入していってくれます。
配列数が足りないところはnullがはいるよう。
これで、結果とセットでテストを設定することができます。