测试仅应出于一个原因而失败,但这并不总是意味着仅应有一个Assert
语句。恕我直言,保持“ 安排,行动,断言 ”模式更为重要。
关键是您只有一个动作,然后使用断言检查该动作的结果。但这是“安排,行动,断言,测试结束 ”。如果您想通过执行其他操作来继续测试,然后再进行更多声明,请改为进行单独的测试。
我很高兴看到多个assert语句构成测试同一动作的一部分。例如
[Test]
public void ValueIsInRange()
{
int value = GetValueToTest();
Assert.That(value, Is.GreaterThan(10), "value is too small");
Assert.That(value, Is.LessThan(100), "value is too large");
}
要么
[Test]
public void ListContainsOneValue()
{
var list = GetListOf(1);
Assert.That(list, Is.Not.Null, "List is null");
Assert.That(list.Count, Is.EqualTo(1), "Should have one item in list");
Assert.That(list[0], Is.Not.Null, "Item is null");
}
您可以将它们组合成一个断言,但这与坚持您应该或必须做的事情不同。合并它们没有任何改善。
例如第一个可能是
Assert.IsTrue((10 < value) && (value < 100), "Value out of range");
但这并不是更好-错误消息的针对性较低,并且没有其他优点。我敢肯定,您还会想到其他将两个或三个(或更多)断言组合为一个大布尔条件的示例,这使得它更难阅读,更难更改且更难以弄清失败的原因。为什么仅仅为了规则而这样做呢?
注意:我在这里编写的代码是带有NUnit的C#,但是这些原理将适用于其他语言和框架。语法也可能非常相似。