在单元测试中通常包含3大部分的代码,他们是设置初始条件的代码,执行业务逻辑的代码,以及验证执行结果是否正确的断言代码。为了提高这些代码的可读性,让代码显得清晰整洁,我们建议程序员按照 AAA 规则来写单元测试的代码。
AAA 分别代码了单元测试中的3大部分代码,即 Arrange, Act, Assert。比如我们有一段代码,它的作用是反转输入的字符串,我们可以使用下面的代码来测试:
[TestMethod]
void String_should_be_reversed()
{
// Arrange
string s1 = "abc"
// Act
var r1 = MyStringFunctions.Reverse(s1);
// Assert
Assert.AreEqual("cba", r1);
}
上面的代码指展示了一个输入条件的测试,如果是多个输入条件呢?我建议把输入条件放在一起,Act 代码也放在一起,Assert 也放在一起,这样我们就可以显示出我们的代码不会有先后顺序的要求,还记得 FIRST 原则中的 repeatable 原则吗?
对比下面的方案1和方案2,显然方案1更符合 repeatable 原则,因为通过阅读代码,我们能看到 r1 和 r2 的为止在一起,我们再加上 r3.
方案 2
[TestMethod]
void String_should_be_reversed()
{
// Arrange
string s1 = "abc";
string s2 = "xyz";
// Act
var r1 = MyStringFunctions.Reverse(s1);
var r2 = MyStringFunctions.Reverse(s2);
// r3, r4 表明测试结果不受测试顺序的影响
var r3 = MyStringFunctions.Reverse(s2);
var r4 = MyStringFunctions.Reverse(s2);
// Assert
Assert.AreEqual("cba", r1);
Assert.AreEqual("zyx", r2);
Assert.AreEqual("zyx", r3);
Assert.AreEqual("cba", r4);
}
方案 2
[TestMethod]
void String_should_be_reversed()
{
string s1 = "abc";
var r1 = MyStringFunctions.Reverse(s1);
Assert.AreEqual("cba", r1);
string s2 = "xyz";
var r2 = MyStringFunctions.Reverse(s2);
Assert.AreEqual("zyx", r2);
}
结论
我们讨论了单元测试中 AAA 规则 (AAA pattern)。正确使用 AAA 规则可以使我们的单元测试代码更清晰整洁。我们还介绍了如何应用 AAA 规则来让我们的代码符合 FIRST 原则中的 repeatable 要求。
参考
单元测试中的 FIRST 原则
软件设计原则之 SOLID Principle
转载:https://blog.csdn.net/surfirst/article/details/112916989
查看评论