契约测试理论篇

news2024/10/1 17:31:15

契约测试理论篇

目录

  • 契约测试理论篇
    • 什么是契约测试
    • 契约测试存在一些的问题
    • 契约测试的主要实践
    • 总结

随着 Web 系统的大规模发展,Web API 已经成为了一种广泛使用的技术,再加上微服务和云系统的普及,Web API 的数量呈几何增长。比如在一个大型 Web 系统中,各个子系统或者依赖系统之间一般都使用 Web API 来集成,从而导致开发不同子系统或者依赖服务的团队之间也存在不少问题。其中最大的四个问题是:

  • 团队之间业务和技术集成沟通困难

  • 团队之间业务和技术集成沟通困难

  • 难以快速响应外部需求变化

  • 开发流程责任链混乱

  • Web API 部署到测试环境后才发现集成问题

这四个问题都属于集成和变更管理的问题,首先团队之间业务和技术集成沟通困难主要是指没有明确的集成沟通流程,那么团队之间在沟通集成业务和技术的时候则容易混乱不清,遇到各种困难。所以需要有一个规范和明确的沟通流程,从而避免有流程混乱所产生的困难。

其次对于难以快速响应外部需求变化,指如果系统的用户提出一个新需求或者需求更改的时候,很难快速的让所有后端开发团队们都明确的知道集成部分的更改细节和需求,从而快速的完成开发工作。

对于开发流程责任链混乱,指对一个子系统很多的应用系统,如果发现一个集成相关的问题,很难确定是哪个子系统的问题。需要有一种方法可以快速的确定应该由谁来修复这个集成问题。

最后 Web API 部署到测试环境后才发现集成问题,导致发现问题的时间延后,从而增加修复的成本。所以最好能在 Web API 的编码开发阶段就发现集成问题,从而可以快速反馈,节约修复成本。

在各种测试方法中,契约测试可以较好的解决上面四个问题。但是业界能真正实施契约测试的团队却很少,比如 Google,REA 等一些国外大型互联网公司的项目以及一些大型正规的金融项目等。而其他绝大部分没有实施契约测试的项目,主要是因为它们还能接受上面四个问题以及这四个问题所带来的成本。

什么是契约测试

契约测试,顾名思义是基于契约或者使用契约来测试被测系统,其核心是契约,包括如何制定契约,如果更改契约以及如何使用契约等。首先定义契约必须有 API 的消费者(Consumer)和 API 的提供者(Provider)两端,其次契约还要包含这个 API 的 Request 和 Response 的定义细节,见下图:
在这里插入图片描述
然后再分别使用这个契约里面的内容生成测试用例来测试消费者者对于 Web API 消费代码和提供者对于 Web API 的实现代码,见下图:
在这里插入图片描述
所以契约测试即测试了一部分接口的功能,也测试一部分集成的功能,但是它却不能完全替代接口测试或者集成测试,因为一般情况下契约测试不会包含所有的业务场景,因此它们之间的关系应该如下图:
在这里插入图片描述

契约测试存在一些的问题

虽然如此简单的契约测试能解决不少问题,但是它仍然存在一些问题,其中包括:

  • 无法取代功能性的接口测试或者集成测试

  • 沟通,开发和维护成本不低

  • 小项目中的 ROI 不高

很明显,契约测试最大的困难点就是契约制定和变更的沟通,所以沟通困难的团队并不适合做契约测试。除此以外,没有明确的变更管理流程;或者有团队可以不用遵守契约或者契约的变更流程;或者还不稳定,变更非常频繁的项目都不适合做契约测试,强行做则是事倍功半。

契约测试的主要实践

如果要实践契约测试,首先要沟通契约,并且编写契约。

首先沟通契约一般有两种方式,一种是提供者驱动(Provider Driven),另一种是消费者驱动(Consumer Driven)。而编写契约的方式也有两种,一种是使用工具手动编写契约;另外一种是使用特定的契约测试框架或者工具,然后编写代码来动态生成契约。业界最常用的三个契约测试框架是 Pact,Swagger 和 Spring Cloud Contract。其中 Pact 是一个支持多种语言的框架,包括 Java,JavaScript,Golang,#C 等多种语言开源免费框架,主要通过编写测试代码来动态生成契约,并主要用于消费者驱动契约类型的测试;而 Swagger 主要是通过手动编写契约来做提供者驱动契约类型的测试;最后 Spring Cloud Contract 主要用于基于 Spring 框架开发的 Web 系统,也是主要通过编写测试代码来动态生成契约来做消费者驱动契约类型的测试。并使用契约生成相应的测试用例和自动化测试。

其次,当生成了大量的契约之后,一定要集中化的管理契约,并且最好能可视化出来,如下图:
在这里插入图片描述
最后将相应的自动化契约测试加入持续构建流水线中进行持续测试。

总结

契约测试是一种相对简单的测试方法,它能解决不少问题,但是它也会带来一些问题,并且如果要成功实施也需要相应的前提。所以一个项目是否选择契约测试,需要先判断项目所遇到的问题是不是适合用契约测试来解决,然后才决定,而不要盲目的选择契约测试。但是项目真的有一些很严重的问题适合用契约测试解决,也不要因为契约测试所带来的一些额外成本而拒绝它,从而得不偿失。

最后契约测试实施的主要步骤总结如下:

  • 制定明确的契约沟通,设计和变更流程

  • 各服务开发团队之间必须同意并遵守此流程

  • 集中化管理契约

  • 可视化展现服务的依赖和调用链

  • 自动化契约测试并加入持续构建流水线中

内容来源:软件测试与质量沉思

https://xie.infoq.cn/article/1c490dabcb429209b07e5b456

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/54681.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

pandas 将一行拆分为多行,将多行合并为一行

需求描述 在今天的数据需求,现在要统计各个场景下的类目种类数,并列出对应都有哪些类目。 现在面临的问题是:每个客户的应用场景不同,购买的类目也有多种。 🎞🎞🎞🎞🎞&…

postgres源码解析38 表创建执行全流程梳理--4

本文讲解非系统表的创建逻辑&#xff08;[<fontcolor0000dd>普通表和索引表]&#xff09;&#xff0c;其入口函数为heap_create&#xff0c;内部公共接口函数为RelationBuildLocalRelation和RelationCreateStorage相关知识回顾见&#xff1a; postgres源码解析38 表创建执…

宝宝入托,爸妈要避开这5种心态

孩子入托&#xff0c;父母也要做好心理准备&#xff0c;尤其需要避免以下5种常见的、不良心理状态&#xff0c;否则会加重孩子入托的困难度。 01.“生离死别式”的入托状态 即每次送孩子入园&#xff0c;就像一场生离死别。宝宝屋里哭&#xff0c;家长屋外哭&#xff0c;最后多…

大数据编程实验四:SparkStreaming编程

大数据编程实验四&#xff1a;SparkStreaming编程 文章目录大数据编程实验四&#xff1a;SparkStreaming编程一、实验目的与要求二、实验内容三、实验步骤1、利用Spark Streaming对不同类型数据源的数据进行处理2、完成DStream的两种有状态转换操作3、完成把DStream的数据输出保…

推荐一个对pytorch代码详细注释的github项目

今天在无意间找一个pytorch代码和注释的Github项目。 先上项目&#xff1a; https://github.com/labmlai/annotated_deep_learning_paper_implementations 这个项目还有个网站&#xff0c;地址&#xff1a;https://nn.labml.ai/ 这个项目将论文和pytorch代码结合起来&#xff…

jsp源码商城系统Myeclipse开发mysql数据库servlet开发java编程计算机网页项目

一、源码特点 JSP 源码商城系统 是一套完善的web设计系统&#xff0c;对理解JSP java编程开发语言有帮助&#xff0c;系统具有完整的源代码和数据库&#xff0c;系统采用serlvetdaobean mvc 模式&#xff0c;系统主要采用B/S模式开发。开发环境为TOMCAT7.0,Myeclipse8.5开发…

想学习如何把excel图片转表格?1分钟教会你图片转表格怎么转

应该有不少小伙伴接收过上司或领导以图片格式发送过来的excel表格吧&#xff1f;并且还会要求我们将里面的内容整理为电子档&#xff0c;便于后期的内容编辑以及数据修改。 而当你们收到这种任务时&#xff0c;是怎么去操作的呢&#xff1f;是不是大部分人会选择手动重新制作&a…

【数据可视化】第四章—— 基于pandas的数据可视化(pandas数据结构)

文章目录前言1. Pandas库的引用2. Pandas库的数据类型2.1 Series类型2.2 Series创建方式2.3 Series类型的基本操作2.3.1 Series类型的切片和索引2.3.2 Series类型的对齐操作2.3.3 Series类型的name属性2.3.4 Series类型的修改2.4 DataFrame类型2.5 DataFrame类型创建2.6 DataFr…

毕设选题推荐基于python的django框架医院预约挂号系统

精彩专栏推荐订阅&#xff1a;在 下方专栏&#x1f447;&#x1f3fb;&#x1f447;&#x1f3fb;&#x1f447;&#x1f3fb;&#x1f447;&#x1f3fb; &#x1f496;&#x1f525;作者主页&#xff1a;计算机毕设老哥&#x1f525; &#x1f496; Java实战项目专栏 Python实…

公网SSH远程连接内网Ubuntu主机【cpolar内网穿透】

SSH为建立在应用层基础上的安全协议&#xff0c;专为远程登录会话和其他网络服务提供安全性的协议。但在没有公网IP的环境下&#xff0c;只能在同个局域网下远程。 本篇教程主要实现通过内网穿透&#xff0c;在公网环境下SSH远程登录内网的Ubuntu主机&#xff0c;突破局域网的…

manjaro gnome 记录 3 配置国内镜像源

manjaro gnome 记录 3 配置国内镜像源初manjaro 记录 3 配置国内镜像源更改这个文件设置源初 希望能写一些简单的教程和案例分享给需要的人 manjaro 记录 3 配置国内镜像源 打开图像界面的软件管理&#xff0c;点击右上角&#xff1a;三个点的图标 点击首选项 输入管理员密…

Day17-购物车页面-收获地址-初步封装my-address组件

1.创建收货地址组件&#xff08;my-address&#xff09; 我的操作&#xff1a; 1>在uni_modules文件夹右键新建一个组件 2>还需要自己补全代码 1>和2>的阶段效果图&#xff1a; my-address组件已经被渲染成功了。 *********************************************…

一文看懂linux 内核网络中 RPS/RFS 原理

1 自带 irqbalance 瓶颈 基于简单的中断负载均衡(如系统自带的irqbalance进程)可能会弄巧成拙。因为其并不识别网络流&#xff0c;只识别到这是一个数据包&#xff0c;不能识别到数据包的元组信息。 在多处理器系统的每个处理器都有单独的硬件高速缓存&#xff0c;如果其中一…

黑马程序员软件测试实战项目

Ego微商 “Ego微商”微信小程序应用&#xff0c;主要针对于有特色的食品类商品线上零售。通过微信平台的大流量入口&#xff0c;在一定程度上升高了特色食品的影响力&#xff0c;同时借助微信的模板消息快速推送更新的商品&#xff0c;实现轻量级应用的C2C或者是B2C的线上销售…

《论文阅读》BALM: Bundle Adjustment for Lidar Mapping

留个笔记自用 BALM: Bundle Adjustment for Lidar Mapping 做什么 首先是最基础的&#xff0c;Structure-from-Motion&#xff08;SFM&#xff09;&#xff0c;SFM可以简单翻译成运动估计&#xff0c;是一种基于dui8序列图片进行三维重建的算法。简单来说就是是从运动中不同…

12月2日第壹简报,星期五,农历十一月初九

12月2日第壹简报&#xff0c;星期五&#xff0c;农历十一月初九1. 银保监会&#xff1a;2023年1月起在北京、上海、江苏、浙江、福建、广东等10个省市开展商业养老金业务试点。2. 国家首批未来产业科技园试点名单出炉&#xff1a;空天科技未来产业科技园、未来能源与智能机器人…

2022-12-02 编译Android平台OpenCV,用到读取视频时报错:AMediaXXX

文章目录编译Android平台OpenCV&#xff0c;用到读取视频时报错&#xff1a;解决参考编译Android平台OpenCV&#xff0c;用到读取视频时报错&#xff1a; ld: error: undefined symbol: AMediaExtractor_new ld: error: undefined symbol: AMediaExtractor_setDataSourceFd ld…

PyQt5的安装

0. 准备工作 Anaconda3-5.2.0-Windows-x86_64pycharm-professional-2018.2.4PyQt5 5.8.1 1. 如何正确安装PyQt5&#xff1f; 1.1 安装PyQt5 pip install PyQt5 -i https://pypi.douban.com/simple- i表示指定安装源&#xff0c;表示国内源 https://pypi.douban.com/simple …

创建一个SpringCloud项目

文章目录1.首先在**SpringCloud官网**中查看依赖版本号2.创建主Maven项目&#xff1a;在pom文件中引入依赖3.再在这个Maven项目中创建子模块&#xff08;子模块也是Maven&#xff09;(1)创建一个数据库db01和表dept(2)创建实体类dept&#xff08;注意&#xff1a;**每个实体类都…

导包问题解决--ImportError: DLL load failed while importing _path: 找不到指定的模块

一、问题反馈 在运行某个Python程序时&#xff0c;需要导入numpy和matplotlib包如下&#xff1a; import numpy as np import matplotlib.pyplot as plt运行程序时会报错“ImportError: DLL load failed while importing _path: 找不到指定的模块”&#xff1a; 二、问题解决…