同步操作将从 jonylok/junit5-demo 强制同步,此操作会覆盖自 Fork 仓库以来所做的任何修改,且无法恢复!!!
确定后同步将在后台操作,完成时将刷新页面,请耐心等待。
- title: junit5-demo
- author: harlyedog
- date: 2020-06-04 14:21
本项目的在线预览地址是 请点击我。 写在篇首的话: 单元测试的四要素
- 可重复执行,多次执行效果一致
- 不污染环境,不产生脏数据
- 用断言验证,不用肉眼验证
- 一键可运行,随时可运行
- 获取项目
git clone https://gitee.com/harley-dog/junit5-demo.git
- 生产单元测试覆盖率报表
- 方法一:执行运行项目下的test.sh
- 方法二:用idea导入项目后,右键运行mvn test命令
- 开发环境
- 编译及运行环境: jdk14
- 打包工具: maven-3.6.3
- 开发工具:Intellij IDEA CE Community版
- 主要依赖库
- junit : 5.6.2
- mockito: 3.3.3
- springboot : 2.3.0
- mybatis-plus: 3.3.2
- mysql-connect: 8.0.20
- h2-database: 1.4.200
- dubbo: 2.7.7
- nacos: 2.2.1
本项目包括五个模块,分别演示了
- 基本的junit5单元测试
- 基于springboot的web项目的单元测试(含redis调用及单元测试)
- 基于springboot+mybatis的标准web数据库项目的单元测试
- 基于springboot+dubbo的分布式调用项目的单元测试(含provider和consumer)
- 基于jacoco的单元测试覆盖率统计
演示基本的功能,可以参考junit5
springboot现在号称开源第二框架,没人敢号称第一吧。本章演示了基于springboot的web项目的单元测试,而后几个例子也都是基于springboot的扩展性案例。 springboot的单元测试可以利用spring-test里提供的SpringBootTest注解来实现 参考TestControllerTest和RedisControllerTest,都使用了SpringBootTest。 但是分别展示了不同的用法,一个是全局加载springboot,一个是局部只加载了被测试的Controller类。 根据需要自己可以选择不同的测试方法,只要能达到单元测试的目的即可。
这里重点提一下RedisController 如果本地要运行该项目,需要本地启动Redis,然后修改application.yml使得redis的配置正确。 但是本章的重点其实是演示单元测试,在单元测试时,不可能真正启动一个redis 因此这里用到了mock的概念,也就是[模拟]真实的实现。
我们被测试的类是RedisController,在这个类里依赖了redisTemplate 而redisTemplate很明显是要依赖于外部环境的,因此我们要mock的就是这个属性
在这里我们用到了mockito框架来实现mock的功能 在RedisControllerTest这个例子中,我们演示了mockito的基本使用方法。
该部分演示了标准mybatis的单元测试 其中项目本身使用了mysql8 数据库,框架部分使用了springboot,mybatis,mybatis-plus 其中被测试的主类是CrudController,分别演示了基本的增删改查,分页等功能,部分功能使用了mybatis-plus自带的扩展功能,部分使用了mybatis的自定义sql的mapper文件。
测试的类是CrudControllerTest。这里要重点提一下 理论上XxxMapper接口, 也可以通过mock来实现,达到不依赖真实数据库的目的,但是这样的话,mapper里的大量sql就不会被测试到了。因此mock mapper是一个不完整的测试。
为了达到测试sql语句的目的,我推荐使用h2内存数据库来代替mysql真实数据库。 h2-database,是一个基于java的数据库系统,它的数据可以存储于内存中(充当缓存使用或者就直接在单元测试里使用),也可以存储在本地文件中。 在这个例子中,我们使用了h2数据库作为单元测试的数据库,数据用内存承载,这样测试时,启动数据库,测试完,数据库自动销毁,对真实数据库无影响,无侵害,绿色环保,可重复执行。
dubbo和springcloud是目前被拿出来比较的多的分布式框架,在这个案例中,使用了rpc类型的框架dubbo来掩饰分布式系统中的单元测试。 dubbo由阿里团队孵化,现在已经被纳入apache开源系列,dubbo需要用到注册中心,dubbo的注册中心有多种选择,不过它既然是阿里巴巴孵化而成的,在这里我选择了同样是阿里巴巴团队开发的nacos作为dubbo的注册中心。相信同出一脉的东西,使用起来会更香,毕竟这两个连官网都长得很像。
junit5-common提供了服务接口和数据传输DTO对象 junit5-dubbo-provider-demo演示了一个基于dubbo的服务端,也就是junit5-common的具体实现 junit5-dubbo-consumer-demo演示了一个基于duboo的客户端,也就是对junit5-common的调用 要启动该项目,必须本地启动一个nacos,nacos的下载地址 然后分别启动provider和consumer即可看到效果
单元测试里,不需要依赖nacos,因为consumer的单元测试里,对provider的依赖可以利用mock来实现。 UserControllerTest演示了mock远程接口依赖的单元测试方案
jacoco可以对覆盖率进行统计,目前单测覆盖率报表也比较推荐这个工具。 jacoco-coverage这个模块是一个聚合模块,它聚合了其他的模块里所有的单测覆盖率报表,形成了一个总的报表。jacoco-coverage里没有代码,只有一个pom.xml
此处可能存在不合适展示的内容,页面不予展示。您可通过相关编辑功能自查并修改。
如您确认内容无涉及 不当用语 / 纯广告导流 / 暴力 / 低俗色情 / 侵权 / 盗版 / 虚假 / 无价值内容或违法国家有关法律法规的内容,可点击提交进行申诉,我们将尽快为您处理。