# junit5-demo **Repository Path**: ivan-yip/junit5-demo ## Basic Information - **Project Name**: junit5-demo - **Description**: junit5单元测试例子程序 包含目前使用最广泛的springboot+mysql程序的单元测试的demo - **Primary Language**: Java - **License**: MulanPSL-1.0 - **Default Branch**: master - **Homepage**: https://harley-dog.gitee.io/junit5-demo - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 17 - **Created**: 2021-10-14 - **Last Updated**: 2021-10-14 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README [![Fork me on Gitee](https://gitee.com/harley-dog/junit5-demo/widgets/widget_3.svg)](https://gitee.com/harley-dog/junit5-demo) ---- > - title: junit5-demo > - author: harlyedog > - date: 2020-06-04 14:21 ---- ## 本项目演示了基于junit5的单元测试 > 本项目的在线预览地址是 [请点击我](https://harley-dog.gitee.io/junit5-demo)。 > 写在篇首的话: > 单元测试的四要素 > 1. 可重复执行,多次执行效果一致 > 2. 不污染环境,不产生脏数据 > 3. 用断言验证,不用肉眼验证 > 4. 一键可运行,随时可运行 ## 项目使用方法 > 1. 获取项目 > ```shell > git clone https://gitee.com/harley-dog/junit5-demo.git > ``` > 2. 生产单元测试覆盖率报表 > - 方法一:执行运行项目下的test.sh > - 方法二:用idea导入项目后,右键运行mvn test命令 > 3. 开发环境 > - 编译及运行环境: [jdk14](https://www.oracle.com/java/technologies/javase-downloads.html) > - 打包工具: [maven-3.6.3](https://maven.apache.org/download.cgi) > - 开发工具:[Intellij IDEA CE](https://www.jetbrains.com/idea/download/#section=mac) Community版 > 4. 主要依赖库 > - 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 ## 项目模块说明 本项目包括五个模块,分别演示了 > 1. 基本的junit5单元测试 > 2. 基于springboot的web项目的单元测试(含redis调用及单元测试) > 3. 基于springboot+mybatis的标准web数据库项目的单元测试 > 4. 基于springboot+dubbo的分布式调用项目的单元测试(含provider和consumer) > 5. 基于jacoco的单元测试覆盖率统计 - - - - - ## 分模块说明 ### 1. 基本的junit5单元测试 演示基本的功能,可以参考[junit5](https://www.ibm.com/developerworks/cn/java/j-introducing-junit5-part1-jupiter-api/index.html) - - - - - ### 2. 基于springboot的web项目的单元测试(含redis调用及单元测试) [springboot](https://spring.io/projects/spring-boot)现在号称开源第二框架,没人敢号称第一吧。本章演示了基于springboot的web项目的单元测试,而后几个例子也都是基于springboot的扩展性案例。 springboot的单元测试可以利用spring-test里提供的SpringBootTest注解来实现 参考TestControllerTest和RedisControllerTest,都使用了SpringBootTest。 但是分别展示了不同的用法,一个是全局加载springboot,一个是局部只加载了被测试的Controller类。 根据需要自己可以选择不同的测试方法,只要能达到单元测试的目的即可。 这里重点提一下RedisController 如果本地要运行该项目,需要本地启动Redis,然后修改application.yml使得redis的配置正确。 但是本章的重点其实是演示单元测试,在单元测试时,不可能真正启动一个redis 因此这里用到了mock的概念,也就是[模拟]真实的实现。 我们被测试的类是RedisController,在这个类里依赖了redisTemplate 而redisTemplate很明显是要依赖于外部环境的,因此我们要mock的就是这个属性 在这里我们用到了[mockito](https://github.com/mockito/mockito)框架来实现mock的功能 在RedisControllerTest这个例子中,我们演示了mockito的基本使用方法。 - - - - - ### 3. 基于springboot+mybatis的标准web数据库项目的单元测试 该部分演示了标准mybatis的单元测试 其中项目本身使用了mysql8 数据库,框架部分使用了springboot,[mybatis](https://blog.mybatis.org/),[mybatis-plus](https://mp.baomidou.com/) 其中被测试的主类是CrudController,分别演示了基本的增删改查,分页等功能,部分功能使用了mybatis-plus自带的扩展功能,部分使用了mybatis的自定义sql的mapper文件。 测试的类是CrudControllerTest。这里要重点提一下 理论上XxxMapper接口, 也可以通过mock来实现,达到不依赖真实数据库的目的,但是这样的话,mapper里的大量sql就不会被测试到了。因此mock mapper是一个不完整的测试。 为了达到测试sql语句的目的,我推荐使用h2内存数据库来代替mysql真实数据库。 [h2-database](http://www.h2database.com/html/main.html),是一个基于java的数据库系统,它的数据可以存储于内存中(充当缓存使用或者就直接在单元测试里使用),也可以存储在本地文件中。 在这个例子中,我们使用了h2数据库作为单元测试的数据库,数据用内存承载,这样测试时,启动数据库,测试完,数据库自动销毁,对真实数据库无影响,无侵害,绿色环保,可重复执行。 - - - - - ### 4. 基于springboot+dubbo的分布式调用项目的单元测试(含provider和consumer) dubbo和springcloud是目前被拿出来比较的多的分布式框架,在这个案例中,使用了rpc类型的框架dubbo来掩饰分布式系统中的单元测试。 [dubbo](http://dubbo.apache.org/zh-cn/)由阿里团队孵化,现在已经被纳入apache开源系列,dubbo需要用到注册中心,dubbo的注册中心有多种选择,不过它既然是阿里巴巴孵化而成的,在这里我选择了同样是阿里巴巴团队开发的[nacos](https://nacos.io/zh-cn/docs/what-is-nacos.html)作为dubbo的注册中心。相信同出一脉的东西,使用起来会更香,毕竟这两个连官网都长得很像。 junit5-common提供了服务接口和数据传输DTO对象 junit5-dubbo-provider-demo演示了一个基于dubbo的服务端,也就是junit5-common的具体实现 junit5-dubbo-consumer-demo演示了一个基于duboo的客户端,也就是对junit5-common的调用 要启动该项目,必须本地启动一个nacos,nacos的[下载地址](https://nacos.io/zh-cn/docs/quick-start.html) 然后分别启动provider和consumer即可看到效果 单元测试里,不需要依赖nacos,因为consumer的单元测试里,对provider的依赖可以利用mock来实现。 UserControllerTest演示了mock远程接口依赖的单元测试方案 - - - - - ### 5. 基于jacoco的单元测试覆盖率统计 [jacoco](https://www.jacoco.org/)可以对覆盖率进行统计,目前单测覆盖率报表也比较推荐这个工具。 jacoco-coverage这个模块是一个聚合模块,它聚合了其他的模块里所有的单测覆盖率报表,形成了一个总的报表。jacoco-coverage里没有代码,只有一个pom.xml