博客
关于我
单元测试中的 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/

你可能感兴趣的文章
NO.23 ZenTaoPHP目录结构
查看>>
no1
查看>>
NO32 网络层次及OSI7层模型--TCP三次握手四次断开--子网划分
查看>>
NOAA(美国海洋和大气管理局)气象数据获取与POI点数据获取
查看>>
NoClassDefFoundError: org/springframework/boot/context/properties/ConfigurationBeanFactoryMetadata
查看>>
node exporter完整版
查看>>
Node JS: < 一> 初识Node JS
查看>>
Node JS: < 二> Node JS例子解析
查看>>
Node Sass does not yet support your current environment: Windows 64-bit with Unsupported runtime(72)
查看>>
Node 裁切图片的方法
查看>>
Node+Express连接mysql实现增删改查
查看>>
node, nvm, npm,pnpm,以前简单的前端环境为什么越来越复杂
查看>>
Node-RED中Button按钮组件和TextInput文字输入组件的使用
查看>>
Node-RED中Switch开关和Dropdown选择组件的使用
查看>>
Node-RED中使用html节点爬取HTML网页资料之爬取Node-RED的最新版本
查看>>
Node-RED中使用JSON数据建立web网站
查看>>
Node-RED中使用json节点解析JSON数据
查看>>
Node-RED中使用node-random节点来实现随机数在折线图中显示
查看>>
Node-RED中使用node-red-browser-utils节点实现选择Windows操作系统中的文件并实现图片预览
查看>>
Node-RED中使用node-red-contrib-image-output节点实现图片预览
查看>>