脚本基本构成

一个 Locust 测试脚本就是一个普通的 python 文件,它的基本组成十分简单:

定义用户的类型
所有用户的属性都需要继承自 User Class,我们最常用的 HttpUser 也是如此,你也可以定义一个如 TcpUser,或者 WebSocketUser,甚至基于你测试的业务系统来做一个,例如 QQUser,但是最终都必须继承至 User Class,类似于过去 LoadRunner、Jmeter 的选择应用的通讯协议或选择请求插件

等待时间的方法
声明一个等待时间的方法,用于确定模拟用户在任务之间执行的等待停留时间。Locust 附带了一些内置函数用于返回等待时间的方法,包括:

  • between:在指定范围内的随机;
  • constant:基于响应到下一次请求之间的固定的等待时间;
  • onstant_pacing:基于请求到下一次请求的固定间隔时间

主机属性
用于定义测试的主机信息,比如 https://www.baidu.com,如果在脚本中没有定义,那在命令行启动测试或 WebUI 中将作出定义

任务属性
用于定义任务的执行逻辑,你可以定义多个任务,让模拟的用户按照不同任务的权重配置随机执行,也可以让任务按照你的编排顺序执行

脚本开发入门

1、先按照最基本的脚本结构写一个范例

from locust import user, task, between

class MyUser(User):
    @task
    def my_task(self):
        print("executing my_task")

    wait_time = between(5, 15)

脚本实现:

  1. 定义一个 class,命名为 MyUser,继承自 user
  2. 定义了一个 my_task 函数,任务就是 print 一句话
  3. 通过 @task,定义了 my_task 这个函数将被执行
  4. 定义了每次任务结束以后,随机等待时间的间隔区间为5~15秒,再执行下一次任务迭代
  5. 把它保存为 locustfile.py,然后执行
locust -f locustfile.py

然后在本地浏览器访问 http://localhost:8089/,在“Start new Locust run”页面

Number of total users to simulate 中输入你需要模拟的用户总数
Hatch rate (users spawned/second) 中输入每秒创建的用户数
Host (e.g. http://www.example.com) 中输入Host站点信息(在本节范例里面随意输入即可,如:http://127.0.0.1)
点击“Start swarming”,可以命令行中看到返回:

[2021-05-27 19:05:29,395] PANSF-PC/INFO/locust.main: Starting web interface at http://0.0.0.0:8089 (accepting connections from all network interfaces)
[2021-05-27 19:05:29,413] PANSF-PC/INFO/locust.main: Starting Locust 1.5.3
[2021-05-27 19:05:48,090] PANSF-PC/INFO/locust.runners: Spawning 100 users at the rate 10 users/s (0 users already running)...
executing my_task
executing my_task
executing my_task
executing my_task
executing my_task
executing my_task

2、把这个脚本修改为访问真实的项目

"""
@File    : newbee_locust.py
@Time    : 2021.5.27 19:02
@Author  : Mr.潘
@Contact : pansf <pansfy@163.com>
@Version : 1.0
@License : Apache License Version 2.0
@Desc    : None
"""
from locust import HttpUser, task, between, TaskSet


class UserBehavior(TaskSet):
    """用户业务行为"""
    @task
    def goods_search(self):
        """商品查询"""
        headers = {
            "Content-Type": "application/json",
            "token": self.user.token
        }
        self.client.get("/api/v1/search", params={"keyword": "Apple"}, headers=headers)

    @task(2)
    def index(self):
        """访问首页"""
        self.client.get("/api/v1/index-infos")

    def on_start(self):
        """前置处理器: 登录"""
        headers = {"Content-Type": "application/json"}
        res = self.client.post("/api/v1/user/login",
                               json={"loginName": "18550208315", "passwordMd5": "e10adc3949ba59abbe56e057f20f883e"},
                               headers=headers)

        self.user.token = res.json()['data']


class WebSiteUser(HttpUser):
    """HTTP 用户"""
    wait_time = between(1, 3)
    tasks = [UserBehavior]

image.png

执行

locust -f newbee_locust.py

image.png

从上面的运行情况可以发现

标注1:作为 on_start 任务的内容,请求主机根目录只执行了 100 次(# Requests)
标注2:goods_search 任务与 index 任务以 1 :2 权重执行