c# - 如何在测试用例中防止 'over-testing'? (C#/n单位)

标签 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 属性是否被成功读取,这些在另一个情况下测试。但是,如果前两个断言失败,我什至无法进行测试,我该如何在不先断言其他两个断言的情况下测试最后一个断言?

最佳答案

只需进行其他测试,检查如果您以无效方式初始化异常 是否抛出异常。在这一点上,第一种形式很好,IMO。

就我个人而言,我会避免陷入“每次测试一个断言”的教条。尝试通过代码测试一条逻辑路径,测试粒度要尽可能细。

关于c# - 如何在测试用例中防止 'over-testing'? (C#/n单位),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3316851/

相关文章:

c# - 断点不会在 Blazor Webassembly 项目、ASP.NET Core 3.1、

c# - TypeCatalog 的使用

unit-testing - 如何使用 jasmine-marbles 在 rxjs 管道中测试 timeout()

unit-testing - Resharper 10 : Unit test output window is broken

c# - 如何在 CRM 2011 开发中编写单元测试

c# - 创建特定数量的任务\线程后如何等待特定时间?

c# - SameAs 断言调用 setter 与 VB.Net

c# - N单元+ReSharper : How to view results for TestFixture with different parameters?

c# - 取消测试(带有警告)

c# - 从所属类外部调用 C# 事件?