循环取数据,数据可重复使用
模拟3用户登录,有5个账号供测试使用,迭代过程中从第1个数据开始取值,当第5个数据取出后,再从第1个数据开始取值
借助python 队列queue来实现数据的循环取值
queue是python3的标准库,不需要install
queue模块包含三种类型的队列
queue.Queue(maxsize=0)
FIFO队列,First in First Out,即先进先出
maxsize是一个整数,用于设置队列的上限,当达到设置的大小后,写入队列将被阻塞,直到队列中的数据被消耗
如果maxsize小于或等于零,则队列大小无限制
Queue.LifoQueue(maxsize=0)
LIFO 队列,Last in First Out,后进先出
Queue.PriorityQueue(maxsize=0)
优先级队列,存入数据时候加入一个优先级,取数据的时候优先级最高的先取出
以用户登录为例,将数据放入队列中,先进先出,队列大小无限制,数据取出后再添加至队列,负载测试过程中循环使用
代码示例
# coding=utf-8
''' Created on 2019-11-08
author: ali
'''
import os
import queue
from locust import HttpLocust, task, TaskSet
class userTaskSet(TaskSet):
# 定义请求头
webheaders = {
"Accept-Encoding": "gzip, deflate",
"User-Agent": "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.77 Safari/537.36",
"Content-Type": "application/x-www-form-urlencoded;charset=UTF-8",
"Accept": "application/json, text/javascript, */*; q=0.01",
"Connection": "Keep-Alive",
}
# 用户登录
@task(1)
def userLogin(self):
# 请求url
test_url = "/zentao/user-login.json"
# 用户名循环取值
try:
username = self.locust.queueData.get() # 获取队列中的数据
self.locust.queueData.put_nowait(username) # 将取出的数据再添加至队列
except queue.Empty: # 队列为空,直接退出
print("no user data exist")
exit(0)
test_data = {
"account":username,
"password": "q1w2e3r4t5y6", # 所有用户密码相同
"referer":"/zentao/",
"passwordStrength":1
}
with self.client.post(test_url, test_data, headers=self.webheaders, catch_response=True) as response:
try:
json_res = response.json()
# 断言
if json_res["status"] == 'success':
print("用户%s" % username + " login success!")
response.success()
else:
response.failure("用户%s" % username + " login failed!")
print(json_res)
except Exception as e:
response.failure(e)
print(e)
class websiteUser(HttpLocust):
task_set = userTaskSet
queueData = queue.Queue() # 初始化队列, 先进先出
userdatas = ["ali001", "ali002", "ali003", "ali004", "ali005"]
for user in userdatas:
queueData.put_nowait(user) # 将测试数据添加至队列
host = 'http://127.0.0.1:8088'
min_wait = 1000 # 单位为毫秒
max_wait = 2000 # 单位为毫秒
if __name__ == "__main__":
os.system("locust -f zentaoLogin.py --host=http://127.0.0.1:8088")
测试结果
控制台打印用户登录信息,可以看到用户名是按顺序循环取值的