Tho*_*mas 5 .net vb.net tdd nunit
我正在学习使用VB.NET和NUnit的TDD.我想知道什么是最好的事情:在测试方法中使用大量的Assert方法或者使用每个方法的断言?
这是我的代码.谢谢.
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
Run Code Online (Sandbox Code Playgroud)
考虑它的更好方法是一次测试一件事.使用尽可能多的断言来测试那一件事,但通常只有一件.多个断言可以表明您一次测试的不止一件事,但在我看来,这并不是一个严格而快速的规则.最好的指南是您不希望在测试之间创建独立概念之间的依赖关系.
在你的例子中,你实际上测试了4件事,尽管你实际上可能只需要其中的两件,因为它们覆盖了相同的基础.我建议测试当你添加两个正数,两个负数,一个负数和一个带有负和正结果的正数时会发生什么.然后我会考虑数学性质和测试可交换性以及加性身份(零).最后,我测试边界条件 - 正面和负面溢出等.注意,这可能是也可能不是全面的,即我认为我已经涵盖了基础,但我并不是太努力无法彻底; 我只是想说明你将如何考虑要编写哪些测试,是的,我会用一个断言来完成每个单独的测试.
对于更复杂的东西,您可能有多个断言测试相同的"东西" - 例如,您可能想要检查一行是否已在具有给定输入集的DB中正确插入.我认为测试所有列在单个测试中具有适当的值,而不是单独测试每个属性是完全可以接受的.其他可能会有所不同,但我不认为在这种情况下,您通过测试所有属性都具有正确的值来创建任何依赖项,因为insert是一个原子操作.
普遍接受的"最佳实践"是每次测试的一个主张.(根据Roy Osherove的说法)
但是,使用TestCases可以使用NUnit更简单地完成此特定测试:
<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
Run Code Online (Sandbox Code Playgroud)
还要注意我在那里使用的命名,以便准确说明测试的测试内容.
"一次断言每次测试"练习背后的主要原因是你想要一个失败的测试意味着非常具体的东西.也就是说,每个测试都应该告诉您一个特定的东西是否有效.