断言中的逻辑运算符是否可以接受

本文关键字:是否 逻辑运算符 断言 | 更新日期: 2023-09-27 18:31:32

您如何看待以下断言?

Assert.IsTrue(condition1 && condition2);

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

断言中的逻辑运算符是否可以接受

当你写的时候

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);

这取决于上下文。

Assert.IsTrue(condition1 && condition2);

当然可以用 2 个单独的 Assert s 代替,但怎么样

Assert.IsTrue(condition1 || condition2);

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

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

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

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

那样就不会抛出,因为

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

在违反断言的情况下。

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

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

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

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

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