我希望这不是一个愚蠢的问题,而是我一直在想的事情。我希望为单元测试编写一个方法,该方法包含一些逻辑来检查某些值是否为空。
public void MyMethod(string value1, string value2)
{
if(value1 != null)
{
//do something (throw exception)
}
if(value2 != null)
{
//do something (throw exception)
}
//rest of method
}
我想通过将null值传递给方法来测试它。我的问题是我应该为每个参数创建一个单元测试,还是可以创建一个单元测试,检查如果我将value1设置为null然后检查如果我将value2设置为null会发生什么。
即
[TestMethod]
public void TestMyMethodShouldThrowExceptionIfValue1IsNull()
{
//test
}
[TestMethod]
public void TestMyMethodShouldThrowExceptionIfValue2IsNull()
{
//test
}
或
[TestMethod]
public void TestMyMethodWithNullValues()
{
//pass null for value1
//check
//pass null for value2
//check
}
或者它有什么区别?我想我在某个地方读到你应该限制自己每单元测试一个断言。这是对的吗?
提前致谢 快速切换
答案 0 :(得分:9)
您应该为每个测试用例(断言)编写单元测试,以避免Assertion Roulette。
答案 1 :(得分:6)
“理想”单元测试只测试一件事,以便精确查明错误。
在实践中,这并不像大多数TDD支持者那样重要,因为测试不会经常失败,并且发现哪个断言失败几乎没有时间与调查和解决问题所涉及的其他工作相比几乎没有时间
在编写测试以便在失败时(可能永远不会发生)保存自己的工作时做额外的工作是YAGNI的一种形式。
如果有多种方法除了输入更多方法声明之外没有额外的工作,你应该这样做,但如果它导致重复的设置代码,我认为在一种测试方法中测试几个条件绝对没有错。
答案 2 :(得分:3)
如果您在同一测试方法中进行两项测试,那么您的测试不会进行“unit-test”。
例如,如果第一个null
值的测试失败怎么办?
如果两个测试都采用相同的测试方法,则可能不会执行第二次测试;这意味着对第二个null
值的测试取决于对第一个null
值的测试。
另一方面,如果您有两种不同的测试方法,则可以完全隔离地测试每种情况。
从MyMethod
方法的代码判断,这两个条件之间没有联系;这意味着在这两个条件的测试之间不应该有任何依赖。
所以:你应该使用两个不同的测试。
答案 3 :(得分:0)
推断出非技术性的想法。
假设您有车,并且想要测试颜色。
测试可能是:
车是红色的。 车是蓝色的。 汽车被涂上了。
现在拥有“彩绘”和“蓝色”可能是有道理的,但它们确实是不同的东西。如果你测试红色和蓝色,它将永远失败 - 或者从隔离的角度看失败是没有意义的。
总是按照你的建议一次测试一件事,很多东西都包含测试套件。