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实例需要在TestClass构造函数中实例化。[SetUp]在or[TestFixtureSetUp]方法中初始化它是不够的。

如果您需要不同_sut方法调用的不同实例化,您可以在构造函数中创建实例集合,并在getter的循环中Sut访问相关Sut项。或者,您甚至可以遍历getter 中的所有项目...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 回答