参数化——循环取值

循环取数据,数据可重复使用

模拟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")

测试结果

参数化——循环取值

控制台打印用户登录信息,可以看到用户名是按顺序循环取值的

参数化——循环取值