Help us understand the problem. What is going on with this article?

【Unity】TestRunnerで使えるNUnit.Frameworknoアトリビュートの使い方メモ

環境

Unity2017.4.3f1

一覧

Test

テストメソッドにつける。返り値はvoidでなくてはならない

UnityTest

テストメソッドにつける。Unity専用。IEnumeratorでなくてはならない

SetUp

そのクラスの各テストが開始される前に実行される

TearDown

そのクラスの各テストが終了した後に実行される。SetUp必須

OneTimeSetUp

そのクラスのテストが開始される前に一度だけ実行される

OneTimeTearDown

そのクラスの全てのテストが終了した後に実行される。OneTimeSetUp必須

Order

テストの実行の優先度を指定する。クラス内でのみ有効

Ignore

テストを実行しない

public class Hoge {
  [OneTimeSetUp]
  public void OneTimeSetUp () {
    Debug.Log ("OneTimeSetUp");
  }

  [OneTimeTearDown]
  public void OneTimeTearDown () {
    Debug.Log ("OneTimeTearDown");
  }

  [SetUp]
  public void SetUp () {
    Debug.Log ("SetUp");
  }

  [TearDown]
  public void TearDown () {
    Debug.Log ("TearDown");
  }

  [Test, Order (20)]
  public void Test1 () {
    Debug.Log ("Test1");
  }

  [UnityTest, Order (10)]
  public IEnumerator Test2 () {
    Debug.Log ("Test2");
    yield break;
  }

  [Test, Ignore ("実行しない理由をここに書く")]
  public void Test3 () {
    Debug.Log ("Test3");
  }
}

実行結果

OneTimeSetUp
SetUp
Test2
TearDown
SetUp
Test1
TearDown
OneTimeTearDown

Values

テストする値を指定する

[Test]
public void Test1 ([Values (1, 2, 3)]int i) {
  Debug.Log (i);
  // 出力:
  // 1
  // 2
  // 3
}

// boolの場合、Valuesの引数は省略できる
[Test]
public void Test2 ([Values]bool b) {
  Debug.Log (b);
  // 出力:
  // True
  // False
}

// 複数の引数にValuesをつけた場合、組み合わせてテストケースを作成する
[Test]
public void Test3 ([Values (1, 2)]int i, [Values(-2, -4)]int j) {
  Debug.Log (i + "," + j);
  // 出力:
  // 1, -2
  // 1, -4
  // 2, -2
  // 2, -4
}

ValueSource

staticフィールドをテストする値として使用する

static int[] testValues = { 1, 2, 3 };

// こっちでも通る
// static int[] testValues {
//   get {
//     return new [] { 1, 2, 3 };
//   }
// }

// こっちでも通る
// static int[] testValues () {
//   return new [] { 1, 2, 3 };
// }

[Test]
public void Test ([ValueSource ("testValues")]int i) {
  Debug.Log (i);
}

TestCase

引数にそれぞれテストする値を指定する

[Test]
[TestCase (1, 3, 3)]
[TestCase (2, 2, 1)]
[TestCase (3, 3, 3)]
public void Test (int i, int j, int k) {
  Debug.Log (i + ", " + j + ", " + k);
  // 出力:
  // 1,3,3
  // 2,2,1
  // 3,3,3
}

TestCaseSource

staticフィールドをテストケースとして使用する

static int[][] testCases = {
    new [] { 1, 3, 3 },
    new [] { 2, 2, 1 },
    new [] { 3, 3, 3 }
};

// こっちでも通る
// static int[][] testCases {
//   get {
//     return new[] {
//       new [] { 1, 3, 3 },
//       new [] { 2, 2, 1 },
//       new [] { 3, 3, 3 }
//     };
//   }
// }

// こっちでも通る
// static int[][] testCases () {
//   return new[] {
//     new [] { 1, 3, 3 },
//     new [] { 2, 2, 1 },
//     new [] { 3, 3, 3 }
//   };
// }



[Test, TestCaseSource ("testCases")]
public void Test (int i, int j, int k) {
  Debug.Log (i + ", " + j + ", " + k);
  // 出力:
  // 1,3,3
  // 2,2,1
  // 3,3,3
}

Range

テストする値を範囲で指定する

// 3 ~ 7 の値で順にテストする
[Test]
public void Test1 ([NUnit.Framework.Range (3, 7)]int i) {
  Debug.Log (i);
  // 出力:
  // 3
  // 4
  // 5
  // 6
  // 7
}

// 3 ~ 7 の値で3飛ばしにテストする
[Test]
public void Test2 ([NUnit.Framework.Range (3, 7, 3)]int i) {
  Debug.Log (i);
  // 出力:
  // 3
  // 6
}

Random

テストする値をランダムで指定する

// ランダムな値で3回テストする
[Test]
public void Test1 ([Random (3)]int i) {
  Debug.Log (i);
}

// -10 ~ 10 のランダムな値で3回テストする
[Test]
public void Test2 ([Random (-10, 10, 3)]int i) {
  Debug.Log (i);
}

Combinatorial / Sequential / Pairwise

テストケースの組み合わせ方の指定

  • Combinatorial - 全組み合わせパターンでテストする。何も指定しなかった場合はたぶんコレ
  • Sequential - 各値を一度ずつ使用するパターンでテストする
  • Pairwise - ペアワイズ法でテストする。テストケースの組み合わせパターンを大幅に削減できるらしい(3つ以上の組み合わせの場合のみ)
// 全18パターンの組み合わせでテストする
[Test, Combinatorial]
public void Test1 ([Values (1, 2, 3)]int i, [Values(-2, -4)]int j, [Values ("A", "B", "C")]string s) {
  Debug.Log (i + "," + j + "," + s);
  // 出力:
  // 1,-2,A
  // 1,-2,B
  // 1,-2,C
  // 1,-4,A
  // 中略
  // 3,-4,C
}

// 全3パターンの組み合わせでテストする
[Test, Sequential]
public void Test2 ([Values (1, 2, 3)]int i, [Values(-2, -4)]int j, [Values ("A", "B", "C")]string s) {
  Debug.Log (i + "," + j + "," + s);
  // 出力:
  // 1,-2,A
  // 2,-4,B
  // 3,0,C
}

// 全9パターンの組み合わせでテストする
[Test, Pairwise]
public void Test3 ([Values (1, 2, 3)]int i, [Values(-2, -4)]int j, [Values ("A", "B", "C")]string s) {
  Debug.Log (i + "," + j + "," + s);
  // 出力:
  // 1,-2,A
  // 1,-4,C
  // 1,-4,B
  // 2,-2,B
  // 中略
  // 3,-4,A
}

Repeat

テストを指定した回数繰り返す。途中でテストに失敗したら繰り返しを止める

Retry

テストが失敗したら、指定した回数内で成功するまで再実行する

[Test, Repeat (3)]
public void Test1 () {
  Debug.Log ("3回出力される");
}

[Test, Retry (3)]
public void Test2 () {
  Debug.Log ("1回だけ出力される");
}

Timeout

指定した時間経過すると処理を中断し、失敗にする

MaxTime

指定した時間経過すると失敗扱いにする。Timeoutと違い、処理は中断されない

// 指定する時間はミリ秒
[TestTest, Timeout (1000)]
public void Test1 () {
  yield return new WaitForSeconds (1.5f);
  Debug.Log ("テストは失敗し、何も出力されない");
}

// 指定する時間はミリ秒
[Test, MaxTime (1000)]
public IEnumerator Test2 () {
  yield return new WaitForSeconds (1.5f);
  Debug.Log ("テストは失敗するが、このログは出力される");
}

Datapoint

Theoryで妥当性を検証する変数に付ける

DatapointSource

Theoryで妥当性を検証するフィールドに付ける

Theory

DataPoint,DataPointSourceの妥当性を検証する

[Datapoint]
int testValue1 = 2, testValue2 = 3, testValue3 = 4;

[DatapointSource]
int[] testValues = { 102, 103, 104 };

[DatapointSource]
int[] TestValues {
  get {
    return new [] { 202, 203, 204 };
  }
}

[DatapointSource]
int[] GetTestValues () {
  return new [] { 302, 303, 304 };
}

[Theory]
public void Theory (int i) {
  // 一桁目が2より大きくないと許さない
  Assert.Greater (i % 10, 2);
}

Explicit

個別に実行しない限り実行されない(="Run All"から除外される)

[Test, Explicit]
public void Test () {}

Description

テストの説明文をつける

[Description ("クラスの説明")]
public class Hoge {
  [Test, Description ("テストの説明")]
  public void Test () {}
}

Category

テストにカテゴリーを指定する。TestRunnerではカテゴリーごとにテストを実行する/しないの指定ができる

[Category ("Scene 1")]
public class Hoge {
  [Test, Category ("Scene 1/Phase 1")]
  public void Test () {}
}

Platform

テストを実行する環境を制限する。OS、アーキテクチャ、ランタイムを指定できる。カンマ区切りで複数指定可能

// Windows10またはMacOSXでのみテストを実行する
[Platform ("Windows10, MacOsX")]
public class Hoge {
  [Test]
  public void Test () {}
}
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
No comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
ユーザーは見つかりませんでした