QTest大会Qunit新标签-你值得拥有
Posted Qunar技术沙龙
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了QTest大会Qunit新标签-你值得拥有相关的知识,希望对你有一定的参考价值。
王佳林
2016年加入去哪儿网大家庭,目前是金融事业部支付中心测试工程师,负责支付交易系统测试,优化去哪儿网原有测试框架Qunit。
一、背景简述
Qunit是去哪儿网自动化接口测试的框架,它帮助我们将case以xml的格式保存,在回归的时候重新运行原来的case,在日常繁杂的工作中减少了需要重复测试的工作。然而,项目迭代的速度很快,case量日积月累,因此希望有一种更简单的方式去写自动化,同时方便维护自动化case。
二、原理介绍
编写自动化qunit case一般分为三个步骤,分别是条件数据的生成、请求测试的服务以及校验接口返回的结果。而新标签的具体的优化思路如下:
(1)部署r-tag(线上代码),第一遍运行case(如图1左侧步骤),在条件数据准备阶段,通过请求服务来准备复杂数据,此时对数据库的影响录制,接着正常请求测试接口,并且记录接口返回结果于record.xml文件中;
(2)第二次运行case(如图1左侧步骤),准备数据阶段,不再请求准备数据的服务,而是将之前录制的数据恢复到数据库中,继续请求测试接口,将请求的结果与第一次的结果对比得到两次不一样的字段,将不一样的字段写在ignore.xml文件中(即每次请求接口返回不一致的字段,例如时间戳等);
(3)最后一次部署需要测试上线代码(如图1右侧步骤),请求服务,将接口返回的结果除去不一样的字段(ignore.xml文件),剩下的字段与记录下来的文件对比,一致就通过,不一致就不通过。
△ 图1 整体设计思路图
三、新标签介绍
△ 图2 新标签介绍
1.开关dataMode
开关dataMode 在qunit.properties 中(qunit Case工程的配置文件)。
generate 是调试模式,在写case和更新case时使用;代表case会运行两次,第一次记录请求结果,第二次记录两次请求的区别字段,存储在 dataset/auto_record_runtime/casssuitId/caseId/目录下,分别是record.xml文件和ignore.xml文件。
assert是断言模式,在case写好后使用;case会运行一次,结果除去ignore中的字段再和record .xml的内容比较,一样则通过,不一样则失败。
2.dataHolder标签—优化复杂数据的准备
(1)实现初衷:
1) 因为通过调用服务的方式生成准备数据会比直接生成数据生成更准确的数据,直接使用 sql准备数据,如果数据库列新增,需要重新改编原有case,而调用服务生成的数据就比较简单,重新录制即可;
2)在测试阶段不再依赖条件数据准备的服务。
(2)实现思路
当“dataMode”开关为generate时,
a.第一次执行case时,直接请求服务,并且将服务的对db的影响录制到dataHolder_n_Record.xml(n={1,2,3...},代表一个case中第n个dataHolder录制的文件);
b.第二次执行case时,不再请求准备数据的服务,而是将数据直接插入数据库中,以减少对准备数据服务的依赖。
当“dataMode”开关为assert时,同dataMode=generate时,第二次运行case。
Eg:
3.dataAssert标签—json断言的自动生成
(1)实现初衷
测试接口返回json结果的基线自动生成,实现简单维护case目标。
(2)实现思路
当“dataMode”开关为generate时,
a.第一次执行case时,将上一个command返回的response保存在本地文件中,程序默认的文件名为dataAssert_n_Recode.xml(n={1,2,3...},代表一个case中第n个dataHolder录制的文件);
b. 第二次执行case时,将上一个command返回的response与其第一次执行记录的结果进行比对,将有差异的字段,写到dataAssert_n_Ignore.xml文件;
当“dataMode”开关为assert时,读取dataAssert_n_Ignore.xml配置,dataAssert_n_Ignore.xml中的属性为不需要断言的属性。将command的response返回参数,去除dataAssert_n_Ignore.xml中的字段,剩下的字段与dataAssert_n_Recode.xml中记录的一致则通过,不一致就报错。
Eg:
4.dbAssert标签-db断言的自动生成
(1)实现初衷
测试接口对数据库影响的基线自动生成。
(2)实现思路
当“dataMode”开关为generate时 ,
a.第一次执行case时,将case中涉及到测试服务改动的表,录制下来按照DB名称分为多个文件保存,保存到本地文件,默认的文件名为dbAssert_n_Recode.xml(n={1,2,3...},代表一个case中第n个dbAssert标签录制的文件);
b. 第二次执行case时,再次读取数据库中指定的数据表的数据,并将该数据和上一步中生成的record结果文件进行比较,将比较结果中的不同的表和字段记录于本地文件,文件名为dbAssert_n_Ignore.xml.
当“dataMode”开关为assert时,读取dbAssert_n_Ignore.xml配置,将测试case中影响到的表,去除dbAssert_n_Ignore.xml中的列,剩下的字段与dbAssert_n_Recode.xml中记录的一致则通过,不一致就报错。
Eg:
四、使用方法
将自动化引用的qunit-core jar包升级为1.1.1-snapshot或以上;
qunit.properties 中加开关dataMode;
eg:dataMode =generate 或者 dataMode =assert
qunit.properties 中 jdbc.url 加上 &zeroDateTimeBehavior=round
(为了解决表数据为null的时候导出xml报错的问题)
开启DB的binlog设置,推荐的设置如下:
//修改my.cnf如下设置:#binlog开关
log_bin = <binlog路径>
expire_logs_days = 1
binlog_do_db = <目标数据库名>
binlog_format = ROW
五、结束语
我们的日常工作非常繁忙,我们认真把控着上线的代码质量,给用户最好的体验。然而,日常繁忙地工作的我们依旧乐于改变,希望新的Qunit标签帮我们用更少的时间覆盖更多的测试点,case的维护也变得更简单。
欢迎留言交流或投稿,和我们一起分享知识。
Qunar技术沙龙
以上是关于QTest大会Qunit新标签-你值得拥有的主要内容,如果未能解决你的问题,请参考以下文章