本文共 1515 字,大约阅读时间需要 5 分钟。
在单元测试中,代码通常分为三部分:设置初始条件的代码、执行业务逻辑的代码、以及验证执行结果是否正确的断言代码。为了让这些代码更具可读性,我们常使用AAA规则来编写单元测试。
AAA规则即 Arrange、Act、Assert。比如,如果有一个函数是用来反转输入字符串的,我们可以按照AAA规则来编写测试代码。
首先,在Arrange部分,我们初始化输入条件。例如:
string s1 = "abc";string s2 = "xyz";
接下来,在Act部分,我们调用目标函数并进行操作。例如:
var r1 = MyStringFunctions.Reverse(s1);var r2 = MyStringFunctions.Reverse(s2);
最后,在Assert部分,我们验证结果是否正确。例如:
Assert.AreEqual("cba", r1);Assert.AreEqual("zyx", r2);
如果我们需要测试多个输入条件下的结果是否不变,我们可以将所有的输入条件和断言放在同一部分。例如:
Arrange string s1 = "abc"; string s2 = "xyz";Act var r1 = MyStringFunctions.Reverse(s1); var r2 = MyStringFunctions.Reverse(s2);Assert Assert.AreEqual("cba", r1); Assert.AreEqual("zyx", r2);
这样一来,我们的测试代码就能体现出结果的顺序不影响测试结果,符合FIRST原则中的repeated可重复性原则。
相比之下,以下方案显然更符合repeatable原则:
Arrange string s1 = "abc"; string s2 = "xyz";Act var r1 = MyStringFunctions.Reverse(s1); var r2 = MyStringFunctions.Reverse(s2); 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);
这样我们可以清楚地看到r1和r2的结果,以及额外的r3和r4结果,证明了结果的顺序不影响测试结果。
预防代码混乱的另一种做法是将所有输入条件和操作放在同一部分,同时将断言也放在同一部分。例如:
Arrange string s1 = "abc"; string s2 = "xyz";Act var r1 = MyStringFunctions.Reverse(s1); var r2 = MyStringFunctions.Reverse(s2);Assert Assert.AreEqual("cba", r1); Assert.AreEqual("zyx", r2);
通过这种方式,代码结构更加清晰,结果的下单序也不受限制。
总的来说,AAA规则可以帮助我们编写清晰简洁的单元测试代码,改善代码的可读性。通过合理地安排输入条件和断言,使我们的测试案例更具可重复性。
转载地址:http://rlokk.baihongyu.com/