微服务pact测试框架

最近,我的一位同事偶然发现了Pact.io ,我们目前的应用程序已扩展到 50多种服务,并且我们开始出现一些集成测试失败和脆弱的开发/验收测试环境。 因此,我们决定研究尝试与此相关的方法。

我从阅读开始: https : //docs.pact.io/faq/convinceme.html

然后观看: https : //www.youtube.com/watch?v = -6x6XBDf9sQ&feature = youtu.be

那两个资源说服了我试一试。

因此,我开始并创建了一组快速的Spring引导应用程序( 此处为GitHub repo),以测试概念并使其正常运行。

突出演示中的一些重要内容。

消费者:

由于Pact是消费者驱动的测试框架。 在这里定义单元测试,该测试将模拟http服务器响应,并以此为依据进行断言。

一旦测试成功,它将在/ pacts目录中创建一个pact json文件。

public class TestProvider {@Rulepublic PactProviderRule provider = new PactProviderRule("test_provider", "localhost", 8081, this);@Pact(state = "default", provider = "test_provider", consumer = "test_consumer")public PactFragment createFragment(PactDslWithProvider builder) {Map<String, String> headers = new HashMap<>();headers.put("content-type", "application/json");return builder.given("default").uponReceiving("Test User Service").path("/user/1").method("GET").willRespondWith().status(200).headers(headers).body("{" +"  \"userName\": \"Bob\",\n" +"  \"userId\": \"1\",\n" +"  \"firstName\": null,\n" +"  \"lastName\": null,\n" +"  \"email\": null,\n" +"  \"groups\": null\n" +"}").toFragment();}@Test@PactVerification("test_provider")public void runTest() throws IOException {final RestTemplate call = new RestTemplate();final User expectedResponse = new User();expectedResponse.setUserName("Bob");expectedResponse.setUserId("1");final User forEntity = call.getForObject(provider.getConfig().url() + "/user/1", User.class);assertThat(forEntity, sameBeanAs(expectedResponse));}
}

因此,在运行“模拟”测试并创建协定文件之后。 您需要包括一个maven插件…pact…,然后将其用于将pacts /文件夹的内容发布到pact代理……这在pom中定义如下。

<dependencies><!-- https://mvnrepository.com/artifact/au.com.dius/pact-jvm-consumer-junit_2.11 --><dependency><groupId>au.com.dius</groupId><artifactId>pact-jvm-consumer-junit_2.11</artifactId><version>3.3.6</version><scope>test</scope></dependency>
</dependencies><build><plugins><plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-surefire-plugin</artifactId><version>2.18</version><configuration><systemPropertyVariables><pact.rootDir>pacts</pact.rootDir><buildDirectory>${project.build.directory}</buildDirectory></systemPropertyVariables></configuration></plugin><plugin><groupId>au.com.dius</groupId><artifactId>pact-jvm-provider-maven_2.11</artifactId><version>3.3.4</version><configuration><pactDirectory>pacts</pactDirectory><pactBrokerUrl>http://localhost:80</pactBrokerUrl><projectVersion>1.0.1</projectVersion></configuration></plugin></plugins>
</build>

制片人:

这使用来自Pact.io的JUnit集成从代理下载契约,然后针对正在运行的服务运行。

由于这已经使用了@RunWith批注,因此我无法使用spring bootRunner。 因此,为了解决这个问题,在上课之前,我启动了Spring引导应用程序,然后针对该正在运行的实例运行了协定……并且在测试之后,引导应用程序又被停止了。 根据您的用例,我想也可以使用@Before来执行此操作,这样您就可以在每个包之前启动一个新的服务实例,但这会极大地降低执行速度。

@State批注允许客户端定义特定状态,生产者可以使用该状态来设置测试运行所需的其他数据/条件。

一旦对服务执行了契约,目标文件夹中就会生成报告。

@RunWith(PactRunner.class)
@Provider("test_provider" )
@PactBroker(host = "localhost", port = "80")
@VerificationReports({"console", "markdown"})
public class TestPacts {private static ConfigurableApplicationContext application;@TestTargetpublic final Target target = new HttpTarget(8080);@BeforeClasspublic static void startSpring(){application = SpringApplication.run(ProviderServiceApplication.class);}@State("default")public void toDefaultState() {System.out.println("Now service in default state");}@State("extra")public void toExtraState() {System.out.println("Now service in extra state");}@AfterClasspublic static void kill(){application.stop();}
}

设置契约代理

1.从Docker Hub获取公共映像。

docker pull dius/pact_broker
docker pull postgres

2.然后设置Postgres数据库

docker run --name pactbroker-db -e POSTGRES_PASSWORD=ThePostgresPassword -e POSTGRES_USER=admin -d postgres
docker run -it --link pactbroker-db:postgres --rm postgres psql -h postgres -U admin
CREATE USER pactbrokeruser WITH PASSWORD 'TheUserPassword';
CREATE DATABASE pactbroker WITH OWNER pactbrokeruser;
GRANT ALL PRIVILEGES ON DATABASE pactbroker TO pactbrokeruser;

3.数据库启动后,运行实际的代理:

docker run --name pactbroker --link pactbroker-db:postgres -e PACT_BROKER_DATABASE_USERNAME=pactbrokeruser -e PACT_BROKER_DATABASE_PASSWORD=TheUserPassword -e PACT_BROKER_DATABASE_HOST=postgres -e PACT_BROKER_DATABASE_NAME=pactbroker -d -p 80:80 dius/pact_broker

额外参考:

  • https://docs.pact.io/documentation/
  • https://docs.pact.io/documentation/sharings_pacts.html
  • https://github.com/DiUS/pact-jvm
  • https://github.com/DiUS/pact-jvm/tree/master/pact-jvm-consumer-junit

获取示例项目

  • https://github.com/bdupreez/pactdemo

翻译自: https://www.javacodegeeks.com/2017/03/consumer-driven-testing-pact-spring-boot.html

微服务pact测试框架

微服务pact测试框架_消费者驱动的Pact和Spring Boot测试相关推荐

  1. 微服务架构盛行的时代,你需要了解点 Spring Boot

    随着互联网的高速发展,庞大的用户群体和快速的需求变化已经成为了传统架构的痛点. 在这种情况下,如何从系统架构的角度出发,构建出灵活.易扩展的系统来快速响应需求的变化,同时,随着用户量的增加,如何保证系 ...

  2. 云享专家倪升武:微服务架构盛行的时代,你需要了解点 Spring Boot

    [摘要] 微服务架构的本质在于分布式.去中心化. 随着互联网的高速发展,庞大的用户群体和快速的需求变化已经成为了传统架构的痛点. 在这种情况下,如何从系统架构的角度出发,构建出灵活.易扩展的系统来快速 ...

  3. 微服务笔记:第一章_微服务简介|Eureka注册中心|Nacos注册中心|Nacos配置管理|Feign|Gateway服务网关

    微服务笔记:第一章_微服务简介|Eureka注册中心|Nacos注册中心|Nacos配置管理|Feign|Gateway服务网关 1. 微服务简介 1.1 服务架构演变 1.2 SpringCloud ...

  4. 微服务研究 - Swoole框架-Swoft初探

    微服务研究 - Swoole框架-Swoft初探.没有swoole之前,php一直被"誉"为世界上最好的语言.swoole横空出世后,php就成了宇宙最好的语言了... swoft ...

  5. SpringCloud微服务2-服务提供者和消费者

    服务提供即被其他微服务的调用的微服务:服务消费者即调用其他服务的微服务,下面我们来聊一聊. 概念: 服务提供者:被其他微服务的调用的微服务. 服务消费者:调用其他服务的微服务. 如图所示: 在上图中: ...

  6. 容器化技术与微服务结合---SpringCloud框架与阿里云serverless k8s的结合(六)

    目录 系列 写在前面 Serverless K8S 概念 创建集群 微服务搭建 项目地址 环境区分以及dockerFile注意 阿里云日志接入 创建阿里云日志project 配置 测试 Kuberne ...

  7. 从0到1 手把手搭建spring cloud alibaba 微服务大型应用框架(三) (mini-cloud) 搭建认证服务(认证/资源分离版) oauth2.0 (中)

    本文承接上文<从0到1 手把手搭建spring cloud alibaba 微服务大型应用框架(三) (mini-cloud) 搭建认证服务(认证/资源分离版) oauth2.0 (上)> ...

  8. 基于 Koa 的微服务 Node.js 框架设计思路与简单实现

    大家好,我是前端点线面,毕业于华中科技大学,非科班出身的一枚新时代农民工,现在是百度前端研发工程师,著有<前端百题斩>.数十篇学习思维导图(go.React.Redux.Vue.Vuex. ...

  9. python行为驱动测试开发_行为驱动开发在 Python 开发测试中的应用

    行为驱动开发 (BDD) 简介 行为驱动开发是什么? 说到行为驱动开发(BDD),无可避免的要提到敏捷里面的测试驱动开发(TDD),TDD 的主要思想是"代码即文档",其倡导的流程 ...

最新文章

  1. 2022-2028年中国聚硫橡胶行业市场研究及前瞻分析报告
  2. Educational Codeforces Round 59 (Rated for Div. 2)
  3. 没有java home_【Java安装】必须有JAVA_HOME变量吗
  4. Scala模式匹配和类型系统
  5. C# 获得当前目录和执行目录的一些方法
  6. P2016 战略游戏[树形dp]
  7. mysql维护计划_MySQL服务维护笔记
  8. 【LeetCode】【字符串】题号:242. 有效的字母异位词
  9. 以前收集到的PHP总结笔记
  10. 2017-5-26 正则表达式,js实战(加减数量,全选)
  11. 程序员为什么要学算法?
  12. html语言制作表格模板,十个最简单实用的Table设计模板
  13. 一款语文老师写的word办公神级插件
  14. 猫和老鼠手游的python代码_猫和老鼠手游猫鼠通用技巧讲解 赶紧进来好好向大佬们学习学习...
  15. python3 yield
  16. 生产环境系统突然访问速度变慢问题排查
  17. 10M/s,保姆级教程,制作自己的网盘不限速工具!
  18. 使用httpClient4.4登录豆瓣,并发表说说
  19. TU-Net/TDeepLab:基于RGB和红外的地形分类
  20. 4种改善类别不平衡的方法

热门文章

  1. P4552-[Poetize6]IncDec Sequence【差分】
  2. jzoj4017-逃跑【0/1分数规划,线段树,dp】
  3. bzoj3482,jzoj3238-超时空旅行hiperprostor【最短路,凸包,斜率优化】
  4. nssl1249-C【数论】
  5. HDU 5008 Boring String Problem ( 后缀数组求本质不同第k大子串)
  6. OpenJudge1043 树上游戏(换根dp+细节处理)
  7. 【Floyed】工厂的烦恼(ssl 1762)
  8. 7、mybatis中的sql映射文件详解(2)
  9. 如何在一分钟内搞定面试官
  10. 面象对象设计6大原则之六:迪米特原则