一、背景
最近测试汪小电APP,需要针对后端创建任务的接口进行压力测试。压力测试,大部分同学第一时间想到的就是Jmeter。Jmeter虽然可以为每个用户分配一个单独的线程,提高每个用户并发数,但是每个步骤的线程分配和基准测试需要大量资源,导致一台机器上模拟的用户数量非常有限。针对大规模用户请求的性能测试使用Jmeter显然很难达到测试要求,所以决定使用Locust来模拟大规模用户请求。
关于Locust基本用法的介绍可以参考公众号里面其他文章的介绍,本文主要写的是Locust参数化批量创建任务。
二、应用
1、场景设计
测试场景是所有并发虚拟用户共享同一份测试数据,并且保证虚拟用户使用的数据不重复。 例如,模拟1000用户并发创建任务并提交任务到后端,总共有10000个任务,每个任务要求任务内容不重复(通过不同的电话号码来区分),任务创建并提交到后端结束测试。
数据准备
虚拟用户数,可以在启动的时候设置,这里先准备需要用到的手机号。
# 生成测试手机号
Tel = 15616160000
Teldatas = [str(demo+i) for i in range(10000)]
将测试数据加到队列
import queue
# 添加到队列
Telqueue = queue.Queue()
for i in Teldatas:
Telqueue.put_nowait(i)
2、编写任务创建请求
locust里面请求是基于requests的,每个方法请求和requests差不多,请求参数、方法、响应对象和requests一样的使用。
# coding:utf-8
from locust import HttpLocust,TaskSet,task
import queue
import json
class TaskDemo(TaskSet):
@task(1)
def Request_Task(self):
try:
Tel = self.locust.telqueue.get()# 获取队列里的数据
print(tel)
except queue.Empty: # 队列取空后,直接退出
print("no data exist")
exit(0)
header = {"User-Agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.97 Safari/537.36",
"Appid":"15Dy8oGpZg25DldDip",
"Authorization":"Bearer eyJhbGciOiJkaXIiLC"
}
body =json.dumps({
"name":"wangxiaodian",
"time":"2019-12-20T00:00:00Z"
})
url = "/api/test"
response = self.client.post(url,data=body,headers = header)
assert response.status_code == 200
class websitUser(HttpLocust):
task_set = TaskDemo
min_wait = 3000 # 单位毫秒
max_wait = 6000
Teldatas = [str(15616160000+i) for i in range(10000)]
Telqueue = queue.Queue() # 添加到队列
for i in Teldatas:
Telqueue.put_nowait(i)
if __name__ == "__main__":
import os
os.system("locust -f demo.py --host=http://sogou" )
3、Locust启动
locust可以直接在命令行中启动
$ locust -f demo.py --host=http://test.sogou
-f 参数是指定运行的脚本
—host是指定运行服务的host地址
可以在命令后添加参数--master和--slave进行分布式测试
运行成功后,会成功返回服务启动的端口号,如果是在本机上搭建的locust,可以直接在浏览器中输入http://localhost:8089(默认端口)。
三、测试结果
本次测试共启动了8个slave。测试的结果展示如下。
四、总结
本期为大家简单的介绍了Locust-参数化批量创建任务的使用方法,针对性能或并发用户要求较大的测试场景,可以充分利用Locust的特点进行测试。