一.前言

Locust是一款易于使用的分布式负载测试工具,基于事件驱动,使用轻量级执行单元(如协程)来实现高并发。

二.基本使用

以下是Locust性能测试使用的一个基础Demo示例,该示例有安装Locust、编写测试脚本、启动测试以及监控测试结果。

1. 安装Locust

首先,你需要在你的机器上安装Locust。最简单的方式是使用pip命令进行安装:

pip install locust

如果你打算在多个进程或机器上分布式运行Locust,建议也安装pyzmq库:

pip install pyzmq

2. 编写测试脚本

编写一个Locust测试脚本。Locust测试脚本通常包含至少两个类:一个继承自TaskSet的类用于定义用户行为,另一个继承自HttpLocust(或Locust,如果你不使用HTTP)的类用于设置用户属性和任务集。

以下是一个简单的Locust测试脚本示例,它模拟了用户访问网站首页和关于页面的行为:

import os

from locust import task, between, TaskSet, HttpUser


class WebsiteTasks(TaskSet):
    token = "Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6Imp3dCJ9.eyJza2V5IjoiZmQ2MTZiYjJjYTBlMmEwOGM5YTEwNmFlYzViYzY2ZGM0MmYxNmIzNDAyMzg3MzhhNzVhYmIzYjkwZjg0MmI1OSIsIm53X3VpZCI6ImUwZjBjMDZjLTdmMmYtNDRhMi1hZjQzLTU5YmEyYmY1MDU3YiJ9.Ip_iP_ZQwcsuigTTMKxlYVEbdC84oqsNzE-c1lPkcVA"
    @task
    def query_user_data(self):
        payload = {
            "conditions": {
                "keyword": "",
                "sort": {
                    "name": "create_time",
                    "order_by": "desc"
                },
                "start_time": "2024-06-01 00:00:00",
                "end_time": "2025-05-26 00:00:00"
            },
            "page": 1,
            "pagesize": 10,
            "skey": ""
        }
        headers = {
            "Authorization": self.token,
            # 其他可能的请求头
        }
        # 发送POST请求到登录API,并设置name以便在报告中区分
        self.client.post("http://localhost:8080/user/search",
                         json=payload,
                         headers=headers,
                         name="user")

    # @task
    # def query_answer(self):
    #     payload = {
    #         "query": "什么是年度?",
    #         "task_ids": ["ae62cf79-5870-49f0-94ca-6580b94b6e05"],
    #         "top_k": 3,
    #         "score_threshold": 0.5,
    #         "answer_source": ""
    #     }
    #     # headers = {
    #     #     "Authorization": self.token,
    #     #     # 其他可能的请求头
    #     # }
    #     # 发送POST请求到登录API,并设置name以便在报告中区分
    #     self.client.post("http://localhost:8080/search_answer",
    #                      json=payload,
    #                      name="query_answer")


# 定义用户类
class WebsiteUser(HttpUser):
    tasks = [WebsiteTasks]  # 将用户行为关联到用户类
    wait_time = between(1, 2)  # 设置用户执行任务的等待时间

    # 注意:
# 1. 每个@task装饰的方法都代表一个用户可能执行的任务。
# 2. self.client是一个HttpSession实例,你可以使用它来发送HTTP请求。
# 3. name参数是可选的,但它对于Locust生成的报告非常有用,因为它允许你区分不同类型的请求。
# 4. weight参数用于调整任务之间的执行比例(默认是1)。

# 运行Locust压测
# 1. 保存上述脚本为locustfile.py(或任何你喜欢的名字)。
# 2. 打开命令行或终端,导航到包含该脚本的目录。
# 3. 运行`locust -f locustfile.py`来启动Locust的Web界面。
# 4. 在浏览器中打开Locust的Web界面(默认是http://localhost:8089),设置用户数和孵化率,然后开始压测。

3. 启动Locust

安装并编写好测试脚本后,你可以通过命令行启动Locust。在命令行中,使用以下命令启动Locust的Web界面:

locust -f locustfile.py

这里的-f选项后面跟的是你的测试脚本文件名。启动后,Locust会在本地启动一个Web服务器(默认端口为8089),你可以通过浏览器访问http://127.0.0.1:8089来设置并发用户数、每秒启动的用户数等参数,并启动测试。

性能测试【Locust】基本使用介绍_测试脚本

  • Number of users :压力测试的用户总量,如上面的100
  • Spawn rate:每秒增加的用户量,从10开始增加直到用户总量数停止。
  • Host:被测接口的域名或IP端口地址(带http://或者https://)

设置好参数后,点击Start按钮,开始测试,各个页面信息介绍如下。

4. 监控测试结果

在Locust的Web界面中,你可以实时看到测试的统计数据,包括每秒完成的请求数(RPS)、平均响应时间、失败率等。你可以根据这些数据来评估你的系统的性能表现。

性能测试【Locust】基本使用介绍_命令行_02


顺便介绍几个概念:

  • PV是指页面被浏览的次数,比如你打开一网页,那么这个网站的PV就算加了一次;
  • TPS是每秒内的事务数,比如执行了DML操作,那么相应的TPS会增加;
  • QPS是指每秒内查询次数,比如执行了SELECT操作,相应的QPS会增加。

Charts分为三个部分,分别是:

  • Total Requests per Second: 展示随着用户的增加,TPS变化数。
  • Response Times(ms): 展示接口从开始压测,到稳定实时的响应时间,随着压力增加,一般会升高。
  • Number of Users: 展示从0开始,每秒增加10人,直到总数100后不再增加。

5. 命令行模式

除了Web界面外,Locust还支持命令行模式,允许你直接在命令行中运行测试并查看结果。例如:

locust -f locustfile.py --no-web -c 10 -r 2 -t 10m

这个命令表示以命令行模式运行测试,设置并发用户数为10,每秒启动2个用户,测试运行时间为10分钟。

三.总结

优势

  • 可编程性:Locust使用Python,这意味着你可以编写Python脚本来定义复杂的用户行为,利用Python的强大库资源。
  • 轻量级且易于安装:Locust是一个相对轻量级的工具,安装过程简单方便。
  • Web界面:提供一个易于使用的web界面用于启动测试、实时查看测试结果和统计信息。
  • 可扩展性:支持分布式测试,你可以很容易地通过增加更多的Slave节点来模拟数十万甚至数百万的并发用户。
  • 实时统计:通过Web UI,Locust能够实时展示请求统计、响应时间图表等数据,使结果分析更为直观。
  • 适用性广:可以用来测试网站、API、数据库等多种服务的性能。

局限性

  • 性能问题:虽然Locust本身是高效的,但它运行Python脚本,这可能不如一些编译语言(如C++或Go)编写的测试工具性能高。
  • 资源消耗:在模拟非常高的并发用户数时,Locust(特别是运行Locust的机器)可能会消耗大量的CPU和内存资源。
  • 学习曲线:对于那些不熟悉Python的用户来说,初学Locust可能会有一定的学习曲线。
  • 对高级负载模式的支持有限:虽然Locust非常灵活,但在一些非常特定的负载测试场景(如具有复杂的用户会话管理或定制的网络协议)中,可能需要进行相当多的自定义编码。
  • 社区和支持:尽管Locust有一个活跃的社区,但与某些更成熟的压力测试工具相比(如Jmeter),其用户基础和可用资源可能较少。

总的来说,Locust是一个功能强大且灵活的负载测试工具,特别适合那些熟悉Python并希望快速构建和执行实时监控负载测试的开发者和测试人员。然而,每个工具都有其优势和局限性,选择合适的工具应基于具体的测试需求和场景。
以上就是Locust性能测试使用的一个基础Demo示例。Locust的强大之处在于它的易用性和高并发能力,使得性能测试变得更加简单和高效。你可以根据自己的需求编写更复杂的测试脚本,以模拟更多的用户行为和场景。希望对你有所帮助!