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

Fly*_*179 7 c# nunit unit-testing

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

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

原则上这看起来是可以接受的,但是测试的目的是验证当使用给定名称实例化类时,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);
}
Run Code Online (Sandbox Code Playgroud)

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

Jon*_*eet 12

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

就个人而言,我会避免陷入"每次测试一个断言"的教条.尝试通过代码测试一个逻辑路径,尽可能精确的粒度.