单元测试的规范

  • 格式: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% 左右!!

出处: