springcloud fegin契约测试解决方案(单元测试)
一、前言
由于现在对代码的质量要求变高,要求代码覆盖率达到80%以上,现在在疯狂的补单元测试。遇到的一个问题就是springcloud fegin单元测试时总是报错找不到。这里解决方案是使用契约测试来模拟feginserver服务。
二、契约测试的介绍
1、官网
https://spring.io/projects/spring-cloud-contract
springcloud contract官网介绍2、契约测试介绍
A团队埋头苦干,B团队也争分夺秒,两边都开发完了,往往一联调,就出现下图这情况。
所以要使用契约测试
服务间使用契约进行约束三、一个简单的fegin契约测试 demo
3.1 契约测试需要准备什么
契约测试也叫消费者驱动测试。
两个角色:消费者(Consumer)和 生产者(Provider)
一个思想:需求驱动(消费者驱动)
契约文件:由Consumer端和Provider端共同定义的规范,包含API路径, 输入,输出。
实现原理:Consumer端提供一个类似“契约”的东西(如json 文件,约定好 request和response)交给Provider 端,告诉Provider 有什么需求,然后 Provider根据这份“契约”去实现。
3.2 eclipse安装groovy环境
这里安装上groovy环境,用于契约文件编写。(IDEA自带环境)
eclipse安装groovy环境3.3 契约测试步骤
Spring Cloud Contract契约测试大概分三个步骤
①producer提供服务的定好服务接口(即契约)
②生成stub,并共享给消费方,可通过mvn install到maven库中
③consumer消费方引用契约服务,进行集成测试
3.4 Provider生成者编写
3.4.1架构引入
pom依赖 contract插件(必需)3.4.2 编写契约
首先,在src/test/reources/contracts位置写契约xxx.groovy,契约内容包含契约头信息,请求信息,响应信息
契约文件更多的信息设置参考这里
更多契约参数设置2.4.3 把契约文件打成stubs jar包(第一次需要执行)
执行命令:mvn spring-cloud-contract:convert,会在在target/tubs生成对应的 groovy和转换的json文件。
生产json文件接着执行:mvn spring-cloud-contract:generateStub,会在target下生成xx-xx-stubs.jar的jar包
2.4.4 安装stubs jar到本地仓库(中间过程可省略)
mvn install:install-file -DgroupId=com.wangxinqiao -DartifactId=demo -Dversion=0.0.1 -Dpackaging=jar -Dclassifier=stubs -Dfile=demo-0.0.1-stubs.jar
2.4.5 一步骤完成stubs jar
只需要执行mvn clean install -SkipTest
在本地仓库里会出现一个stubs的jar包,这里放着契约
2.5 feginclient消费者
2.5.1 架构引入
消费端契约依赖2.5.2 消费者引入契约规则
基础测试类
这里是基础测试类,配置了测试环境,使用时只需继承即可。现在可以进行单元测试了。
三、契约测试高级
3.1 契约测试对双方约束
在上面的demo中仅仅是对feginclient调用过程中模拟fegin调用,但是我们没有测试feginserver是不是符合契约规则。契约规则应该是对生产者和消费者双方进行约束的。
在feginserver pom.xml引入契约插件
配置基础测试类需要测试那个类则在MvcMockTest里添加即可
把需要测试的放在这里之后执行maven命令,mvn spring-cloud-contract:generateTests
自动生成的服务端测试代码3.2 契约测试的高级编写
契约测试可以对服务端和消费的分别设置不用的参数
两端参数设置四、契约测试遇到的坑
4.1 契约测试契约文件位置
契约文件要写在src/test/reources/contracts下
4.2 确认执行了spring-cloud-contract:convert
整个项目在第一次使用契约时要先执行一次spring-cloud-contract:convert命令,在target文件夹下生成stubs文件,后面有新增或修改groovy文件,值需要mvn clean install -DskipTests
4.3 不出现契约测试案例
中途出现过执行了mvn spring-cloud-contract:generateTests命令,但是在target内没有生成测试案例,有可能是软件兼容问题。可以在cmd命令窗口,找到项目位置在执行命令。
4.4 契约测试总是测试不通过
中途测试过程中经历了很多契约不通过的问题。回头检查groovy契约文件,在请求参数那是区分生产者使用的参数和消费者使用的参数。如果使用这参数使用的是具体值,那调用过程只要不是这个值就会报错,这里最好使用正则表达式或者不需要检验的参数则可以不写。