简易版的接口流量回放工具Parrot

写在前面

软件测试在很多时候都是流量回放的模式,这里的“流量回放”的定义比较宽泛,通常包含如下三个步骤:

  • 录制:定义/获取执行步骤和预期结果
  • 回放:执行预定步骤,收集实际结果
  • 验证:对比预期结果和实际结果,判定测试结果

软件测试的一般定义:按照既定的步骤,运行系统或应用程序,得到实际结果,和预期结果进行比较。

本文主要介绍http接口的流量回放方式,目的是取代常规的接口自动化,暂无法应用于性能测试。

项目开源地址:https://github.com/idle-man/Parrot (代码比较粗糙,欢迎指教)



步骤一:录制

前面有提到,录制主要是定义/获取执行步骤和预期结果,就接口测试而言,需要拿到的信息有:

  • 被调用的接口及传参
  • 接口间的调用顺序及依赖关系
  • 各接口的预期响应

综合业界常见的测试方式和已有的流量回放手段,通常有以下几种录制方式:

  • 生产环境引流:采用TCPDump、TCPCopy或网关/路由层进行转发;该方式需要一定的部署权限
  • 离线日志解析:基于标准化的日志解析得到完整信息;该方式对日志规范化有较高的统一的要求
  • 测试工具抓包:如Fiddler、Charles,测试及回归过程中均可积累;可做标准化解析,数据量级相对较小
  • 接口文档定义:基于严格的标准化接口文档;该方式条件相对苛刻很多,且接口文档需要有可执行的示例

本文所选取的方式为:基于测试工具抓包,测试数据真实、由专业的测试人员定制、容易获取和更新(替换)、是常规的自动化回归的思路

需要解决的问题:

  • 批量抓包导出的请求list中,可能包含部分不需要被回放的请求,如何自动剔除
  • Fiddler导出的txt和Charles导出的trace,文本格式标准化但有差异,需要分别解析

Parrot的解法:拿来抓包(Fiddler .txt or Charles .trace),写个配置(yaml record部分),执行recorder.py搞定

  • 配置支持select、ignore模式,可根据host(全部匹配)、url(部分匹配)进行筛选,默认录制全部
  • parser会根据传入文件的后缀自动判定为Fiddler or Charles抓包,分别进行解析,生成标准化的ini文件


步骤二:回放

有了录制阶段拿到的标准化数据后,对于单个请求的回放不难做,本项目主要是简单封装了python requests模块来实现。

做过实际项目接口自动化的同学,通常面临的场景远不是单独按照既定参数调用一个接口那么简单,一般都会面临如下问题:

  • 部分参数需要实时变动,例如请求传参中可能包含“日期”,抓包拿到的日期等回放的时候可能就失效了
  • 部分参数需要基于依赖关系获取,例如A接口Response中的某个key需要作为B接口的实时传参,单独使用抓包的数据是无效的
  • 部分接口需要拿到特定结果后才能继续执行,抓包时可能A接口较快拿到了数据,回放时可能就不是这样了,例如刷票行为
  • 多个接口的调用顺序需要保证,这个相对容易处理,因为抓包中基本都会包含各接口的调用时间,Parrot可按照该次序和当时的时间间隔执行

Parrot的解法:写个配置(yaml replay部分),执行replayer.py搞定

  • 配置支持replace模式,可进行纯静态替换(example => t.example),可进行动态替换(2019/05/01 => {{Today()}}
  • 依赖关系可以通过配置中的store和replace模式配合,例如:store配置apiA::resp::sign(执行到apiA接口时会自动将该值计入内存),replace配置apiB::{sign} => {get::resp::sign}(执行apiB接口之前会实时替换该传参)
  • 配置中的wait模式,可使用time方式来配置apiA: 1(执行完apiA接口后,额外等待1秒),也可使用rule方式配置apiA::data.code: ‘==200‘(执行完apiA接口检查Response是否符合,不符合则重复执行A,直到符合或超出最大重试次数-global_conf中定义)
  • 一般项目的很多接口有前后执行顺序要求或依赖关系,Parrot默认的回放方式为串行且遵循录制的时间间隔;若无依赖关系,想并发执行的话,可自行修改config.py中的global_conf

Parrot回放完成后,同样会生成标准化的ini数据文件,供后续的对比验证使用。



步骤三:验证

目前大不多数项目http接口的Response采用的都是json格式,Parrot的验证逻辑即是对录制的Response和回放执行拿到的Response进行json diff。

如果只是做全量的文本比较,直接采用两个字符串进行相等匹配即可,但实际项目中极少如此,一般会面临如下问题:

  • Response中存在部分不需要对比且经常变化的key,例如:timestamp、token、sign等,需要在对比时进行剔除
  • 部分接口的Response可能只需要比对关键的一些key就够了,例如:status、code,其余信息无需关注
  • 部分接口的Response的某些key的值通过对比不足以验证,希望进行额外的规则验证,例如:某值>0,某list非空
  • 部分接口的Response的某些key的值是list或字典格式,作为通用工具在未知层级的情况下,如何写个配置就能对比了

Parrot的解法:写个配置(yaml check部分),执行checker.py搞定

  • 配置支持select、ignore模式,可选定/忽略Response中的部分key,可针对特定接口(部分匹配)或默认的全部,多层级写法:data.key1、data.key1.key2[0].key3
  • 配置支持rule模式,可配置验证规则,可针对特定接口(部分匹配)或默认的全部,例如:apiA::data.status: ‘==200‘、apiB::data.list: ‘!= []‘
  • 本项目的json diff的主要思路是,分别将录制的预期Response和回放的实际Response json分别解析为层级深度为1的键值对,如:data.key1.key2[0].key3 = 1,如此可方便使用者进行更好的配置

Parrot的对比验证会输出html report,其中可见如下信息:

  • 汇总信息,总条数、成功多少、失败多少
  • 每条请求的status(http状态码)对比结果,duration(请求耗时)对比结果,response(响应信息)对比结果,request的详情


以上

文字功底所限,可能尚有很多细节未描述清楚,欢迎留言交流;

Parrot项目已开源,代码粗糙,欢迎大神提改进建议。

最后,再次附一下地址:https://github.com/idle-man/Parrot

愿意的话,不妨给个Star~

原文地址:https://www.cnblogs.com/idleman/p/10881414.html

时间: 2024-08-05 04:48:15

简易版的接口流量回放工具Parrot的相关文章

MVC5+EF6 简易版CMS(非接口) 第三章:数据存储和业务处理

目录 简易版CMS后台管理系统开发流程 MVC5+EF6 简易版CMS(非接口) 第一章:新建项目 MVC5+EF6 简易版CMS(非接口) 第二章:建数据模型 MVC5+EF6 简易版CMS(非接口) 第三章:数据存储和业务处理 MVC5+EF6 简易版CMS(非接口) 第四章:使用业务层方法,以及关联表解决方案 先来了解下各项的引用关系 FytCms.DALMSSQL=>Domain.Entity.EntityFramework BusinessLogic.Server=>FytCms.D

MVC5+EF6 简易版CMS(非接口) 第四章:使用业务层方法,以及关联表解决方案

目录 简易版CMS后台管理系统开发流程 MVC5+EF6 简易版CMS(非接口) 第一章:新建项目 MVC5+EF6 简易版CMS(非接口) 第二章:建数据模型 MVC5+EF6 简易版CMS(非接口) 第三章:数据存储和业务处理 MVC5+EF6 简易版CMS(非接口) 第四章:使用业务层方法,以及关联表解决方案 上一章介绍了,如何建数据层和业务,以及各层之间的引用过关系 这章主要讲解怎么使用业务层的方法. 以及普遍遇到的EF关联查询的问题解决方案 1.在FytMsys.Web文件夹下建Fyt

C#调用OpenCV开发简易版美图工具

前言 在C#调用OpenCV其实非常简单,因为C#中有很多OPenCV的开源类库. 本文主要介绍在WPF项目中使用OpenCVSharp3-AnyCPU开源类库处理图片,下面我们先来做开发前的准备工作. 准备工作 首先,我们先创建一个WPF项目. 然后,在Nuget上搜索OpenCVSharp,如下图: 接着,我们选择OpenCVSharp3-AnyCPU选项进行安装 . 安装了OpenCVSharp3-AnyCPU后,我们的项目会自动引入4个类库,如下图: 到这里,我们的准备工作就完成了,非常

使用nodeJS创建API接口,连接mysql数据库(新手向简易版)

博主在学习安卓课程做期末程序的时候就一直想自己做API了,结果网上的教程感觉都太杂,很多都文不对题,找不到一个明确的思路,结果就只能放弃改用jdbc实现数据库交互,现在学了前端,又接触了一点nodeJS之后,才终于有了思路,最近也成功给自己放在服务器上的网站部署了API.现在就来分享一下,也顺便给自己留个备份. ps:只是自己突然想到的做法,而且个人觉得真的是简易版,可能不标准,但亲测能用. 一.前期准备 首先声明:不懂也没关系,直接仿照代码,需要修改的地方我会用红色标注出来,不过mysql一定

Android学习之路——简易版微信为例(三)

最近好久没有更新博文,一则是因为公司最近比较忙,另外自己在Android学习过程和简易版微信的开发过程中碰到了一些绊脚石,所以最近一直在学习充电中.下面来列举一下自己所走过的弯路: (1)本来打算前端(即客户端)和后端(即服务端)都由自己实现,后来发现服务端已经有成熟的程序可以使用,如基于XMPP协议的OpenFire服务器程序:客户端也已经有成熟的框架供我们使用,如Smack,同样基于XMPP协议.这一系列笔记式文章主要是记录自己学习Android开发的过程,为突出重点(Android的学习)

Android简易版天气预报app的实现(改进版)

最近总是有人来和我说我以前写的一个小app无法正常获取数据~Android简易版天气预报app 今天就又运行了下来查找问题,发现或许是接口有限制吧,不能在多台手机使用同个apikey 然后,发现了我写的代码实在乱七八糟,界面也实在不好看,就又重写了一遍,小小地修改了一遍,开发环境改为了Android Studio 最终效果图如下 工程图如下 一.获取地区信息 做这么一个天气预报app,首先就要获取到国内地区列表 (在我的另一篇博客有介绍:向任意网址发起数据请求) 中国天气网开放有天气预报接口,访

django框架简介及自定义简易版框架

web应用与web框架本质 概念 什么是web应用程序呢? Web应用程序就一种可以通过互联网来访问资源的应用程序, 用户可以只需要用一个浏览器而不需要安装其他程序就可以访问自己需要的资源. 应用软件通常有两种架构: B/S架构和传统的C/S架构. C/S架构是客户端/服务端程序, 用户需要访问服务器需要下载单独的客户端, 而B/S则是浏览器/服务端应用程序, 用户只需要选择兼容的合适的浏览器, 如IE, Chrome, Firefox等等来运行即可. Web应用程序通常就是属于B/S架构 ,这

Android学习之路——简易版微信为例(二)

1 概述 从这篇博文开始,正式进入简易版微信的开发.深入学习前,想谈谈个人对Android程序开发一些理解,不一定正确,只是自己的一点想法.Android程序开发不像我们在大学时候写C控制台程序那样,需要从main开始写代码逻辑,大部分逻辑控制代码都由自己来实现.事实上,Android已经为我们提供了一个程序运行的框架,我们只需要往框架中填入我们所需的内容即可,这里的内容主要是:四大组件——Activity.Service.ContentProvider.BroadCast.在这四大组件中,可以

网络实时流量监测工具iftop

什么是iftop     iftop是一个免费的网卡实时流量监测工具,类似有top命令,不仅可以监控特定网卡的实时流量,端口连接信息等,还可以显示本机网络流量的情况,非常适用于监控代理服务器或者路由器的网络流量. 安装iftop  1. 下载:     [[email protected] ]#wget  http://www.ex-parrot.com/pdw/iftop/download/iftop-1.0pre4.tar.gz  2. 安装必要程序     [[email protecte