2011-01-27 63 views
19

我想编写一个可调用的函数来接受两个对象,并将这些对象的30多个属性与断言进行比较。问题是,需要为大约20个现有的单元测试和大多数未来的测试完成这项工作,并且每次写出30个以上的断言既耗费时间又耗费空间。是否可以参数化一个nunit测试

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

有没有一种方法可以从单元测试中调用一个函数来调用assert来检查条件?

回答

17

要回答的最后一部分,当然你可以断言的另一个函数内。通过提高例外,测试运行渔获断言的工作,并解释是失败的,所以有一个测试,像这样将正常工作:

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

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

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

特别是,请查看NUnit.TestCaseAttribute

+0

我已经看过,但看不到如何设置动态参数。我想比较20个手动填充的对象与数据库中的自动填充对象。使用断言(不是测试用例)创建一个void函数并从我的单元测试中调用它可以很好地工作。谢谢 – NewNetProgrammer 2011-01-27 16:04:51

32

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

普通的单元测试与[测试]装饰,但我们可以替换如下:

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

    //Act 

    //Assert 
} 

这类型的事情会做的方式 - 显然需要不同PARAMS。

看这个求助:http://nunit.org/?p=testCase&r=2.5

+0

问题是,我的测试用例不是静态的。我有一个手动填充的对象,并从数据库中填充一个我想要比较的对象。 – NewNetProgrammer 2011-01-27 16:01:55

+0

`expected`应该是参数化测试的返回类型,您应该提供带有返回值而不是参数的测试用例。 – 2012-01-12 21:27:57

0

你需要TestCase的属性:

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

注意,这仅与基本数据类型,如字符串和整数工程 - 你不能实例化自己的类,并将其用作参数。

+0

问题是我用我自己的类对象与30多个属性,我想比较。 – NewNetProgrammer 2011-01-27 16:05:20

1

可以使用TestCase属性:

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

您也可以使用C#反省中受益。这使您可以获取字段的名称,而无需在代码中指定它们。然后你可以通过名字来调用它们。

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

这使您可以编写适用于您尚未编写的类的某些测试。

相关问题