单元测试的规范
- 格式:pdf
- 大小:179.31 KB
- 文档页数:3
单元测试的规范
⼀、测试准则
必须满⾜AIR原则
A:Automatic(⾃动化)
I:Independent(独⽴性)
R:Repeatable(可重复)
可参照27条准则。
引⽤链接:
原⽂链接:
如下:
27条准则
1. 保持单元测试⼩巧, 快速
2. 单元测试应该是全⾃动/⾮交互式的
3. 让单元测试很容易跑起来
4. 对测试进⾏评估
5. ⽴即修正失败的测试
6. 把测试维持在单元级别
7. 由简⼊繁
8. 保持测试的独⽴性
9. Keep tests close to the class being tested
10. 合理的命名测试⽤例
11. 只测试公有接⼝
12. 看成是⿊盒
13. 看成是⽩盒
14. 芝⿇函数也要测试
15. 先关注执⾏覆盖率
16. 覆盖边界值
17. 提供⼀个随机值⽣成器
18. 每个特性只测⼀次
19. 使⽤显式断⾔
20. 提供反向测试
21. 代码设计时谨记测试
22. 不要访问预定的外部资源
23. 权衡测试成本
24. 合理安排测试优先次序
25. 为测试失败做好准备
26. 写测试⽤例重现 bug
27. 了解局限
⼆、结构规范
⽬录结构规范:
1.源码存放在src⽬录,每个功能模块创建单个npm包
2.src同级创建test/unit作为单元测试⽂件⽬录
3.test/unit⽬录下创建源npm包同名⽂件夹,⽤于存放单元测试⽂件
4.src同级创建test/integration作为集成测试⽂件夹
5.test/integration⽬录下创建源npm包同名⽂件夹,⽤于存放集成测试⽂件
⽂件命名规范:
1.test⽬录下测试⽂件名同源码⽂件名同名,后缀以.test.js结尾
2.test/unit和test/integration创建测试⽂件夹时,参照短横线(kabab-case)规范命名。
3.js和ts⽂件依照短横线(kabab-case)规范命名,Vue⽂件依照驼峰(camelCased)规范命名。
4.每个源码⽂件(如js,ts,vue)对应⼀个同名.test.js⽂件。(index⽂件可以忽略)
三、编码原则
必须符合 BCDE 原则:
B:Border,边界值测试,包括循环边界、特殊取值、特殊时间点、数据顺序等。
C:Correct,正确的输⼊,并得到预期的结果。
D:Design,与设计⽂档相结合,来编写单元测试。
E:Error,强制错误信息输⼊(如:⾮法数据、异常流程、⾮业务允许输⼊等),并得到预期的结果。
避免以下情况:
1)构造⽅法中做的事情过多。
2)存在过多的全局变量和静态⽅法。
3)存在过多的外部依赖。
4)存在过多的条件语句。建议:
1.涉及到的某些扩展模块可以使⽤mock模拟
2.测试⽤例不要使⽤@ignored或者被注释掉,切记切记。
如何编写更好的单元测试
原⽂链接:
单元测试在最近的⼯作中使⽤⽐较⼴泛,我已经收集了⼀些关于如何编写更好的测试类的准则,并且我已经尝试着坚持这些准则多年了。记住,编写糟糕的测试是在浪费时间,并会在以
后造成更⼤的问题。所以最好把这些准则记在⼼⾥。
19条建议
1.不应该编写成功通过的单元测试-它们应该被写成不通过的。
可以在⼏分钟内让任何⼀组测试通过,但这只是在欺骗你⾃⼰。2.测试类应该只测试⼀个功能。
你应该⽤⼀个功能去测试⼀个⽅法。否则,你会违反了单⼀职责原则。3.测试类具备可读性。
确保测试类标有注释并且容易理解,就像其他的代码⼀样。4.良好的命名规范。
再次测试时应该像其他代码⼀样-便于⼈们理解。5.把断⾔从⾏为中分离出来。
你的断⾔应该⽤来检验结果,⽽不是执⾏逻辑操作的。6.使⽤具体的输⼊。
不要使⽤任何的⾃动化测试数据来输⼊,像date()这些产⽣的数据会引⼊差异。7.把测试类分类,放在不同的地⽅。
从逻辑的⾓度看,当没有错误指向特定的问题时这更容易去查找。8.好的测试都是⼀些独⽴的测试类。
你应该让测试类与其他的测试、环境设置等没有任何依赖。这利于创建多个测试点。9.不要包含私有的⽅法。
他们都是⼀些具体的实现,不应该包含在单元测试⾥。10.不要连接数据库或者数据源。
这是不靠谱的。因为你不能确保数据服务总是⼀样的并且能够创建测试点。11.⼀个测试不要超过⼀个模拟(mock对象)。
我们努⼒去消除错误和不⼀致性。12.单元测试不是集成测试。
如果你想测试结果,不要使⽤单元测试。13.测试必须具有确定性。
你需要⼀个确定的预测结果,所以,如果有时候测试通过了,但是不意味着完成测试了。14.保持你的测试是幂等的。
你应该能够运⾏你的测试多次⽽不改变它的输出结果,并且测试也不应该改变任何的数据或者添加任何东西。⽆论是运⾏⼀次还是⼀百万次,它的效果都应该是⼀样的。15.测试类⼀次仅测试⼀个类,测试⽅法⼀次仅测试⼀个⽅法。
组织⽅法能够在问题出现时检测出来,并帮你确定测试依赖。16.在你的测试⾥使⽤异常。
你在测试⾥会遇到异常,所以,请不要忽略它,要使⽤它。17.不要使⽤你⾃⼰的测试类去测试第三⽅库的功能。
⼤多数好的库都应该有它们⾃⼰的测试,如果没考虑⽤mocks去产⽣⼀致性的结果的话。18.限制规则。
当在⼀些规则下写测试时,记住你的限制和它们(最⼩和最⼤)设置成最⼤的⼀致性。19.测试类不应该需要配置或者⾃定义安装。
你的测试类应该能够给任何⼈使⽤并且使它运⾏。“在我的机器上运⾏”不应该出现在这。
四、编码规范:
1.test对应每个源码创建单元测试包
2.每个npm包,都要添加descript,描述名为npm包名。
如descript("awp-lib-moment",()=>{});
3.需⽣成快照⽂件的单元测试,快照需要每次提交。
4.expect test('') 中描述的是调⽤和期望输出结果。
如test("Moment.format('yyyyMMdd HH:mm:ss','2019/07/09 17:41:01') 期望输出结果:20190709 17:41:01", () => {});
5.进⾏参数或属性校验。
校验包含正向和反向校验,即正确类型正确输出和异常类型返回异常信息等。
校验种类包含,参数个数、参数类型等。
6.测试要覆盖实现中的代码的各个分⽀
7.⼀个测试⽅法只测试⼀个⽅法,不测试私有⽅法
8.⼀个测试类只对应⼀个被测类.
9.测试⽤例的变量和⽅法都要有明确的含义五、测试维度
编写单元测试,主要参考以下⼏个⽅⾯:
来源链接:
1.接⼝功能性测试
接⼝功能的正确性,即保证接⼝能够被正常调⽤,并输出有效数据!====> 是否被顺利调⽤
====> 参数是否符合预期
2.局部数据结构测试
保证数据结构的正确性====> 变量是否有初始值或在某场景下是否有默认值
====> 变量是否溢出
3.边界条件测试
====> 变量⽆赋值(null)
====> 变量是数值或字符
====> 主要边界:最⼤值,最⼩值,⽆穷⼤
====> 溢出边界:在边界外⾯取值+/-1
====> 临近边界:在边界值之内取值+/-1
====> 字符串的边界,引⽤ "变量字符"的边界
====> 字符串的设置,空字符串
====> 字符串的应⽤长度测试
====> 空⽩集合
====> ⽬标集合的类型和应⽤边界
====> 集合的次序
====> 变量是规律的,测试⽆穷⼤的极限,⽆穷⼩的极限
4.所有独⽴代码测试
保证每⼀句代码,所有分⽀都测试完成,主要包括代码覆盖率,异常处理通路测试====> 语句覆盖率:每个语句都执⾏到了
====> 判定覆盖率:每个分⽀都执⾏到了
====> 条件覆盖率:每个条件都返回布尔
====> 路径覆盖率:每个路径都覆盖到了
5.异常模块测试
后续处理模块测试:是否包闭当前异常或者对异常形成消化,是否影响结果!
六、测试⽬标
说明:以下仅作为参考,实际还需要按照各⾃项⽬进⾏评估。
语句覆盖率:>=70%
分⽀覆盖率:100%
函数覆盖率:100%
⾏覆盖率: >=80%
执⾏覆盖率, 业界标准通常在 80% 左右!!
出处: