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

## 環境

Unity2017.4.3f1

## 一覧

#### <strong>Test</strong>
テストメソッドにつける。返り値はvoidでなくてはならない


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


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


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


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


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


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


#### Ignore
テストを実行しない


```csharp
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
テストする値を指定する


```csharp
[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フィールドをテストする値として使用する


```csharp
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
引数にそれぞれテストする値を指定する


```csharp
[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フィールドをテストケースとして使用する


```csharp
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
テストする値を範囲で指定する


```csharp
// 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
テストする値をランダムで指定する


```csharp
// ランダムな値で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
テストケースの組み合わせ方の指定

- <strong>Combinatorial</strong> - 全組み合わせパターンでテストする。何も指定しなかった場合はたぶんコレ
- <strong>Sequential</strong> - 各値を一度ずつ使用するパターンでテストする
- <strong>Pairwise</strong> - ペアワイズ法でテストする。テストケースの組み合わせパターンを大幅に削減できるらしい（3つ以上の組み合わせの場合のみ）


```csharp
// 全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
テストが失敗したら、指定した回数内で成功するまで再実行する


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

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


---


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


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


```csharp
// 指定する時間はミリ秒
[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の妥当性を検証する


```csharp
[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"から除外される）


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


---


#### Description
テストの説明文をつける


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


---


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


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


---


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


```csharp
// Windows10またはMacOSXでのみテストを実行する
[Platform ("Windows10, MacOsX")]
public class Hoge {
  [Test]
  public void Test () {}
}
```