51Testing软件测试论坛

 找回密码
 (注-册)加入51Testing

QQ登录

只需一步,快速开始

测试开发精英班,通向高级软件测试工程师【周活动】 找茬--心里圈的故事 !【长期招募】博为峰网校招聘兼职讲师!横扫BAT,Python全栈测试开发技能大全
【106期】:如何树立正确使用Python做开发的习惯 【征稿】提交你的测试成绩单! 【专题】用尽一切办法只为让你学好用例 自学软件测试那点事
查看: 551|回复: 0

[转贴] 契约测试(二)-- 代码实现篇(上)

[复制链接]

该用户从未签到

发表于 2019-4-11 15:02:36 | 显示全部楼层 |阅读模式
背景:网上有不少介绍这种测试方法的概念和原理的文章,但实现的比较少。本文通过自己的方法从零开始搭建工程,实现了一个例子。在此也感谢朋友的帮助,是参考了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) roductController.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所在路径
                }

            }

       }

  }
回复

使用道具 举报

本版积分规则

关闭

站长推荐上一条 /2 下一条

小黑屋|手机版|Archiver|51Testing软件测试网 ( 沪ICP备05003035号 关于我们

GMT+8, 2019-9-16 10:31 , Processed in 0.058305 second(s), 24 queries .

Powered by Discuz! X3.2

© 2001-2019 Comsenz Inc.

快速回复 返回顶部 返回列表