单元测试中的 AAA 规则

在单元测试中通常包含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
编写代码中的 DRY 原则


版权声明:本文为surfirst原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。