目录
前言:
随着互联网的高速发展,网站性能测试变得越来越重要。网站性能测试可以帮助我们了解网站在不同负载和并发条件下的表现,从而优化网站的性能和用户体验。
测试需求
验证在相同的服务器端的情况下,使用 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 端口。
LR 中的测试脚本
在另外的一个 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:
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 中的执行方法,直接放到场景中,执行即可。
locust 中的测试脚本
在另外的 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
具体的参数可以查看官方文档。
其中:
- 主类继承 HttpLocust,用于测试 http 协议的系统;
- min_wait 和 max_wait 用于设置执行 task 过程中的等待时间,相当于 LR 中 Pacing 的设置,这里都设置为 0;
- task 装饰器类似于 LR 中的事务,可以做嵌套;
- weight 相当于权重,如 2 个事务是 1:1,保持比例一致就行;
- 这里写了 2 个事务,分别为 get 和 post;对 response 的判断通过 python 的语法实现,类似于 LR 中的检查点。
执行方法,通过命令行启动:
如下图:
LR 中的测试过程和结果
测试过程:
直接设置并发用户数和加载方式,10 个用户并发,同时加载就可以了。
测试结果:
平均响应时间:
TPS:
事务:
Locust 中的测试过程和结果
测试过程:
使用浏览器打开http://127.0.0.1:8089
设置需要的并发用户数和用户加载策略。
这里设置相同的 10 用户并发,Hatch Rate 是每秒启动多少用户的意思。这里设置为 10,就是同时启动 10 个了。注意,这里不好设置执行多久,和 LR 不一样。(可以不启动浏览器,直接在启动参数中设置并发用户数,执行多少个事务后结束,具体用-h 可以看到帮助)
启动执行后:
其中,Average 中为平均响应时间等测试指标,最后一列的 reqs/sec 相当于 LR 中的 TPS。(这里 locust 把它叫做 rps),其他指标都比较好理解了。
最后的结果:
在 web 页面中可以下载原始的测试结果数据。
在停掉 python 命令后,在终端中也可以看到一些信息,最后的一行是百分之 X 的响应时间,表示百分之多少的交易在 XXX 响应时间内。
这里比 LR 中的要多点,包括了 50% 到 100% 的响应时间。
结果比较
在相同的服务器端环境,测试的结果值相似,没有多大的区别。
在设置交易比例的过程中,可以看到 get 和 post 交易的比例都存在差异。这个也无法避免(除非自己写脚本划分)。所以 tps 方面存在些差异。不过总体差距很小。
作为一位过来人也是希望大家少走一些弯路
在这里我给大家分享一些自动化测试前进之路的必须品,希望能对你带来帮助。
(软件测试相关资料,自动化测试相关资料,技术问题答疑等等)
相信能使你更好的进步!
点击下方小卡片