2017-03-06 63 views
4

我正在用C编写一些单元测试,使用nunit。请看下面的代码:让单元测试在循环中运行是不好的做法吗?

[Test()] 
    public void TestCarCost() { 
     for (int i = 0; i < Examples.exampleCount; i++) { 
      Car car = new Car(Examples[i]); 
      Assert.AreEqual (car.getCost(), Examples[i].cost, "Test " + (i + 1) + " failed"); 
     } 
    } 

假设的例子是一些静态的数据类的汽车类型测试不同可能的输入,你可以看到,我想测试在car.getCost任何错误()功能。现在让它在一个循环中感觉不对,因为例如当任何断言失败时,它总是将你发送到同一行代码。而且,据我所知每当[Test()]中的断言失败时,nunit立即终止测试代码的其余部分。这意味着如果我有一个循环内的所有内容,并且断言nr 1失败,我不会去查看其他断言是否失败。明确地写出所有的测试基本上是写copypasted的代码,所以它也不觉得正确。在这种情况下什么会被认为是良好的做法?在单元测试中有大量类似的代码可以吗?有没有一些优雅的解决方案,我失踪了?

+2

您可以在这里使用NUnit的'TestCase'属性。这里的'Example'是什么? –

回答

5

这是更好地使用TestCaseAttribute代替循环。请在以下link阅读更多信息。

你的情况应该是:

[TestCase(1)] 
[TestCase(2)] 
[TestCase(3)] 
public void TestCarCost (int id) 
{   
    Car car = new Car(Examples[id]); 
    Assert.AreEqual (car.getCost(), Examples[id].cost, "Test " + (i + 1) + " failed"); 

} 

在这里,你可以创建多个测试案例的单一测试方法。对于每个测试用例,您可以在TestCase()属性中提供参数并将其作为id传递给您的测试方法。

基于id你可以访问你的资源,这是你的情况`例子[id]。'

我宁愿使用这种方式,因为我可以监视每个案例,它不需要额外的逻辑。

另外,如果你在单元测试中增加额外的逻辑,你将增加失败的机会,并且你将依赖于该逻辑的准确性。

7

NUnit内置支持parameterized tests。如果您的示例数据是简单的(即值可以出现在属性,像string),您的测试可以使用TestCase attributes和看起来像这样:

[TestCase("Example Value 1", ExpectedResult=123.4)] 
[TestCase("Example Value 2", ExpectedResult=567.8)] 
[TestCase("Example Value 3", ExpectedResult=901.2)] 
public void TestCarCost (string exampleValue) { 
    Car car = new Car(exampleValue); 
    return car.GetCost();   
} 

如果你的榜样值(真的,测试输入),不能出现在属性,你可以使用TestCaseSource attribute,表明将提供价值为你的成员:

[TestCaseSource(nameof(Examples))] 
public void TestCarCost (ExampleInput exampleValue) { 
    Car car = new Car(exampleValue); 
    return car.GetCost();   
} 

public IEnumerable<ITestCaseData> Examples { 
    get { 
     yield return new TestCaseData(new ExampleInput(1,2)).Returns(123.4); 
     yield return new TestCaseData(new ExampleInput(3,4)).Returns(567.8); 
     yield return new TestCaseData(new ExampleInput(5,6)).Returns(901.2); 
    } 
} 
+0

我接受了另一篇文章,但你的回答也非常有见地,谢谢。这对我将来肯定会有用。 – TheMountainThatCodes