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,执行登录