博客
关于我
单元测试中的 AAA 规则
阅读量:779 次
发布时间:2019-03-24

本文共 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/

你可能感兴趣的文章
ObjC的复制操作
查看>>
Object c将一个double值转换为时间格式
查看>>
object detection之Win10配置
查看>>
object detection训练自己数据
查看>>
object detection错误Message type "object_detection.protos.SsdFeatureExtractor" has no field named "bat
查看>>
object detection错误之Could not create cudnn handle: CUDNN_STATUS_INTERNAL_ERROR
查看>>
object detection错误之no module named nets
查看>>
Object of type 'ndarray' is not JSON serializable
查看>>
Object Oriented Programming in JavaScript
查看>>
object references an unsaved transient instance - save the transient instance before flushing
查看>>
Object 类的常见方法有哪些?
查看>>
Object-c动态特性
查看>>
Object.assign用法
查看>>
Object.create
查看>>
Object.defineProperty详解
查看>>
Object.keys()的详解和用法
查看>>
objectForKey与valueForKey在NSDictionary中的差异
查看>>
Objective - C 小谈:消息机制的原理与使用
查看>>
OBJECTIVE C (XCODE) 绘图功能简介(转载)
查看>>
Objective-C ---JSON 解析 和 KVC
查看>>