【问题标题】:Are logical operators in assertions acceptable? [closed]断言中的逻辑运算符是否可接受? [关闭]
【发布时间】:2013-09-16 14:28:36
【问题描述】:

您如何看待以下断言?

Assert.IsTrue(condition1 && condition2);

我在审查会议期间提出了这种类型的断言。据我所知,在断言中使用 && 运算符不是一个好习惯。我想知道其他人是怎么想的?值得一提的是,这是下一次审查会议中的一个问题吗?还是只是个人喜好?

【问题讨论】:

  • 为什么你觉得这不是一个好主意?你建议做什么?
  • 我觉得这样做没有错……
  • 测试失败时错误信息是否清晰?
  • 我认为如果测试失败,断言会隐藏一些信息。条件1 或条件2 为假?我更喜欢两个带有错误消息的单独断言。

标签: c# unit-testing tdd nunit


【解决方案1】:

当你写作时

Assert.IsTrue(condition1 && condition2);

那么不清楚是什么导致测试失败 - 第一个或第二个条件。因此你需要他们两个都是true 一个接一个地检查:

Assert.IsTrue(condition1);
Assert.IsTrue(condition2);

现在让我们想想 OR 条件有什么问题:

Assert.IsTrue(condition1 || condition2);

这看起来像 随机 测试 - 它会在不同的情况下通过:

  1. 第一个条件为真,第二个条件为假
  2. 如果两者都为真
  3. 如果第二个为真,但第一个为假

那么,您正在检查什么场景?创建三个不同的场景来重现这三种情况。每个测试将包含两个断言,例如最后一个场景:

Assert.IsFalse(condition1);
Assert.IsTrue(condition2);

【讨论】:

  • 还有一条错误消息,这正是我在审查会议上提到的。
  • @pappati 是的,同意你的看法。消息也很有用。顺便说一句,我用 OR 条件更新了答案
  • 我认为您对“||”的看法实际上是正确的,我想不出我在回答中写的任何好的例子。
【解决方案2】:

这取决于上下文。

Assert.IsTrue(condition1 && condition2);

当然可以用 2 个单独的 Asserts 替换,但是怎么样

Assert.IsTrue(condition1 || condition2);

当这恰好是有效的测试结果时,我认为它没有问题。

因此,当这 2 个条件在逻辑上相关时,请使用 &&
当它们是 2 个或多或少独立的结果时,使用 2 个断言调用。

【讨论】:

    【解决方案3】:

    如果条件不相关,那么我会做出两个断言。但是你的技术非常有用

    Debug.Assert(str != null && str.Length == 10);
    

    因为那样不会抛出,因为

    Debug.Assert(str != null);
    Debug.Assert(str.Length == 10);
    

    在断言被违反的情况下。

    【讨论】:

      【解决方案4】:

      在我看来,单元测试应该测试 1 并且只测试 1 件事。使用 && 似乎与此相反。

      如果有多个“概念”或关注领域,那么这并不理想,建议重构为不同的测试,每个概念一个。

      或者,如果它只是一些解决逻辑,那么很好。但是 - 提取此逻辑以使其明确这是正在发生的事情,而不是将其放入断言中。

      将测试拆分为多个测试是否有意义?

      • 拆分测试是否有可能独立失败?
      • 如果测试失败,是否会为调查失败的人员提供有用的信息?
      • 拆分测试是否有用但有可能会失败还是微不足道?
      • 是否有可能/易于重构以进行多个测试?

      【讨论】:

        猜你喜欢
        • 2023-03-12
        • 1970-01-01
        • 1970-01-01
        • 2020-04-14
        • 2014-03-18
        • 1970-01-01
        • 1970-01-01
        • 2021-08-16
        • 2013-04-30
        相关资源
        最近更新 更多