搜 索

谈单元测试怎么写(java篇)

  • 217阅读
  • 2022年10月16日
  • 0评论
首页 / Java/Scala/C / 正文

啥是单元测试

  在计算机编程中,单元测试(英语: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,形成知识

参考资料

Spock官网美团优选Spock实践

评论区
暂无评论
avatar