为什么是契约测试
契约测试(ContractTest)第一次看到我是在Martin Fowler的文章里。(原文在这里感兴趣的可以去看看https://martinfowler.com/bliki/ContractTest.html)

在他的这篇文章了,首先说了一下TestDouble的劣势,其中TestDouble(对这个定义感兴趣可以见https://martinfowler.com/bliki/TestDouble.html)

其实我们也很少提及。为了解释契约测试,我们在本文吧TestDouble替换成MOCK,这也行并不正确,但是可以快速让我们理解。

MOCK服务相信很多人都知道主要是用了帮助解决外部依赖而存在的。在两个团队分别负责Service1和Service2的开发,其中Service1调用Service2。在测试过程中很容易由于Service1和Service2之间网络速度、服务不稳定等问题导致的无法测试Service1,那么这个时候我们很多人第一个想到的是Service2用MOCK服务替代掉。这也确实是一个行之有效的方法。

但是现在开发周期、迭代周期和迭代频率都在变短、变快,如果Service1在开发或者测试的使用应用了Service2的MOCK服务,同时Service2也被自己的Own团队进行了升级迭代,但是Service1调用的MOCK服务没有升级,这就导致了集成测试的时候才能发现两边不一致的问题,这将大大影响项目或者迭代周期的进度。

在微服务大行其道的今天,各种服务接口(provider)又被各种服务调用(comsumer),生产者消费者模式就促生了契约测试(更应该叫消费者驱动的契约测试,Cunsumer-Driven Contracts,简称CDC),CDC就是从消费者的角度定义测试,通过给API提供方提供契约的形式,来完成功能的实现。当今比较主流的CDC测试框架有PACT(https://github.com/pact-foundation/pact-specification)

cdc核心原则(转自:https://www.cnblogs.com/jinjiangongzuoshi/p/7815243.html):

cdc是以消费者提出接口契约,交由服务提供方实现,并以测试用例对契约进行产生约束,所以服务提供方在满足测试用例的情况下可以自行更改接口或架构实现而不影响消费者。

cdc是一种针对外部服务的接口进行的测试,它能够验证服务是否满足消费方期待的契约。 它的本质是从利益相关者的目标和动机出发,最大限度地满足需求方的业务价值实现。

Pact的契约测试流程

如上图,使用Pact完成契约测试后,首先我们还是按照原来的测试用例对Consumer进行测试,在需要Consumer和Provider发生交互的时候,Provider被替换成和Pact交互。在测试过程中,Pact会记录下全部的Provider的调用请求(保存在一个Json文件中),这就是消费者的契约。如果在执行Provider的测试的时候,就不需要从新完成Provider的测试用例,只需将Pact记录下来的消费者契约作为测试的输入,完成和Provider的交互,来验证Provider是否满足了消费者契约。

这也说明了契约测试既不是单元测试也不是集成测试,是出于单元测试和集成测试之间的一层测试行为。

Pact官方给出的几个场景:
(转自: https://insights.thoughtworks.cn/about-contract-test/)

适用场景:
团队能把控开发过程中的Consumer和Provider端
适合Consumer驱动开发的场景
对于每个独立的Consumer端,Provider端都能管理好需求。

不适用的场景:
公共API或者是OAuth授权服务
Provider端和Consumer端没有良好的沟通渠道
针对性能的测试
Provider端的功能性测试(Pact只测试内容和请求格式)
对于不同输入有相同的输出,并未达到验证的目的
当前测试输入需要依赖之前测试返回的结果

参考
https://www.cnblogs.com/jinjiangongzuoshi/p/7815243.html
http://aleung.github.io/blog/2017/06/21/pact/
https://insights.thoughtworks.cn/about-contract-test/

转载于:https://www.cnblogs.com/mrtester/p/10490010.html

契约测试:解决微服务测试的问题相关推荐

  1. 如何避免让微服务测试成为研发团队最大的瓶颈?

    本文主要为大家介绍微服务测试:基于服务契约信息,降低云上微服务测试成本.该系列文章基于阿里云商业化产品 EDAS 的微服务实践,如果您的团队具备较强的微服务测试能力,那么希望我们在微服务测试方面的实践 ...

  2. 基于PACT框架的契约测试在微服务架构中的应用

    背景信息 在软件工程领域,我们经常面临变化."概念的到来,微服务 "是那些最近发生的事件,它不仅改变了软件的架构,而且球队的组织方式以及它们如何协同工作之一. 以下是由M. Fow ...

  3. 华为专家 | 轻量化微服务测试实践

    转自:https://cloud.tencent.com/developer/article/1035280 前言 在我过去工作的这十年间,IT行业经历了很多的变迁,从单体架构到微服务架构,从传统组织 ...

  4. 网易云容器服务微服务化实践—微服务测试及镜像化提测全流程实践

    前言 近几年,互联网项目很多都有从单体服务转变成微服务化的趋势,尤其是一些架构复杂,业务比较广泛的项目,微服务化是大势所趋,可以解决独立构建.更新.运维等一系列问题,从而解放生产力,促进交付效率和质量 ...

  5. 微服务测试怎么做,看看这篇文章就懂了

    开发团队越来越多地选择微服务架构而不是单体结构,以提高应用程序的敏捷性.可扩展性和可维护性.随着决定切换到模块化软件架构--其中每个服务都是一个独立的单元,具有自己的逻辑和数据库,通过 API 与其他 ...

  6. 一行代码就能解决微服务分布式事务问题,你知道GTS怎么做到的吗?

    2019独角兽企业重金招聘Python工程师标准>>> GTS直播火热报名中,直播直通车 一.GTS (Global Transaction Service)是啥? GTS(全局事务 ...

  7. 如何解决微服务的数据一致性分发问题

    介绍 系统架构微服务化以后,根据微服务独立数据源的思想,每个微服务一般具有各自独立的数据源,但是不同微服务之间难免需要通过数据分发来共享一些数据,这个就是微服务的数据分发问题.Netflix/Airb ...

  8. 波波老师: 解决微服务的数据一致性分发问题?

    点击▲关注 "中生代技术"   给公众号标星置顶 更多精彩技术内容 第一时间直达 介绍 系统架构微服务化以后,根据微服务独立数据源的思想,每个微服务一般具有各自独立的数据源,但是不 ...

  9. 如何解决微服务的数据一致性分发问题?

    介绍 系统架构微服务化以后,根据微服务独立数据源的思想,每个微服务一般具有各自独立的数据源,但是不同微服务之间难免需要通过数据分发来共享一些数据,这个就是微服务的数据分发问题.Netflix/Airb ...

最新文章

  1. mysql引号问题_MySQL中引号的问题
  2. DL之DNN:基于神经网络(从1层~50层)DNN算法实现对非线性数据集点进行绘制决策边界
  3. CRC循环校验码原理及计算举例
  4. linux mysql 文件恢复_linux下误删数据文件恢复
  5. 超详细图解!【MySQL进阶篇】SQL优化-索引-存储引擎
  6. java Flink使用addSink方法保存流到mysql数据库中
  7. 网页表单回车自动提交问题
  8. 刷题笔记(1) 一个序列是否为二叉搜索树的遍历结果
  9. Compile warning: Embedded binary's NSExtensionActivationRule is TRUEPREDICATE
  10. 【验证码识别】基于matlab CNN卷积神经网络验证码识别【含Matlab源码 098期】
  11. android9 三星 港版,三星S9+官方港版安卓9固件rom刷机包:TGY-G9650ZHS4CSD7
  12. java itex 打印pdf_【收藏】java使用ITEXT打印PDF
  13. 笔记本输字母p出现仅计算机,电脑打不了字只有字母怎么办?最简单的解决方法...
  14. ZOJ2965 Accurately Say CocaCola! java
  15. Swift All-In-One安装指南
  16. 支付宝自动续费申请PHP,支付宝自动续费怎么取消?
  17. 爬取虎扑nba球员得分榜信息并存储至MongoDB数据库
  18. kali中无线密码的破解
  19. Logisticregression学习
  20. JS 文件压缩与反压缩

热门文章

  1. 从资源池和管理的角度理解物理内存
  2. java调用sql返回list_Spring JdbcTemplate实现有java.sql.ResultSet结果集返回的存储过程调用 | 学步园...
  3. cython python3_30倍!使用Cython加速Python代码
  4. n1运行linux,斐讯N1折腾记:运行 Linux 及优化
  5. sql 整改措施 注入_SQL注入的漏洞及解决方案
  6. java 异步调用方法_乐字节Java编程之方法、调用、重载、递归
  7. win10编辑js文件报错,错误','
  8. python控制步进电机驱动器_树莓派操作案例1-使用python GPIO+TB6612驱动步进电机
  9. 牛客 怕npy的牛牛(双指针)
  10. LeetCode 1662. 检查两个字符串数组是否相等