啥是单元测试
在计算机编程中,单元测试(英语:Unit Testing)又称为模块测试,是针对程序模块(软件设计的最小单位)来进行正确性检验的测试工作。程序单元是应用的最小可测试部件。在过程化编程中,一个单元就是单个程序、函数、过程等;对于面向对象编程,最小单元就是方法,包括基类(超类)、抽象类、或者派生类(子类)中的方法。(维基百科)
为什么要写单元测试?
在编码实践中不写单元测试的大有人在,问他为啥不写单元测?无非几类原因,写单元测试耗时久影响交付,
springboot中使用Spock单元测试最佳实践
Spock是啥
Spock环境初始化
Spock单元测试编写
Spock的mock
Spock的测试报告
其他
参考资料
一、命名规范
单元测试代码必须写在如下工程目录:src/test/java,包命名约定应始终与业务实现包一致,这将更容易维护与查找
测试类命名规则为:被测试类+Test后缀
单元测试函数名称以test作为前缀
当被测试函数包含多个分支(场景),要求为每个分支单独写一个测试函数,若方法不能见名知意,要求注释写明测试场景
二、测试用例规范
单元测试应全自动化,避免人工介入。不准使用 System.out 来进行人肉验证,必须使用 assert 来验证
我们会对项目结构分层中的biz层中的Service、Component、Executor、Strategy编写单元测试
对不可测的代码重构,使之变得可测
每个测试用例都是一座孤岛,不依赖其他测试用例
确保测试不受环境影响,对于无法使用的外部依赖(网络,DB)可以使用Mocking来做依赖替换
新增代码及时补充单元测试,如果影响了原有的单测,及时修改(建议提测之前完成)
每次commit之前必须跑成功所有单测(mvn clean test),并且sonar平台新增代码单测覆盖率达标(mvn sonar:sonar),才能提交代
所有单元测试至少有一个"断言":切忌无意义的断言
有明确返回值的,直接校验返回值;
无返回值的,看代码逻辑,对数据做了什么处理?如果处理了数据,调用完方法之后,断言中校验被处理的数据,相关属性是否修改正确;
反面例子:为了刷覆盖率,在用例中只调用方法,不进行断言。
编写单元测试代码遵守 BCDE 原则,以保证被测试模块的交付质量
B:Border,边界值测试,包括循环边界、特殊取值、特殊时间点、数据顺序等。
C:Correct,正确的输入,并得到预期的结果。
D:Design,与设计文档相结合,来编写单元测试。
E:Error,强制错误信息输入(如:非法数据、异常流程、非业务允许输入等),并得到预期的结果。
提升写单测的效率:避免因提升单元测试覆盖,而占用大量开发时间。推荐spock框架,普遍认为效率较高的。
单元测试只针对当前组件,测试逻辑性和出入参是否符合预期。对应依赖的组件全部mock。
功能测试:要测试功能是否符合预期,需要进行功能测试,也就是需要启动spring容器,测试入口接口功能,需要串联整个流程。功能测试代码和单元测试分开,同时单元测试覆盖不统计。功能测试的必要性,是因为可以模拟sim环境参数进行本地debug快速定位问题。
集成jacoco插件,使开发可以本地运行单测生成单测覆盖率报表,可视化覆盖率。
逐步形成测试规范,不断总结测试经验。沉淀场景case,形成知识