是否可以参数化nunit测试

时间:2011-01-27 15:45:14

标签: c# nunit

我想编写一个可调用的函数来接受两个对象,并将这些对象的30多个属性与断言进行比较。问题是需要对大约20个现有单元测试和大多数未来测试进行此操作,并且每次写出30多个断言都耗费时间和空间。

我目前有一个非单元测试函数,用于比较对象,并返回带有“pass”或失败消息的字符串,并使用断言在每个单元测试中验证。然而,它非常混乱,我觉得我反对正确的单元测试方法。

有没有办法制作一个可以使用断言来检查条件的单元测试中可调用的函数?

6 个答案:

答案 0 :(得分:43)

如果您使用的是NUnit 2.5.5或更高版本,则可以使用TestCase属性。

正常单元测试将使用[Test]进行修饰,但我们可以将其替换为:

[TestCase("0", 1)]
[TestCase("1", 1)]
[TestCase("2", 1)]
public void UnitTestName(string input, int expected)
{
    //Arrange

    //Act

    //Assert
}

这种类型的事情将是这样做的方式 - 显然需要不同的参数。

请查看此帮助:http://nunit.org/?p=testCase&r=2.5

答案 1 :(得分:29)

要回答最后一部分,你当然可以在另一个函数中使用Asserts。断言通过引发测试运行器捕获的异常并将其解释为失败来进行工作,因此像这样的测试将正常工作:

public void CheckAsserts(string value)
{
    Assert.IsNotNull(value);
}

[TestCase("yes!")]
public void MyTest(string value)
{
    CheckAsserts(value);
}

答案 2 :(得分:4)

是的,单元测试就像任何其他代码一样。

请特别查看NUnit.TestCaseAttribute

答案 3 :(得分:1)

您可以使用TestCase属性:

[TestCase("hostname1parameter")]
[TestCase("hostname2parameter")]
public void Example_TestHostName(string hostname)
{
    ...
}

答案 4 :(得分:0)

您需要TestCase属性:

[TestCase("string1",...)
public void test_UnitTest(string Parameter)
{
    ...
    Assert.AreEqual(Parameter, result)
}

请注意,这仅适用于原始数据类型(如字符串和整数) - 您无法实例化自己的类并将其用作参数。

答案 5 :(得分:0)

您也可以从使用C#内省中受益。这允许您获取字段的名称,而无需在代码中指定它们。然后,您可以按名称调用它们。

System.Attribute [] attrs = System.Attribute.GetCustomAttributes(t);

这允许您编写某些适用于您尚未编写的类的测试。