断言中的逻辑运算符是否可以接受
本文关键字:是否 逻辑运算符 断言 | 更新日期: 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);
这看起来像随机测试 - 它会在不同的场景中通过:
- 第一个条件为
- 真,第二个条件为假
- 如果两者都为真
- 如果第二个是真的,但第一个是假的
那么,您正在检查的确切场景是什么?创建三种不同的场景来重现这三种情况。每个测试将包含两个断言,例如最后一个场景:
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 件事。使用 && 似乎与此背道而驰。
如果有多个"概念"或关注领域,那么这并不理想,并建议重构到不同的测试,每个概念一个。
或者,如果它只是一点解决逻辑,那就好了。但是 - 提取此逻辑以明确这是正在发生的事情,而不是将其放在断言中。
将测试拆分为多个测试是否有意义?
- 拆分测试是否有可能独立失败?
- 如果失败,进行另一个测试是否会为调查失败的人提供有用的信息?
- 拆分测试测试是有用的,有可能失败还是微不足道?
- 是否可以/易于重构以进行多个测试?