Quickfox 自动化接口测试系统

PHP
尔冬 · May 28, 2020 · 1818 次阅读 · 2 条评论

QuickFox

接口自动化测试系统(Automated Api Testing System)

演示地址:www.quickfox.cn

登录账号:admin/admin

项目地址:https://github.com/hanviseas/QuickFox

概述
QuickFox 是用于在线对 HTTP 接口进行测试、管理、自动化回归的开源网页系统。原先是为满足公司内部接口监控需要而开发的平台,而后在推广接口测试的过程中不断完善,于15年作为开源工具发布,原名 LazyBug。在随后几年里,收到许多同行的反馈,对原系统几乎完全进行了重写,更名 QuickFox,希望它能在团队规模化的接口测试管理上,产生较大的效率提升。

QuickFox 在功能设计上部分参照了 PostMan,JMeter 等较流行的开源工具,支持在线接口调试,同时增加了多人协作和自动化回归的能力,以满足团队化管理的需要。此外,系统本身的大部分能力也提供了开放接口,可以方便地进行持续集成,或与其他系统进行对接。目前,该系统已在作者所在团队稳定运行三年多,支撑上千个用例的自动化回归测试。

技术团队的接口自动化回归测试,是通过编写代码框架来完成,还是设计可视化的系统,各有其优缺点。可视化的接口测试管理在近年来逐渐得到重视,也出现了多个商业化产品,其在便捷、低门槛,维护成本上具备一定的优势,相应在灵活性上也会有一些损失。哪种方案最适合自己,需要根据所在团队的人员情况、技术框架、需求目的等多个因素综合判断。

安装
QuickFox 是基于 PHP + MySQL 开发的系统,因此首先需要具备一个基本的运行环境。可以参考的方案有:Apache + PHP + MySQL,或 Nginx + Fastcgi + PHP + MySQL。推荐使用 XAMPP 套装,可以一次性部署全套服务。注意 PHP 需要使用 5.6 以上版本,MySQL Server 需要使用 5.6 以上版本。

基本环境安装完成后,将 QuickFox 解压至站点的根目录(不需要 QuickFox 目录本身,即 index.php 位于根目录下)。而后在 MySQL 中创建名为 quickfox 的数据库,并导入根目录下 quickfox.sql 文件,生成系统需要的数据表。最后,再将 /tmp 目录设为 777 权限(非 Windows 系统),至此安装工作全部完成。

在开始之前,需要进行少量配置工作,访问 {站点域名}/index.php/config ,根据自己的情况输入域名(用于邮件通知中的访问链接)和数据库连接配置并更新。为了安全考虑,如果之后不再需要这个配置页,可以将 config/white.php 文件移除或改名,该页面即失去效用。如果因为一些未知原因导致配置未生效,也可以直接进入 config 目录,修改 system.php 和 database.php 两个文件完成配置。

现在,访问你的站点域名,正常情况下可以看到登录页面,点击下方的系统环境检查,确认各项配置是否正常。PHP-Curl 扩展的支持是必须的,大部分非编译安装的情况下都提供了该模块,在 php.ini 文件里去掉模块导入语句之前的注释即可。PHP-Sockets 目前暂未使用,可以不用理会。

基本使用
站点默认进入“开始/新的测试“页面,在此即可进行在线接口测试,输入 URL、请求头、请求参数,提交请求并查看返回结果,或将 JSON/XML 文本以格式化的方式展示。主要能力与常见的接口测试工具相似,因此这里不再多加讲解。稍有不同的是,在发送按钮的右侧,有个上传至云端的图标,可以将当前输入的接口信息保存,供自动化回归测试使用,或重新载入至当前页面做调试。

系统的整体设计逻辑为五级管理结构,空间->模块->接口->用例->步骤。

空间用于在较大层面上对测试进行隔离,相对比较独立,适用于划分不同的产品线或部门。而模块用于对空间下的测试进一步进行分类。空间和模块的操作,可以在“项目/项目空间”菜单项中找到,注意将鼠标移至空间(表格行)上方,即可出现空间的附属操作,以及空间下属模块的管理入口,系统中的其他操作均与此类似。

接口是测试的主体,承载了 URL 信息,用例用于补充关于此 URL 的具体内容,例如请求方法(GET/POST/PUT/DELETE),内容类型(TEXT/JSON/XML/...),请求头,请求参数。用例围绕接口(URL)提交不同的测试数据,以达到对接口进行正向、反向完整测试的目的。接口和用例的操作,可以在“项目/接口用例”菜单项中找到,点击接口(表格行)即可展开所属的用例列表。

步骤是 Quickfox 比较独特的一个设计,用于解决测试的上下文依赖。例如,我想要测试修改用户信息的接口,完整的闭环是:

1) 调用登录接口获取令牌。

2) 调用修改用户信息接口(主要测试目标)。

3) 检查接口返回。

4) 再次调用修改接口重置用户信息,完成数据清理。

以上步骤除了 2) 3) 是必要的步骤外,1) 4) 分别用来处理测试的前置依赖和后置清理工作。我们推荐的实践是,在一次测试中尽可能完成所有需要的工作,包括数据初始化和清理。如此设计可以给测试整体的稳定性、可维护性、并发执行带来巨大的优势。而通过步骤的灵活组合,Quickfox 可以处理非常复杂的测试场景。

关于步骤,还有一些更为复杂的用法,我们在下一节详细展开。

步骤进阶
步骤管理入口可以在用例的附属操作中找到,展开后的页面分为测试模式和编辑模式:测试模式用于在线执行测试,并即时查看测试结果;编辑模式用于添加、修改、删除步骤。Quickfox 的步骤分为四种:

1) 接口调用:调用其他已经写好的接口用例,注意不会执行该用例所属的全部步骤,只执行目标调用步骤。

2) 存储查询:查询数据库中的数据,支持 MySQL、SQL Server、Oracle 数据库,可以自行填写查询语句。

3) 检查点:检查前一个接口调用或存储查询步骤返回的内容,可以一次性设置多个检查点。

4) 延时器:人为设置等待时间,用于解决部分特殊的时效性问题。

系统中可以任意设置不同类型步骤的执行顺序,这会影响步骤的输入和输出。大体上说,前一个步骤的输出,是后一个步骤的输入,但是具体根据步骤类型会有所不同:接口调用和存储查询,即有输入又有输出;检查点只有输入,没有输出;延时器即无输入,也无输出。特别需要注意的是,检查点确认的是上一个拥有输出的步骤的返回值,因此连续多个检查点,检查的均是同一段返回。

大部分步骤允许设置过滤器,而过滤器又分为前置和后置。前置过滤器的作用是从输入中提取特定值,例如,步骤 1) 的返回值是 {"A": "Hello", "B": "World"},将步骤 2) 的前置过滤器设为 ${extractor:json:A;},则步骤 2) 得到的输入相当于字符串 "Hello";后置过滤器的作用是控制输出的内容,以同样的步骤输出为例,如果将步骤 1) 的后置过滤器设置为 ${extractor:json:A;},步骤 1) 的输出也相当于字符串 "Hello"。虽然二者的实际应用效果是一致的,但是需要留意这个区别,前者是控制输入(不改变上一步的输出),后者是控制输出。

所有可用的过滤器形式如下:

1) ${extractor:global}:提取全部文本。

2) ${extractor:json:a->b;}:提取 JSON 文本中 a->b 的值(b 是 a 的子级,例如 {"a":{"b": "x"}}),注意不要遗漏最后的分号。

3) ${extractor:xml:/a/b;}:提取 XML 文本中 /a/b 节点的值,"/a/b"可以替换成其他 XPATH 表达式,注意不要遗漏最后的分号。

4) ${extractor:regexp:e(x)p:M:N;}:提取第 M 个括号的第 N 次正则匹配,注意不要遗漏最后的分号。

最后一个过滤器可能比较难理解,例如对返回值"Hello World"应用过滤器 ${extractor:regexp:o(.):1:2;},则匹配的是字符"r",因为正则表达式的含义是跟随在 o 之后的任意字符,而过滤器的含义是第二次符合条件的匹配。

另个一个难以理解的是 ${extractor:global},为什么会需要这样一个看似无用的过滤器?因为这些过滤器表达式,不单可用于前、后置过滤器中,也可以填写在接口 URL、用例参数和请求头、存储查询语句中,用于替换指定文本。例如前置提到的四步闭环,步骤 2) 的 URL 可以写为 http://www.xxx.com/user/3/?token= ${extractor:json:user->token;} ,如此便可在请求中带入上一步得到的令牌。

未完待续 >>

帮助支持:QQ 32944123

评论列表
liuyajie 发表于 July 15, 2020

源码或者编译的包呢