单元测试中的多个断言

mik*_*igs 12 unit-testing assert mstest

我刚刚读完了Roy Osherove的"单元测试艺术",我正在努力坚持他在书中列出的最佳实践.其中一个最佳实践是不在测试方法中使用多个断言.这个规则的原因对我来说相当清楚,但它让我怀疑......

如果我有一个像这样的方法:

public Foo MakeFoo(int x, int y, int z)
{
     Foo f = new Foo();
     f.X = x;
     f.Y = y;
     f.Z = z;

     return f;
}
Run Code Online (Sandbox Code Playgroud)

我是否真的必须编写单独的单元测试以声明Foo的每个单独属性是否使用提供的值进行初始化?在测试方法中使用多个断言真的很少见吗?

仅供参考:我正在使用MSTest.

编辑:感谢所有的回复.我想我最终将继续使用多个断言.在我的情况下,正在测试的行为是MakeFoo制作一个合适的Foo.因此断言每个属性都达到预期值就足够了.但是,如果设置其中一个属性存在条件,那么我将分别测试每个单独的结果.

我仍然不喜欢它....我喜欢每次测试一个断言的想法是你知道测试失败的确切原因.如果您解决了问题,那么测试将通过.有多个断言,您没有相同的保证.如果你修复了失败的断言所提到的问题,那么在测试中的下一次失败就没有什么可以阻止另一个断言了.如果断言被分开,那么你从一开始就知道两个失败.

最后,我不仅仅使用.Equals()的原因是因为在我的情况下,Foo是一个LINQ-To-SQL实体,它引入了一些不值得进入的并发症.

再次感谢.

Joh*_*web 16

每单元测试测试一个概念就更为重要.

测试一个概念可能需要不止一个断言,所以不要过分担心断言的数量.当然,如果你最终得到大量的断言,你可能想退后一步,想想你真正在测试什么.

  • 您如何处理"请求的所有属性都经过验证"等概念?每个属性一次测试?但是,您需要验证最小和最大长度(或最小值和最大值),空值,空值,空白,正则表达式匹配,业务规则失败等.如果测试表明"不是更好"测试所有属性以进行验证"而不是十几个执行相同操作但属于不同属性的属性? (2认同)

Car*_*ter 5

在这样的情况下,如果我试图对每个测试的一个断言严格,我将在Foo上声明相等,而不是它的组件.这促使我写了Foo.equals(),这通常是一件好事.但是我并不总是严格考虑每个测试的一个断言.看看对你有什么好处.