前面介绍了用postman newman做接口自动化,其实这个工具不太适合做大型的自动化测试,主要是不太方便扩展和维护。 最灵活的当然是用python来写,可是python写起来比较需要时间。 有没有一种介于这两者之间的。 我认为是有的,我觉得用jmeter来做自动化完全胜任。 它可以用各种断言,各种参数化,各种条件机制。
首先我用fiddler连接手机,设置代理,用fiddler来录制mobile接口,为啥不直接用jmeter来录制,网上搜的都说可以录制,但是用的时候,发现已经不支持手机了。以前是支持的,我还用手机录制过。
当fiddler 录制完成,可以过滤掉干扰的请求,然后Click on File > Export Sessions > All Sessions > HTTP Archive 1.2.
fiddler 过滤
.js .png .gif .css .html .ico .jpg
jmeter 过滤
.*.(bmp|css|js|gif|icov|jpeg|png|swf|woff|woff2|htm|html).*
现在关键的一步就是要将fiddler的录制文件,转换成jmeter文件了。网上都说用fiddler插件,我尝试过,发现导入到jmeter里面会报错。
Covert HAR File to .jmx File With help of Blazemeter jmx converter. 后面发现一个好网站,可以直接转换。 http://converter.blazemeter.com
转换完了以后,就可以导入到jmeter里面了。为什么用录制,因为手工添加的话,比较费时间,你也可以一个一个添加。 成功导入以后,发现它默认加了好多manager, 每个请求都有一个http header manager,以及uniform random Timer, ,以及每个请求的名字都加了host, 可以用脚本,或者手工批量删除。 然后自己加manager.
能加上的都加上去。 Header manager, 用一个全局的,可以定义请求头,例如这边是:“content-type: Application/json” User defined manager, 可以自定义全局的参数,如: host等,这样就切环境就很方便了。
Request Defaults, 就是请求的样本,只要填一个,后面所有的请求都是这个模式,比如host, schema等
cookie manager, 作用就不多说了,就是传cookie值的,有了它,你就不用操心cookie了。 cookie, session的提取
需要在第一个请求后,添加“正则表达式提取器”, 提取token,session, 作为参数,传给后面的接口。 当然,如果想看参数是否正确,可以用查看结果数来提取,
用debug sampler来打印出来。 一般情况下,都可以用“.*?”提取得到。 然后将文件里面所有相关的地方都替换掉。类似:"${variable}"
然后可以每个接口加上Response Assertion来判断接口是否正确返回:
可以设置几个错误的值,跑一下看看。
如果想提取json作为参数传递,可以用json extractor
JSON提取器说明:
Apply to:应用范围
Names of created variables :接收值的变量名,自定义,多个变量用分号分隔
JSON Path expression:json path表达式,也是用分号分隔
Match No.(0 for Random):0表示随机;n取第几个匹配值;-1匹配所有。若只要获取到匹配的第一个值,则填写1
Compute concatenation var(suffix_ALL):如果找到许多结果,则插件将使用' , '分隔符将它们连接起来,并将其存储在名为<variable name> _ALL的var中
Default Values:缺省值,匹配不到值的时候取该值,可写error。
这样一个简单的接口测试框架差不多就有雏形了。 这个还不够,我只检查了接口的状态,万一它返回的值是错的呢?所以要加一些字段校验。 右键点开Add,Assertions,就可以看到加各种assertion. 这里以json Assersion为例
当然我们获取json assertion的时候,也可以像前面正则一样,在result tree里面测试一下。 然后加一个Assertion Result,运行一下就可以知道你的assertion起作用了没有。Jmeter也可以自由的编程,用的是java, 可以加一个BeanShell Assertion来实现
这样就能自由的准备数据,或者状态。 好了,if 和for, 以及其他的参数化,就不在这里讲了。 做成这样,基本上满足要求,还不需要耗费什么时间,比写python快多了。
一个环境,或者一种业务搞定以后,剩下来的事情就简单了。可以多录制几分,然后写个python,根据不同的场景,准备不同的数据和host,然后集成到jenkins上,可以daily run, 这样就省事很多。