说我有以下内容:
[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甚至可能吗?如果是这样,我该怎么做呢?
答案 0 :(得分: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]
或[TestFixtureSetUp]
方法中初始化它是不够的。
如果您需要为不同的方法调用使用不同的_sut
实例,您可以在构造函数中创建Sut
个实例的集合,并访问{{1}中的相关Sut
项for
getter的循环。或者,您甚至可以遍历getter中的所有TestCases
个项目......
答案 1 :(得分:0)
Afaik,NUnit中没有这样的内置机制。但是,如果测试中存在多种方法,我认为将它们分成单独的测试是更好的做法。
话虽如此,只要你总是在同一个对象(_sut
)上调用这些方法,你就可以通过反射来做到这一点(如果你决定承担所产生的开销)。
例如,在TestCaseSource中添加一个字符串参数,并在test方法中调用它:
Type type = _sut.GetType();
MethodInfo methodInfo = type.GetMethod(methodName);
object result = methodInfo.Invoke(_sut, null);
当您想要参数化的每个方法将采用不同数量的参数时,事情会很快变得复杂。调试和查看哪个测试失败也将更加困难。你最好分开这些测试。