参数化——循环取值
循环取数据,数据可重复使用
模拟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")
测试结果
控制台打印用户登录信息,可以看到用户名是按顺序循环取值的