如何防止测试用例中的“过度测试”? (C#/ NUnit的)

时间:2010-07-23 09:20:28

标签: c# unit-testing nunit

我正在研究一些测试用例,我经常发现在每种情况下我都会遇到多个断言。例如(为简洁而过度简化和删除评论):

[Test]
public void TestNamePropertyCorrectlySetOnInstantiation()
{
  MyClass myInstance = new MyClass("Test name");
  Assert.AreEqual("Test Name", myInstance.Name);
}

这看起来原则上是可以接受的,但测试的目的是验证当使用给定名称实例化类时,Name属性设置正确,但如果在实例化时出现任何问题,它甚至会失败得到断言。

我重构了这样:

[Test]
public void TestNamePropertyCorrectlySetOnInstantiation()
{
  MyClass myInstance;
  string namePropertyValue;

  Assert.DoesNotThrow(() => myInstance = new MyClass("Test name"));
  Assert.DoesNotThrow(() => namePropertyValue = myInstance.Name);
  Assert.AreEqual("Test Name", namePropertyValue);
}

但当然,现在我实际上在这里测试了三件事;在此测试中,我对测试MyClass实例是否已成功实例化,或者是否已成功读取Name属性感兴趣,这些在另一种情况下进行了测试。但是,如果前两个失败,我怎么能在没有断言其他两个断言的情况下测试最后一个断言,因为如果前两个失败,它甚至不可能进行测试?

4 个答案:

答案 0 :(得分:12)

如果以无效的方式初始化它,只需要进行其他测试以检查是否 被抛出。第一种形式就是这样,IMO。

就个人而言,我会避免陷入“每次测试一个断言”的教条。尝试通过代码测试一条逻辑路径,以达到实际意义上的精细粒度。

答案 1 :(得分:1)

答案 2 :(得分:0)

答案 3 :(得分:0)