2

您如何看待以下断言?

Assert.IsTrue(condition1 && condition2);

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

4

4 回答 4

8

当你写

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);
于 2013-09-16T14:34:06.967 回答
2

这取决于上下文。

Assert.IsTrue(condition1 && condition2);

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

Assert.IsTrue(condition1 || condition2);

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

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

于 2013-09-16T14:33:33.890 回答
2

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

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

因为那不会抛出,因为

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

在断言被违反的情况下。

于 2013-09-16T15:08:34.623 回答
0

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

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

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

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

  • 拆分测试是否有可能独立失败?
  • 如果失败,进行另一次测试是否会给调查失败的人提供有用的信息?
  • 拆分测试是否有用但有可能失败还是微不足道?
  • 是否有可能/易于重构以进行多个测试?
于 2013-09-16T20:32:20.790 回答