🔬

NUnit Attributes CheetSheet

2021/09/19に公開

Unity Test Framework(UTF)で使われているNUnitの属性を分かる範囲でまとめてみる.

[TestFixture]

テスト・メソッドを含むクラスにつける属性だが, Unityの場合は必要と思われる.

[Test]

主にエディタ・モードで使われる. メソッドに付けて単体テストとして実行する.[1]

[Test]
public void TestSample() {
    // write your own test
}

[UnityTest]

UTFで追加された属性で主にプレイ・モード・テストで利用する. フレームを飛ばすことで実際にゲームの流れを再現できる.

// A UnityTest behaves like a coroutine in Play Mode. In Edit Mode you can use
// `yield return null;` to skip a frame.
[UnityTest]
public IEnumerator SampleWithEnumeratorPasses() {
    // Use the Assert class to test conditions.
    // Use yield to skip a frame.
    yield return null;
}

[SetUp]

テスト・ケース共通の処理を記述する. OneTimeSetUpやTestFixtureSetUpというのもある.

[SetUP]
public void SetUp() {
    // write setup process
}

[teardown]

テスト・ケース共通の後処理を記述する. OneTimeTearDownやTestFixtureTearDownというのもある.

[TearDown]
public void Cleanup() {
    // write cleanup process
}

[Ignore]

この属性をつけたメソッドは実行されない. 理由と期限を設定することもできる.

[Test]
[Ignore("Write a reason why skip this test",  Until = "2014-07-31 12:00:00Z")]
public void IgnoredTest() {
    // write your own test
}

[TestCase]

テストケースを記述できる. ExpectedResultという名前付きパラメータを指定するとアサートもいらなくなり, テストコード中に実行結果をexpectという変数で持ち必要がなくなる.

[TestCase(12, 3, 4)]
[TestCase(12, 2, 6)]
[TestCase(12, 4, 3)]
public void DivideTest(int n, int d, int q)
{
    Assert.AreEqual(q, n / d);
}

[TestCaseSource]

別に指定したソースをテスト・ケースとして利用できる.

public class MyTestClass
{
    [TestCaseSource(nameof(DivideCases))]
    public void DivideTest(int n, int d, int q)
    {
        Assert.AreEqual(q, n / d);
    }

    static object[] DivideCases =
    {
        new object[] { 12, 3, 4 },
        new object[] { 12, 2, 6 },
        new object[] { 12, 4, 3 }
    };
}

Parameterized Tests

[Range]

引数に数列を指定できる. 下の例では二つのRange属性が指定されている. この場合組み合わせ的に実行される.

[Test]
public void RectArea([Range(-2, 2)] float x, [Range(-2, 2)] float y) {
}

[Random]

ランダムな値をパラメータとして指定する.

[Test]
public void RandomizedTest([Random(1, 10, 5) int randomizedParam]) {
}

[Values]

指定した値をテストのパラメータとして渡す.

[Test]
public void TestValues([Values(1, 2, 3)] int x) {
}

あるいは他のパラメータ化テスト属性と一緒に使うことで組み合わせ的な[2]テストケースを指定できる.

[Test]
public void TestCombo([Values(1, 2, 3)] int x, [Random(1, 5, 2) int n]) {
}

[Sequential]

テストケースを順番に実行する.

[Test, Sequential]
public void TestCombo([Values(1, 2, 3)] int x, [Values(1, 5) int n]) {
}

すなわち

x n
1 1
2 5
3 null

となる. 対応する数値がない場合はnullになる.

[Combinatorial]

テストケースを組み合わせ的に生成する.

[Test, Combinatorial]
public void TestCombo([Values(1, 2, 3)] int x, [Values(1, 5) int n]) {
}

[Pairwise]

可能なペアをテストケースとして生成する[3].

[Test, Pairwise]
public void TestCombo([Values(1, 2, 3)] int x, [Values(1, 5) int n]) {
}

[Repeat]

テストの繰り返し回数を指定する.

[Test, Repeat(5)]
public void TestSeveralTimes() {
}

[MaxTime]

テストに"時間切れ"を設定できる. 指定したミリ秒を超えた場合失敗と見なされる.

[Test, MaxTime(2000)]
public void TimedTest()
{
    /* ... */
}

[Retry]

テストが失敗した場合のやり直す回数を指定できる. 最初の失敗したテストを含む回数を指定する.

[Test, Retry(2)]
public void TestRetryOnceAfterFailed() {
}

[Order]

テストの順番を指定できる.

[Test, Order(1)]
public void TestA() {}

[Test, Order(2)]
public void TestB() {}

[Theory]

良く分からない.

[Author]

作者の名前と電子メールを指定できる.

[Test]
[Author("brainvader", "brainvade@gmail.com")]
public void OresamanoTest() {
    // This is my test
}

[Description]

テストの説明を書ける.

[Test, Description("Simple Test")]
public void TestSimpleMethod() {
    // write a simple test
}

[Category]

テストをカテゴリでまとめることができる. 指定したカテゴリはUnityのTest Runnerウィンドウから選択できる. カテゴリに該当するテストだけが表示され実行できる.

[Test, Category("LongTest")]
public void Test1() {}

[Test, Category("ShortTest")]
public void Test2() {}

Reference

注釈

脚注
  1. Setup and cleanup at build timeで使われているがまだ読んでない. ↩︎

  2. Combinatorialと表現されている数学的な意味では順列と思われる. ↩︎

  3. こっちがいわゆる組み合わせである. ↩︎

Discussion