单元测试 - 我应该拆分测试还是进行单个测试?

问题描述:

我希望这不会成为一个愚蠢的问题,但它是我一直想知道的。我希望编写一个单元测试的方法,它包含一些逻辑来检查某些值是否为空。单元测试 - 我应该拆分测试还是进行单个测试?

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

+0

这不是一个规则;这是一个判断呼吁。如果测试是明显且可读的,那么一个函数就可以。否则将它们拆分为**可读性**。 – Ray 2010-03-02 19:21:17

你应该写为每个测试用例(断言)一个单元测试,以避免Assertion Roulette

如果你正在做两个测试在同样的测试方法,你的测试都没有做“单元测试”。

例如,如果第一个null值的测试失败会怎么样?
如果两个测试都采用相同的测试方法,则可能不会执行第二个测试;这意味着对第二个null值的测试取决于对第一个值的测试。

在另一方面,如果你有两个单独的测试方法,可以测试在完美的隔离每一种情况下。


从您的MyMethod方法的代码判断,这两个条件之间没有联系;这意味着在这两个条件的测试之间不应该存在任何依赖关系。

所以:你应该使用两个不同的测试。

+0

即使你将你的测试分组,你的测试代码单元仍然是相同的 - 所以它仍然是单元测试:o)但是你逐渐失去的是查明失败的能力。在实践中,它是在很多测试(=很多语法)与查明能力之间进行权衡 - 请参阅迈克尔的答案。 – MaR 2010-03-01 12:58:40

“理想的”单元测试只是为了准确地查明错误而测试一件事情。

实际上,这并不像大多数TDD支持者所说的那么重要,因为测试不会经常失败,并且找出哪个失败几乎没有时间,与其他调查和修复工作相比,问题。

编写测试时保存失败时自己的工作(这可能永远不会发生)做额外的工作是YAGNI一种形式。

如果有多个方法没有额外的工作之外更多的打字方法声明,你应该这样做,但如果它会导致重复设置的代码,我看绝对没有错,在一个测试方法测试几个条件。

推断为非技术性思想。

假设你有一辆车,并且你想测试颜色。

测试可能是:

车是红色的。 汽车是蓝色的。 汽车涂漆。

现在它可能是有意义的有“画”和“蓝”,但他们真的是不同的东西。如果你测试红色和蓝色,它总是会失败 - 或者从隔离的角度来看失败是没有意义的。

总是按照您的建议测试一件东西,许多东西组成测试套件。