研发效能 不一样的测试之契约测试落地实践

流浪的武士 · 2021年03月11日 · 最后由 陈恒捷 回复于 2021年03月12日 · 344 次阅读

一·目前微服务及前后端分离模式的大环境下痛点

二·什么是契约测试

三·解决了什么问题

四·契约平台框架

五·平台发展前景



........................................................................分割线!...............................................................................



一、目前微服务及前后端分离模式的大环境下痛点

  • 开发进度不一致,联调困难。只能单测
  • 服务对接时和接口文档有偏差。接口文档变动未及时通知
  • 对接的服务莫名其妙的死掉。服务不稳定
  • ......

二、什么是契约测试

契约测试也叫消费者驱动测试(CDC)。

  • 有两个角色:消费者和生产者;
  • 一个思想:消费者驱动(需求驱动);
  • 契约文件:由消费者和生产者定义的规范,比如输入输出接入路径等(接口文档);
  • 实现原理:消费者提供一份契约告诉生产者,生产者根据契约生产东东;
  • 意义:体现了测试前移的思想,把本来要通过集成测试才能验证的工作化作单元测试和接口测试,用更轻量的方式快速进行验证

三、解决了问题及意义

  先容我放一张图


  • 在没有契约测试之前如上图左侧,服务对接途中各种问题
  • 有了灵活的契约如上右图:
    • 前端开发可以用契约当mock 桩
    • 服务端开发可以用契约当调试工具
    • 测试同学可以用契约造批量数据
    • 打造全新的研发流程体系



由以上思路打造的全新研发体现平台 --- 契约平台

四、契约平台框架



3.1 契约能力架构

3.1.1、三大块

  • 服务代理
    • 契约校验:自动校验接口的入参、返回、是否必填等
    • 数据跟踪:跟踪数据由源到末经过的系统
    • 动态路由:路由环境灵活选择
    • 服务限流:限制接口的最大 TPS
    • 压测支持:支持并发数据请求
    • ......
  • 契约管理
    • 动态函数:支持 java、python、groovy 脚本动态嵌入,灵活且简单引用生成报文
    • 基础管理:项目、服务、应用、文档等在线管理
    • 文档导入导出:支持 pdf 导出;postman、swagger、json 串等导入
    • 通知机制:服务不可以、文档变更等邮件及企业微信等通知相关人员
    • 文档分支:类似 git,好处自提体会😋
    • 报表统计:接口耗时、请求异常、契约校验异常等统计
    • 代理日志:查询相关代理日志,释放满屏服务日志刷屏的痛苦😂
    • ......
  • 接口测试
    • 在线调试:数据及时动态刷新,接口批量发送。比 postman 更好用!
    • 响应校验:响应字段自动校验
    • 用例集执行:根据契约生成不同的用例集
    • 自动化插件:自动工程接入契约平台简单灵活
    • ......

      3.2 契约应用

说了这么多,契约应用流程是怎么个回事呢?请看下图

+ 1·服务之间路由模式和 mock 模式灵活切换
+ 2·多环境的转发,对比数据差异
+ 3·自动校验服务之间的数据交互
+ ......



五、平台发展前景

  • 前沿的文档数据管理方式
  • 舒适的测试方法
  • 不只是测试平台!

有兴趣的童鞋一起讨论~
ps:机会合适就开源

共收到 6 条回复 时间 点赞

最近刚了解了契约测试 ,期待大佬开源哦

问几个问题啊:
1、契约文件谁来编写维护?
2、契约校验生产者的时候,调试数据有前置依赖的怎么处理?比如针对查询订单的契约,生产者需要自己调试,但是没有对应的订单数据。

小酷 回复

第一个问题:契约测试,契约是生产消费双方确立的,对于微服务场景下,谁有需求谁维护。
ps:尽量不要去改动契约(毕竟是先有契约才去开发)。
第二个问题:方法有很多种,如果 db 有数据的话,可以由动态函数实现,写一个查询数据库的动态函数,实现相应的单号替换;db 没得数据就 mock

拉讨论群的话可以加我一个。想法非常好,但是对于公司的流程把控有很高的要求,任何一方的不专业,都可能导致契约的频繁变更。我们以前也是推过 BDD 模式,发现不行

收藏了备用,一时半会看不明白😂

2 年前基于 Spring Cloud Contract 尝试过做契约测试,发现收效不大,当时出发点是尽早发现上下游契约不一致问题,但实际是有些细节还是得联调才能确认,光靠 mock 数据作用不大。
而基础的入参、出参、是否必填、值是否在可选值范围内之类的,开发把契约调用都封装成 rpc 调用后这类都不会有问题(强类型语言本身编译器就会强校验值类型这类信息)。

代理和路由这个是个不错的扩展,可以在不侵入应用的情况下控制应用间通讯。期待后续楼主分享实际落地相关的经验。

需要 登录 后方可回复, 如果你还没有账号请点击这里 注册