郑希文
加入去哪儿前,就职于百度质量部,负责个性化推荐相关系统的质量保证和技术改进工作。
2014年4月加入去哪儿,目前在平台事业部——系统质量保证组工作,负责公司商业产品相关服务质量保证,始终致力于工程效率和自动化测试等方向的工作。
一、问题背景
之前,QA 使用公司通用的接口自动化框架编写自动化 case。在满足基本需求的同时,也遇到了下面的问题:
数据方面:QA手动准备case相关数据成本高,尤其准备数据库数据耗时多,具体包括preparedata和assertdata;同时,写case的时候还要考虑数据的备份和清理
环境方面:由于QA写case的过程一般和项目测试分离,导致需要额外为自动化准备环境
编写成本方面:目前基于xml文件的case组织形式为case编写带来了成本
基于上述问题,我们做了下面的思考。左侧是我们在手工测试接口的时候能拿到的信息,右侧是接口自动化 case 的基本要素。显然,case 的要素在手工测试阶段都能找到自己的映射:如接口的入参和返回值、数据库数据等。于是我们就想,是否可以通过手工测试中拿到的信息通过一定的处理和转换直接生成自动化 case?基于这样的思考,开发了全新的接口自动化测试平台——smart。
二、功能介绍
smart 提供了一种全新的写自动化 case 的方式:基于对手工测试行为和数据的录制自动生成自动化 case。具体包括下面三个步骤:
手工测试:用户可以在 smart 上完成手工测试接口流程,功能类似 postman
生成自动化 case:在确认被测接口测试通过后,复用当前环境和数据,自动生成自动化 case
执行自动化 case:使用该自动化case可以在项目内和后续迭代过程中进行回归测试 下图是 smart 的整体功能框图:
三、功能演示
1,首先,需要将被测接口维护到 smart 提供的接口列表页:
2,smart 提供了 “接口调试”的功能,即通过手动调用的方式对接口进行测试:
3,手工测试通过后,我们需要为这个接口生成自动化 case。在输入接口入参的基础上,需要录入数据库基本信息,并点击 “开始录制”按钮:
smart 会对被测接口调用和数据库数据进行录制,并生成自动化 case,页面会跳转到 case 详情页,具体如下:
至此,我们就基于对被测接口的录制生成了自动化 case。smart 提供了 case 执行的功能,方便用户对 case 的正确性进行验证;为了和现有自动化框架结合,smart 还提供了 case 导出功能。
四、实现方案
下图是 smart 的整体方案图。重点是 “接口录制模块”和 “数据库录制模块”,具体功能包括:
接口录制模块:输入接口入参和被测对象,调用被测环境中的接口得到接口的response,进而生成自动化 case 的输入数据、response 的 assert。
数据库录制模块:输入数据库基本信息,对被测环境数据库进行监听,基于监听得到的数据,生成自动化 case 数据库相关要素,具体包括:数据库的备份和清理操作、数据库的 prepare_data 和 assert_data。
下面,重点对 “数据库录制模块”的实现方案进行介绍:smart 是基于对 mysql 的 binlog 和 generallog 的录制,自动生成数据库相关数据。我们先了解一下 mysql 的两种非常重要的 log:
binlog:记录了mysql变更前后的数据(包括insert、update、delete)
generallog:记录了在mysql数据库上执行的所有原始sql语句(包括select、insert、update、delete)
smart 正是基于对上述两种 log 的监听和分析,生成 case 中数据库的相关数据,具体如下表所示:
在实现数据库方案的时候,对若干难点问题给出了解决方案,具体如下:
数据库录制准确性问题:如下图所示,我们本来要录制的是“用户A——服务A——数据库”这个调用链上数据库的数据,但是与此同时可能有用户C也在访问服务A、另一个服务B也在访问数据库,这就导致 smart 可能会录制到一些“垃圾数据”。针对这个问题,smart 引入了 qtracer。qtracer是去哪儿开发维护的一套分布式链路追踪系统。smart 在调用入口的地方打开 qtracer 的开关,这样就可以拿到完整链路的 qtraceId;根据这个 qtraceId 调用 qtracer 的接口,可以拿到这条链路上的相关信息(包括服务 ip、数据库 sql 等),进而可以将前面的“垃圾数据”过滤掉。
如何拿到一个sql语句涉及的表集合:在生成数据库数据备份和清理操作的时候,需要拿到一个sql语句的表集合。这是一件不大容易的事情,尤其当这个sql语句比较复杂的时候。这里smart引入了inception来解决这个问题。inception是公司DBA开发的一个开源mysql自动运维工具,我们使用了其中的一个功能——sql语法树解析。如下图所示,smart拿到原始sql语句后,先通过inception解析成一颗sql语法树,然后smart对其进行二次解析,即可得到sql语句对应的表的集合。备注:inception的官方文档:http://mysql-inception.github.io/inception-document/,开源GitHub地址:https://github.com/mysql-inception/inception.git。
五、总结
smart 平台已经于 2017 年 9 月正式发布。目前支持的场景包括:http 接口、dubbo 接口和 mysql 数据库。能够 “分钟级”生成接口自动化 case,极大节省了写 case 的时间。工具在公司多个部门开始推广使用,取得良好的反馈。基于目前录制的方向,未来 smart 会在场景扩展、功能完善和易用性等方面持续不断的进行优化。
需要强调的是,目前 smart 在 “case 管理”方面还不够强大。我们的想法是,随着大家的接入和使用,结合收集到的需求和反馈,逐步完善 case 管理功能,让 smart 成为更加完整、闭环的自动化测试生态系统。
领取专属 10元无门槛券
私享最新 技术干货