【问题标题】:How many assert do you put in a test?你在测试中放了多少个断言?
【发布时间】:2011-07-20 05:09:37
【问题描述】:

我的想法是测试应该只有一个断言。但是有时很难决定我是否需要对此严格或依赖。

让我们举个例子,我有一个客户的地址。 Address 类具有 City-Street-PostCode-Country 等...属性

我想测试在创建客户时地址是否被填充。

我应该为每个属性创建一个测试还是创建多个断言

Assert.That(customer.Address.City,Is.EqualTo("London"));
Assert.That(customer.Address.Street, Is.EqualTo("StreetOne"));
Assert.That(customer.Address.Postcode, Is.EqualTo("MyPostCode"));

在测试方法时您通常会做什么,并且重要的是您知道属性已被填充,因为它们将被发送给第三方?

感谢任何建议

【问题讨论】:

  • 我相信之前有人问过这个问题...
  • 这种语法有点奇怪。是错字吗?你的意思是 Assert.That(whatever, Is.EqualTo(x)) 吗?
  • 就我个人而言,我的观点是“见鬼去吧”;我对完成工作的测试感兴趣;我们的目的不是为了拥有美丽的纯粹测试,这些测试是闪亮的光柱。任何错误都会告诉你(简单地通过“预期的伦敦”或其他方式)哪个子组件失败了——如果你修复了这个错误并且另一个弹出了——就这样吧。如果有任何不确定性,请务必使用 message 参数,这样您就知道哪一行中断了,但同样 - 堆栈跟踪通常会告诉您确切的位置。
  • @Ritch Melton:有很多单元测试框架,每个框架都有自己流畅的 API。
  • @Jason - 嗯好的。我很确定 PostCode 不等于 Equal 约束。

标签: c# unit-testing


【解决方案1】:

我会说,这取决于。在您的情况下,我并没有真正看到它有问题,因为您基本上是在测试单个功能(创建客户)。甚至 NUnit 也通过 TestCase 属性为此类事物提供了快捷方式。

【讨论】:

  • 感谢所有非常有帮助的回复。感谢您提出测试用例建议
【解决方案2】:

在这种情况下,您可以摆脱许多 Assert,一个重要原因是如果一个测试失败,您的测试将失败,但您也会知道哪个 Assert 失败。这取决于您想要的测试粒度。如果您想测试可能使用来自数据库的信息填充该对象的代码,您可能需要多个断言。如果您的代码的主要部分是通过其他方式获取地址,那么您可能想单独测试地址部分。这完全取决于情况。通常你想看看你的大部分逻辑在哪里以及需要测试什么。

【讨论】:

    【解决方案3】:

    测试最重要的是测试。任何测试都比没有测试好。如果一些花哨的规则告诉你如何把它做得漂亮,那么如果它让你非常恼火以至于你很快就不再写 [real] 了,它还有什么价值?

    【讨论】:

      【解决方案4】:

      我也有想法“一次测试”->“一次断言”.. 但是!

      如果断言与同一个测试用例相关,则没有问题可以放更多。就像您上面的示例一样,我看不出您是否只在一个带有 3 个断言的情况下检查完整地址行;

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2019-07-10
        • 1970-01-01
        • 2016-07-25
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-06-28
        相关资源
        最近更新 更多