单元测试 - 我应该拆分测试还是进行单个测试?
我希望这不会成为一个愚蠢的问题,但它是我一直想知道的。我希望编写一个单元测试的方法,它包含一些逻辑来检查某些值是否为空。单元测试 - 我应该拆分测试还是进行单个测试?
public void MyMethod(string value1, string value2)
{
if(value1 != null)
{
//do something (throw exception)
}
if(value2 != null)
{
//do something (throw exception)
}
//rest of method
}
我想通过将空值传递给方法来测试它。我的问题是我应该为每个参数创建一个单元测试,还是可以创建一个单元测试来检查发生了什么,如果我将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
}
或者它有什么区别?我想我在某处读到你应该限制自己每个单元测试的一个断言。它是否正确?
在此先感谢 的ZAP
如果你正在做两个测试在同样的测试方法,你的测试都没有做“单元测试”。
例如,如果第一个null
值的测试失败会怎么样?
如果两个测试都采用相同的测试方法,则可能不会执行第二个测试;这意味着对第二个null
值的测试取决于对第一个值的测试。
在另一方面,如果你有两个单独的测试方法,可以测试在完美的隔离每一种情况下。
从您的MyMethod
方法的代码判断,这两个条件之间没有联系;这意味着在这两个条件的测试之间不应该存在任何依赖关系。
所以:你应该使用两个不同的测试。
即使你将你的测试分组,你的测试代码单元仍然是相同的 - 所以它仍然是单元测试:o)但是你逐渐失去的是查明失败的能力。在实践中,它是在很多测试(=很多语法)与查明能力之间进行权衡 - 请参阅迈克尔的答案。 – MaR 2010-03-01 12:58:40
“理想的”单元测试只是为了准确地查明错误而测试一件事情。
实际上,这并不像大多数TDD支持者所说的那么重要,因为测试不会经常失败,并且找出哪个失败几乎没有时间,与其他调查和修复工作相比,问题。
编写测试时保存失败时自己的工作(这可能永远不会发生)做额外的工作是YAGNI一种形式。
如果有多个方法没有额外的工作之外更多的打字方法声明,你应该这样做,但如果它会导致重复设置的代码,我看绝对没有错,在一个测试方法测试几个条件。
推断为非技术性思想。
假设你有一辆车,并且你想测试颜色。
测试可能是:
车是红色的。 汽车是蓝色的。 汽车涂漆。
现在它可能是有意义的有“画”和“蓝”,但他们真的是不同的东西。如果你测试红色和蓝色,它总是会失败 - 或者从隔离的角度来看失败是没有意义的。
总是按照您的建议测试一件东西,许多东西组成测试套件。
这不是一个规则;这是一个判断呼吁。如果测试是明显且可读的,那么一个函数就可以。否则将它们拆分为**可读性**。 – Ray 2010-03-02 19:21:17