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

C# 单元测试-我应该拆分测试还是进行单个测试?,c#,unit-testing,C#,Unit Testing,我希望这不是一个愚蠢的问题,但我一直在想这个问题。我希望编写一个单元测试方法,其中包含一些逻辑来检查某些值是否为null public void MyMethod(string value1, string value2) { if(value1 != null) { //do something (throw exception) } if(value2 != null) { //do something (throw except

我希望这不是一个愚蠢的问题,但我一直在想这个问题。我希望编写一个单元测试方法,其中包含一些逻辑来检查某些值是否为null

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会发生什么

i、 e

还是有什么区别?我想我在某个地方读到过,您应该将自己限制为每个单元测试一个断言。这是正确的吗

提前谢谢
Zaps

您应该为每个测试用例编写一个单元测试(断言)以避免。

如果您使用相同的测试方法进行两个测试,那么您的测试就不是在进行“单元测试”

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

另一方面,如果您有两种独立的测试方法,那么您可以完全隔离地测试每个案例


从您的
MyMethod
方法的代码判断,这两个条件之间没有联系;这意味着这两种情况下的测试之间不应该有任何依赖性

因此:您应该使用两种不同的测试。

理想的单元测试只测试一件事,以便准确地指出错误

实际上,这并不像大多数TDD支持者所说的那么重要,因为测试并不经常失败,与调查和解决问题所涉及的其他工作相比,找出失败的断言几乎不需要时间

在编写测试时做额外的工作,以在测试失败时(这可能永远不会发生)节省自己的工作,这是一种浪费


如果有多个方法除了输入更多的方法声明之外没有额外的工作,那么您应该这样做,但是如果它导致重复的设置代码,我认为在一个测试方法中测试多个条件绝对没有错。

外推到一个非技术性的想法

假设你有一辆车,你想测试一下颜色

测试可能是:

这辆车是红色的。 这辆车是蓝色的。 汽车上了漆

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


始终按照您的建议一次测试一件事情,并且许多事情构成了测试套件。

即使您对测试进行分组,您的测试代码单元仍然是相同的-因此无论发生什么情况,它仍然是单元测试:o)但您逐渐失去的是确定失败的能力。在实践中,这是大量测试(=大量语法)与精确定位能力之间的权衡——参见Michael的答案;这是一个判断的决定。如果测试是显而易见且可读的,那么一个函数就可以了。否则,为了可读性,将它们分开。
[TestMethod]
public void TestMyMethodShouldThrowExceptionIfValue1IsNull()
{
    //test
}

[TestMethod]
public void TestMyMethodShouldThrowExceptionIfValue2IsNull()
{
    //test
}
[TestMethod]
public void TestMyMethodWithNullValues()
{
  //pass null for value1
  //check

  //pass null for value2
  //check
}