6

私は次のものを持っているとしましょう:

  [Test]
  // would like to parameterize the parameters in call AND the call itself
  public void Test()
  {
      var res1 = _sut.Method1(1);
      var res2 = _sut.Method2("test");
      var res3 = _sit.Method3(3);

      Assert.That(res1, Is.Null);
      Assert.That(res2, Is.Null);
      Assert.That(res3, Is.Null);
  }

呼び出し自体を含む TestCase/TestCaseSource 属性を使用して、テストをパラメーター化したいと思います。テストの繰り返しの性質上、各メソッドはわずかに異なるパラメーターで呼び出す必要がありますが、異なるパラメーターごとに異なる呼び出しにタグを付けることができる必要があります。これはNunitでも可能ですか?もしそうなら、どうすればいいですか?

4

2 に答える 2

5

TestCaseSourceを使用すると、たとえば次のように、値の配列をループして目的のメソッドを呼び出すことができるはずです。

[TestFixture]
public class TestClass
{
  private Sut _sut;

  public TestClass()
  {
    _sut = new Sut(...);
  }

  private IEnumerable<object> TestCases
  {
    get
    {
      var values = new object[,] { { 1, "test", 3 }, { 2, "hello", 0 }, ... };

      for (var i = 0; i < values.GetLength(0); ++i)
      {
          yield return _sut.Method1((int)values[i,0]);
          yield return _sut.Method2((string)values[i,1]);
          yield return _sut.Method3((int)values[i,2]);
      }
    }
  }

  [TestCaseSource("TestCases")]
  public void Test(object val)
  {
    Assert.That(val, Is.Null);
  }
}

インスタンスはコンストラクター_sutでインスタンス化する必要があることに注意してください。orメソッドTestClass内で初期化するだけでは不十分です。[SetUp][TestFixtureSetUp]

メソッド呼び出しごとに異なるインスタンス化が必要な場合は、コンストラクター_sutでインスタンスのコレクションを作成し、 getterのループ内でSut関連Sut項目にアクセスできます。または、ゲッター内のすべてのアイテムをループすることもできます...forTestCasesSut

于 2012-06-29T09:38:26.950 に答える
0

Afaik、NUnit にはそのような組み込みメカニズムはありません。ただし、テストに複数のメソッドが存在する場合は、それらを個別のテストに分割することをお勧めします。

そうは言っても、これらのメソッドを常に同じオブジェクト ( _sut) で呼び出す場合は、リフレクションを使用してこれを行うことができます (発生したオーバーヘッドを取ることにした場合も同様です)。

たとえば、TestCaseSource に文字列パラメーターを追加し、テスト メソッドで次のように呼び出します。

Type type = _sut.GetType();
MethodInfo methodInfo = type.GetMethod(methodName);
object result = methodInfo.Invoke(_sut, null);

ただし、パラメータ化する各メソッドが異なる数の引数を取る場合、事態はすぐに複雑になります。どのテストが失敗したかをデバッグして確認することも、はるかに困難になります。これらのテストを分割できれば最高です。

于 2012-06-29T09:29:36.423 に答える