2010-06-28 31 views
5

我正在用VB.NET和NUnit学习TDD。我想知道什么是最好的做法:在测试方法中使用很多Assert方法或使用每个方法的assert方法?VB.NET和NUnit - TDD

这是我的代码。谢谢。

Imports NUnit.Framework 

<TestFixture()> _ 
Public Class CalculatorTest 
<Test()> _ 
Public Sub TestAdd() 
    Dim calculator As Calculator = New Calculator() 

    Assert.AreEqual(2, calculator.sum(1, 1)) 
    Assert.AreNotEqual(3, calculator.sum(2, 2)) 
    Assert.AreEqual(-1, calculator.sum(0, -1)) 
     Assert.AreNotEqual(3, calculator.sum(1, 1)) 
    End Sub 
End Class 

回答

5

普遍接受的“最佳实践”是每个测试的一个断言。 (据罗伊Osherove)

然而,这种特殊的测试可能做了一些更简单地与NUnit的使用的TestCase:

<Test()> _ 
<TestCase(1, 1, 2)> _ 
<TestCase(1,-1, 0)> _ 
<TestCase(0,-1,-1)> _ 
Public Sub Calculator_Add_ReturnsExpectedResult(Integer a, Integer b, Integer expected) 
    Dim calculator As Calculator = New Calculator() 

    Assert.AreEqual(expected, calculator.sum(a, b)) 
End Class 

另外请注意我用那里的命名,以澄清正是考验正在测试。

“One As Per Per Test”实践背后的原理是,您希望失败的测试意味着非常具体的东西。也就是说,每个测试都会告诉你一个特定的事情是否正在工作。

+0

_:这是什么意思?谢谢。 – Thomas 2010-06-28 12:45:38

+0

这意味着它会多次调用您的测试函数,每个函数都有不同的输入(如注释中所指定的)。在这种情况下,它会调用它三次,首先是(1,1,2),然后是(1,-1,0),最后是(0,​​-1,-1)。 – 2010-06-28 12:47:48

+0

谢谢,我明白了! – Thomas 2010-06-28 13:01:25

0

这是一个有趣的辩论,可以归结为一个风格问题。 我喜欢Roy Osherove的观点,你应该只有一个断言每单元测试。

请阅读他对此问题的深入讨论here

另外,检查this了。

+0

这不是一个真正的“辩论”,更多的是一种风格的讨论。我更喜欢在每个测试中使用多个断言,并且发现大多数真实世界的单元测试都需要多个断言来清除给定测试的所有假设。 – 2010-06-28 12:41:09

+0

谢谢,我会读它! – Thomas 2010-06-28 12:46:05

7

想一想更好的方法就是一次测试一件东西。根据需要使用尽可能多的断言来测试这件事,但通常只有一件。多次断言可能表示您一次测试多件事,但在我看来,这不是一条坚强而快速的规则。最好的指导是你不想在独立概念之间的测试中创建依赖关系。

在你的例子中,你实际上正在测试4件事,尽管你实际上可能只需要其中的两件,因为它们覆盖了相同的地面。我建议测试当你添加两个正数,两个负数,一个负数和一个积极的负数和积极结果时会发生什么。然后我会考虑数学性质和测试交换性以及附加标识(零)。最后,我会测试边界条件 - 正面和负面溢出等。请注意,这可能是也可能不是全面的,即我认为我已经涵盖了基础,但我并不努力要穷尽;我只想说明你如何去思考要写什么样的测试,是的,我会用单个断言来完成每个单独的测试。

对于更复杂的事情,您可能有多个声明测试相同的“事物” - 例如,您可能想要检查一行是否已正确插入到具有给定输入集的数据库中。我认为完全可以接受的是,在单个测试中测试所有列都具有合适的值,而不是单独测试每个属性。其他人可能会有所不同,但我不认为在这种情况下,通过测试所有属性具有正确的值来创建任何依赖关系,因为插入是原子操作。

+0

一个很好的解释。谢谢! – Thomas 2010-06-28 13:03:19

0

奥舍罗夫的观点含有原教旨主义。例如,如果一个函数返回一个结构体/类,那么你要么必须使用几个断言,要么做一个自定义结构来比较断言,这实际上只是做同样的事情。

重要的是测试功能的功能。也许总是质疑“专家”。