Locust 脚本开发入门(4)

脚本开发入门

本节主要介绍 Locust 执行参数化的方法,参数化的目的无非就是以下几种:

  • 模拟用户在不同场景下的传参差异化,比方说所有并发对同一个订单执行支付,也许你需要检验这样是否能发现到一些别的异常,但这是不符合性能测试需求的
  • 满足业务对用户传参的约束条件,比方说你如果压测的是即时通讯的消息收发,即便支持多终端在线,但大量并发登录一个账号也是是不符合实际的
  • 满足系统对用户传参的约束条件

对一个参数执行参数化,首先得分清楚这个参数是属于 “基础数据” 还是 “业务数据” ,譬如 性别、省份、年月日,这些可以归纳为基础数据,而对于与被测试系统业务有一定关联性的,你可以归为业务数据,例如 账号密码、userId、orderId。

通常来说,基础数据 的数据范围是相对数量固定的、内容有限的,即便切换测试环境也不影响的,所以一般在脚本中内实现随机抽取,例如:

import random

sex = random.choice(['男性', '女性'])
year = random.randint(1949,2020)

而业务数据动辄几百上千条,相对来说数量和内容都是可变的,则应该通过读取外部文件实现(注意:Locust 的负载是通过 单进程 + 多协程 的实现,并非 多进程 + 多线程)。

范例:从 CSV 中读取参数实现参数化

下面看一段脚本范例,实现了登录账号、密码的参数化:

首先创建一个 csv 文件,第一列是登录账号,第二列是账号对应的密码,采用“,”分隔:

13800000001,abcd12ty
13800000002,abrd123y
13800000003,a12d1rty
13800000004,abc43454
13800000005,abcd12we
13800000006,abcd1wer
13800000007,abceqwe4
13800000008,abcd123k
13800000009,abcd1sd2
13800000010,123d124v

保存为:username.csv

然后,脚本实现:


from locust import HttpUser, task, constant, SequentialTaskSet
import queue

class taskcase(SequentialTaskSet):

    @task
    def pft(self):
        user = self.user.user_list.get()
        # print("username:{},password:{}".format(user["username"],user["password"]))
        
        self.client.post(
            "/login", {"username": user["username"], "password": user["password"]})
            
        # 登录后的一系列操作
        
        self.user.user_list.put_nowait(user)

class ApiUser(HttpUser):

    host = "http://www.demo.com"
    wait_time = constant(0)
    tasks = [taskcase]
    
    user_list = queue.Queue()
    
    with open("./username.csv") as file:
        for line in file:
            userInfo = line.split(',')
            data = {
                "username": userInfo[0],
                "password": userInfo[1]
            }
            
            user_list.put_nowait(data)

实现效果

创建了10个用户,user1~user10,依次取出测试账号 13800000001 ~ 13800000010,执行登录

Locust 脚本开发入门(1)
Locust 脚本开发入门(2)
Locust 脚本开发入门(3)
Locust 脚本开发入门(4)
返回:教程目录
本节教程涉脚本

posted @ 2020-07-29 10:41  huanghaopeng  阅读(852)  评论(0编辑  收藏  举报