最近本身开发了一个小的接口,功能测完了,忽然想测下性能,原来作性能测试,我一直用的是HP的LoadRunner,前一段时间正好看过locust,想一想就用这个来测测性能吧。
因为对LR比较熟,正好作个对比,这样更利于对新东西的理解。html
locust 的官网:http://locust.io/python
也能够参考论坛里其余同窗的介绍:https://testerhome.com/topics/2888web
目前locust还只支持Python 2版本。shell
验证在相同的服务器端的状况下,使用LR和locust分别进行性能测试,在相同并发用户的状况下,验证平均响应时间,TPS值等性能测试指标的差别。
为了方便,使用http协议,一个get请求,一个post请求,交易比例为1:1。浏览器
为了简单易理解,用Python的bottle框架写了一个服务器端,2个交易,一个get,一个post请求,交易中加了2个不一样的sleep。
代码以下:服务器
#!/usr/bin/env python # -*- coding: utf-8 -*- __author__ = 'among,lifeng29@163.com' from bottle import * from time import sleep app = Bottle() @app.route('/transaction_1', method='GET') def tr1(): sleep(0.2) resp = dict() resp['status'] = 0 resp['value'] = 'xxx' return resp @app.route('/transaction_2', method='POST') def tr2(): parm1 = request.forms.get('parm1') parm2 = request.forms.get('parm2') sleep(0.5) resp = dict() resp['status'] = 0 resp['value'] = 'yyy' return resp run(app=app, server='cherrypy', host='0.0.0.0', port=7070, reloader=False, debug=False)
服务器端部署在一个单独的Windows的机器中,基于Python 3,启动后,监听7070端口。markdown
在另外的一个Windows机器中,使用LR 11,用的是http/html协议的脚本,主要代码以下:
用了2个action,用于划分交易比例。
action1:并发
Action1() { lr_start_transaction("get"); web_reg_find("Text=xxx", LAST); web_custom_request("Head", "URL=http://10.0.244.108:7070/transaction_1", "Method=GET", "Resource=0", "Referer=", LAST); lr_end_transaction("get", LR_AUTO); return 0; }
action2:app
Action2() { lr_start_transaction("post"); web_reg_find("Text=yyy", LAST); web_custom_request("Head", "URL=http://10.0.244.108:7070/transaction_2", "Method=POST", "Resource=0", "Referer=", "Body=parm1=123&parm2=abc", LAST); lr_end_transaction("post", LR_AUTO); return 0; }
使用1:1的比例设置2个transaction的执行比例:框架
LR中的执行方法,直接放到场景中,执行便可。
在另外的mac中,使用locust执行测试,所有经过代码实现。代码以下:
#!/usr/bin/env python # -*- coding: utf-8 -*- __author__ = 'among,lifeng29@163.com' from locust import * class mytest(TaskSet): @task(weight=1) def transaction_1(self): with self.client.get(name='get', url='/transaction_1', catch_response=True) as response: if 'xxx' in response.content: response.success() else: response.failure('error') @task(weight=1) def transaction_2(self): dt = { 'parm1': '123', 'parm2': 'abc' } with self.client.post(name='post', url='/transaction_2', data=dt, catch_response=True) as response: if 'yyy' in response.content: response.success() else: response.failure('error') class myrun(HttpLocust): task_set = mytest host = 'http://10.0.244.108:7070' min_wait = 0 max_wait = 0
具体的参数能够查看官方文档。
其中:
执行方法,经过命令行启动:
以下图:
测试过程:
直接设置并发用户数和加载方式,10个用户并发,同时加载就能够了。
测试结果:
平均响应时间:
TPS:
事务:
测试过程:
使用浏览器打开http://127.0.0.1:8089
启动执行后:
最后的结果:
在web页面中能够下载原始的测试结果数据。
在停掉python命令后,在终端中也能够看到一些信息,最后的一行是百分之X的响应时间,表示百分之多少的交易在XXX响应时间内。
这里比LR中的要多点,包括了50%到100%的响应时间。
在相同的服务器端环境,测试的结果值类似,没有多大的区别。
在设置交易比例的过程当中,能够看到get和post交易的比例都存在差别。这个也没法避免(除非本身写脚本划分)。因此tps方面存在些差别。不过整体差距很小。
性能测试,重点是考察并发用户数、响应时间、tps这类指标。
一直用的是LR,LR在一块儿概念上更易于理解,在有lr的基础上,在看其余的工具,就比较容易了。
locust也能够支持分布式执行(多执行机),用来简单测试这类http的接口,也算比较方便。
并且,locust所有基于Python脚本,扩展性不错,号称能够测试任何协议和系统。
最后,我仍是那句话,看什么事情,用什么工具最高效易用,用合适的工具作合适的事情便可。
欢迎你们讨论。