契约测试(二)-- 代码实现篇(上)
背景:网上有不少介绍这种测试方法的概念和原理的文章,但实现的比较少。本文通过自己的方法从零开始搭建工程,实现了一个例子。在此也感谢朋友的帮助,是参考了TA的代码才能入了这道门。环境:JDK1.8 + Gradle4.6 + Postgres9.6 + pact_broker
步骤:
一、建立父工程。本工程采用Gradle的父子工程,父工程为Demo,两个子工程分别为Provider和Consumer。
父工程中没有代码,build.gradle文件也是默认配置
二、创建Provider。根据契约测试的特点,“契约”是来自Provider和Consumer双方的。所以,当我们从零开始实践这种测试方式时,首先应该建立起自己的Provider。
这里分别有三个文件:
Product.java:定义数据结构。即,Provider端向外提供的数据类型
ProductController.java:定义的URI和方法,以及对外提供的数值。
Application.java:启动入口
注:这里并未按照严格的Spring MVC结构执行,因为是示例,所以做了一些简化。
1) Product.java
package provider_demo;
public class Product {
private String code;
private Integer httpCode;
private String msg;
private Boolean status;
public String getCode() { return code; }
public void setCode() { this.code = code; }
public Integer getHttpCode() { return httpCode; }
public void setHttpCode(Integer httpCode) { this.httpCode = httpCode; }
public String getMsg() { return msg; }
public void setMsg() { this.msg = msg; }
public Boolean getStatus() { return status; }
public void setStatus(Boolean status) { this.status = status; }
}
2) ProductController.java
package provider_demo;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class ProductController {
private Product product = new Product();
@RequestMapping(value = '/api/v1/test', method = RequestMethod.GET)
public Product product() {
product.setCode("product.0");
product.setHttpCode(200);
product.setMsg("ok");
product.setStatus(true);
return product;
}
}
3) Application.java
package provider_demo;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication
public class Application{
public static void main(String[] args) {
SpringApplication.run(Application.class, args);
}
}
三、配置Provider的build.gradle文件。
... // 头部省略
buildscript {
repositories {
mavenCentral() // maven仓库
}
dependencies {
classpath("org.springframework.boot:spring-boot-gradle-plugin:1.5.8.RELEASE") // gradle插件
classpath("org.thymeleaf:thymeleaf:3.0.8.RELEASE") // springboot工程的starter之一
classpath("au.com.dius:pact-jvm-provider-gradle_2.12:3.5.10") // provider插件
}
}
apply plugin: 'java'
apply plugin: 'idea'
apply plugin: 'org.springframework.boot'
apply plugin: 'au.com.dius.pact'
jar {
baseName = 'Provider'
version = '1.0.0'
}
sourceCompatibility = 1.8
targetCompatibility = 1.8
repositories {
mavenCentral()
}
dependencies {
compile("org.springframework.boot:spring-boot-starter-web")
compile("org.springframework.boot:spring-boot-starter-thymeleaf")
compile("org.springframework.boot:spring-boot-devtools")
testCompile('org.springframework.boot:spring-boot-starter-test')
testCompile group: 'junit', name: 'junit', version: '4.1.2'
testCompile group: 'au.com.duis', name: 'pact-jvm-provider-junit_2.11', version: '3.3.3'
testCompile("au.com.dius:pact-jvm-consumer-junit_2.12:3.5.12")
testCompile("au.com.dius:pact-jvm-consumer-java8_2.12:3.5.12")
}
pact { // 定义pact,固定格式
serviceProviders { // 定义pact,固定格式
Provider { // pact的名称
protocol = 'http'
host = 'localhost'
port = 8080 // 服务启动的端口号,缺省为8080,有的Provider端会有自己的设置
path = '/'
hasPactWith('Provider') { // pact名称
pactSource = file("$rootDir/target/pacts/Consumer-Provider.json") // pact所在路径
}
}
}
}
页:
[1]