前言
比如我们要100个用户同时登录来测试系统的性能情况,相同的用户来登录肯定是不符合实际要求的,此时我们可以考虑用参数化
思路:用队列将有效用户生成出来put到对列中,在从队列中get出来,传给登录请求
Queue
Queue.Queue(maxsize=0)
Queue提供了一个基本的FIFO(先进先出)容器,使用方法很简单,maxsize是个整数,指明了队列中能存放的数据个数的上限。一旦达到上限,插入会导致阻塞,直到队列中的数据被消费掉。如果maxsize小于或者等于0,队列大小没有限制。
Queue创建的实例对象常用方法
queue.qsize():返回当前队列包含的消息数量
queue.empty():如果队列为空,返回True,反之False
queue.full():如果队列满了,返回True,反之False
queue.put(item,[block[,timeout]]:将item消息写入队列,block默认值为True
1)bolck使用默认值(True)
①没有设置timeout(单位秒),消息队列如果已经没有空间可写入,此时程序将被阻塞(停在写入状态),直到从消息队列腾出空间为止
②设置了timeout,则会等待timeout秒,若还没空间,则抛出“queue.full”异常
2)block值为False,消息队列如果没有空间可写入,则会立刻抛出“queue.Full”异常
queue.put_nowait(item):相当于queue.put(item,False)
queue.get([nlock[,timeout]]):获取队列中的一条消息,然后将其从队列中移除,block默认为True
1)bolck使用默认值(True)
①没有设置timeout(单位秒),消息队列如果为空,此时程序将被阻塞(停在读取状态),直到从消息队列读到信息为止
②设置了timeout,则会等待timeout秒,若还没读取到任何消息,则抛出“queue.Empty”异常
2)block值为False,消息队列如果为空,则会立刻抛出“queue.Empty”异常
queue.get_nowait():相当于queue.get(False)
代码
from locust import task,TaskSet,HttpLocust
import queue
import os
class MyTaskSet(TaskSet):
def on_start(self):
print("----- Test start -----")
def on_stop(self):
print("----- Test over -----")
@task
def login(self,pwd="b123456"):
self.headers = {
"Origin": "http://192.168.1.9:8080",
"User-Agent": "Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.110 Safari/537.36"
}
path = "/SSOAuth?action=login&code=undefined&gotoURL=http%3A%2F%2F192.168.1.9%3A8080%2Fportal%2Fgeoindex.do"
try:
user_data = self.locust.queue_data.get() # 从队列中取出user赋值给user_data
print(user_data)
except queue.Empty:
print("数据为空了...")
exit()
da = {"userAccount": user_data, "pwd": pwd}
data = {
"data": '%s' % da
}
self.client.post(path, headers=self.headers, data=data, verify=False)
class MyLocust(HttpLocust):
"""w01~w0100为有效用户名,密码为默认的b123456"""
task_set = MyTaskSet # 指向任务集合
host = "http://192.168.1.9:8080" # web项目的话这里要设置host属性,否则是报错的
queue_data = queue.Queue() # 实例化一个队列
for i in range(1,101):
user = "w0"+str(i)
print(user)
queue_data.put_nowait(user) # 把每一个user存到队列中
if __name__ == '__main__':
# os模块执行系统命令,相当于在cmd切换到当前脚本目录,执行locust -f locust_login.py
os.system("locust -f locust_login.py")
执行同时用fiddler抓包查看共发送了100条登录请求,以及提交的数据为从队列中取出的数据

