|
1 |
| -// Copyright (c) 2021-2023 Koji Hasegawa. |
| 1 | +// Copyright (c) 2021-2025 Koji Hasegawa. |
2 | 2 | // This software is released under the MIT License.
|
3 | 3 |
|
| 4 | +using System.Collections; |
4 | 5 | using System.Threading.Tasks;
|
5 | 6 | using NUnit.Framework;
|
6 | 7 | using UnityEngine.TestTools;
|
|
10 | 11 | namespace APIExamples.NUnit
|
11 | 12 | {
|
12 | 13 | /// <summary>
|
13 |
| - /// <see cref="PairwiseAttribute"/>によって<see cref="ValuesAttribute"/>および<see cref="ValuesAttribute"/>の組み合わせを絞り込む例。 |
| 14 | + /// <see cref="PairwiseAttribute"/> によって <see cref="ValuesAttribute"/> および <see cref="ValuesAttribute"/> の組み合わせを絞り込むパラメタライズドテストの記述例. |
| 15 | + /// <p/> |
| 16 | + /// 全網羅のサンプルは <see cref="ValuesAttributeExample"/> および <see cref="ValueSourceAttributeExample"/> を参照してください。 |
| 17 | + /// 組み合わせを固定する <see cref="SequentialAttribute"/> のサンプルは <see cref="SequentialAttributeExample"/> を参照してください。 |
14 | 18 | /// </summary>
|
15 | 19 | /// <remarks>
|
16 |
| - /// <see cref="UnityTestAttribute"/>と同時に使用すると正しい組み合わせが得られません(むしろ増える) |
| 20 | + /// <see cref="UnityTestAttribute"/> と同時に使用すると正しい組み合わせが得られません(むしろ増える) |
17 | 21 | /// </remarks>
|
18 | 22 | [TestFixture]
|
19 | 23 | public class PairwiseAttributeExample
|
20 | 24 | {
|
21 | 25 | [Test]
|
22 | 26 | [Pairwise]
|
23 |
| - public void Values属性の組み合わせを絞り込み可能( // 全網羅では6*6*3*2=216通りのところ、ペアワイズ法によって36通りになる例 |
24 |
| - [Values] Element defence, |
25 |
| - [Values] Element attack, |
26 |
| - [Values(1, 2, 3)] int intArgument, |
27 |
| - [Values] bool boolArgument) |
| 27 | + public void Values属性の組み合わせをペアワイズ法で絞り込む例( |
| 28 | + [Values] Element defence, |
| 29 | + [Values] Element attack, |
| 30 | + [Values(1, 2, 3)] int intArgument, |
| 31 | + [Values] bool boolArgument) |
| 32 | + // Note: 全網羅では 4*4*3*2=96 通りのところ、ペアワイズ法によって 16 通りになります |
28 | 33 | {
|
29 | 34 | var actual = defence.GetDamageMultiplier(attack);
|
30 | 35 |
|
31 |
| - Assert.That(actual, Is.GreaterThanOrEqualTo(0.5f).And.LessThanOrEqualTo(2.0f)); |
| 36 | + Assert.That(actual, Is.GreaterThanOrEqualTo(1.0f).And.LessThanOrEqualTo(2.0f)); |
32 | 37 | }
|
33 | 38 |
|
| 39 | + // テストケースの引数が取る値を静的フィールドで定義 |
| 40 | + private static Element[] s_elements = { Element.None, Element.Fire, Element.Water, Element.Wood }; |
| 41 | + private static int[] s_intValues = { 1, 2, 3 }; |
| 42 | + private static bool[] s_boolValues = { false, true }; |
| 43 | + |
34 | 44 | [Test]
|
35 | 45 | [Pairwise]
|
36 |
| - public async Task Values属性の組み合わせを絞り込み可能_AsyncTest( // 全網羅では6*6*3*2=216通りのところ、ペアワイズ法によって36通りになる例 |
37 |
| - [Values] Element defence, |
38 |
| - [Values] Element attack, |
39 |
| - [Values(1, 2, 3)] int intArgument, |
40 |
| - [Values] bool boolArgument) |
| 46 | + public void ValueSource属性の組み合わせをペアワイズ法で絞り込む例( |
| 47 | + [ValueSource(nameof(s_elements))] Element defence, |
| 48 | + [ValueSource(nameof(s_elements))] Element attack, |
| 49 | + [ValueSource(nameof(s_intValues))] int intArgument, |
| 50 | + [ValueSource(nameof(s_boolValues))] bool boolArgument) |
| 51 | + // Note: 全網羅では 4*4*3*2=96 通りのところ、ペアワイズ法によって 16 通りになります |
41 | 52 | {
|
42 | 53 | var actual = defence.GetDamageMultiplier(attack);
|
43 |
| - await Task.Delay(0); |
44 | 54 |
|
45 |
| - Assert.That(actual, Is.GreaterThanOrEqualTo(0.5f).And.LessThanOrEqualTo(2.0f)); |
| 55 | + Assert.That(actual, Is.GreaterThanOrEqualTo(1.0f).And.LessThanOrEqualTo(2.0f)); |
46 | 56 | }
|
47 | 57 |
|
48 |
| - private static Element[] s_defence1X = { Element.Wood, Element.Fire, Element.Water }; |
49 |
| - private static Element[] s_attack1X = { Element.None, Element.Earth, Element.Metal }; |
50 |
| - private static int[] s_intValues = { 1, 2, 3 }; |
51 |
| - private static bool[] s_boolValues = { false, true }; |
52 |
| - |
53 |
| - [Test] |
| 58 | + [Explicit("UnityTest では Pairwise 属性は正しい組み合わせを生成しません")] |
| 59 | + [UnityTest] |
54 | 60 | [Pairwise]
|
55 |
| - public void ValueSource属性の組み合わせも絞り込み可能( // 全網羅では3*3*3*2=54通りのところ、ペアワイズ法によって10通りになる例 |
56 |
| - [ValueSource(nameof(s_defence1X))] Element defence, |
57 |
| - [ValueSource(nameof(s_attack1X))] Element attack, |
58 |
| - [ValueSource(nameof(s_intValues))] int intArgument, |
59 |
| - [ValueSource(nameof(s_boolValues))] bool boolArgument) |
| 61 | + public IEnumerator UnityTestではPairwise属性は正しい組み合わせを生成しない( |
| 62 | + [Values] Element defence, |
| 63 | + [Values] Element attack, |
| 64 | + [Values(1, 2, 3)] int intArgument, |
| 65 | + [Values] bool boolArgument) |
60 | 66 | {
|
61 | 67 | var actual = defence.GetDamageMultiplier(attack);
|
| 68 | + yield return null; |
62 | 69 |
|
63 |
| - Assert.That(actual, Is.GreaterThanOrEqualTo(0.5f).And.LessThanOrEqualTo(2.0f)); |
| 70 | + Assert.That(actual, Is.GreaterThanOrEqualTo(1.0f).And.LessThanOrEqualTo(2.0f)); |
64 | 71 | }
|
65 | 72 |
|
66 | 73 | [Test]
|
67 | 74 | [Pairwise]
|
68 |
| - public async Task ValueSource属性の組み合わせも絞り込み可能_AsyncTest( // 全網羅では3*3*3*2=54通りのところ、ペアワイズ法によって10通りになる例 |
69 |
| - [ValueSource(nameof(s_defence1X))] Element defence, |
70 |
| - [ValueSource(nameof(s_attack1X))] Element attack, |
71 |
| - [ValueSource(nameof(s_intValues))] int intArgument, |
72 |
| - [ValueSource(nameof(s_boolValues))] bool boolArgument) |
| 75 | + public async Task 非同期テストでもPairwise属性は使用可能( |
| 76 | + [Values] Element defence, |
| 77 | + [Values] Element attack, |
| 78 | + [Values(1, 2, 3)] int intArgument, |
| 79 | + [Values] bool boolArgument) |
| 80 | + // Note: 全網羅では 4*4*3*2=96 通りのところ、ペアワイズ法によって 16 通りになります |
73 | 81 | {
|
74 | 82 | var actual = defence.GetDamageMultiplier(attack);
|
75 |
| - await Task.Delay(0); |
| 83 | + await Task.Yield(); |
76 | 84 |
|
77 |
| - Assert.That(actual, Is.GreaterThanOrEqualTo(0.5f).And.LessThanOrEqualTo(2.0f)); |
| 85 | + Assert.That(actual, Is.GreaterThanOrEqualTo(1.0f).And.LessThanOrEqualTo(2.0f)); |
78 | 86 | }
|
79 | 87 | }
|
80 | 88 | }
|
0 commit comments