测试资料获取:点击获取软件测试资料

一、Locust简介与特点

(一)Locust是什么

Locust是一款强大的分布式用户负载测试工具,旨在帮助开发人员和测试人员评估系统在不同负载条件下的性能表现。它通过模拟大量并发用户对目标网站或系统发起请求,从而精准地测试系统的响应能力、吞吐量、稳定性等关键性能指标,为优化系统性能提供有力的数据支持。

(二)Locust的运行原理

Locust基于事件驱动的运行原理,充分利用了gevent库的轻量级进程特性,使得在一台计算机上就能轻松模拟数千个并发用户的行为。与传统的基于回调的应用程序不同,Locust采用协程的方式异步处理请求,极大地提高了资源利用率和并发性能,能够高效地模拟大规模用户的并发访问场景,真实地反映系统在高负载下的运行状态。

(三)Locust的特点优势

  • 编程灵活性高:使用Python编写测试方案,这意味着测试人员可以充分利用Python丰富的库和语法糖,根据实际需求灵活地定制各种复杂的测试场景,轻松实现高度定制化的性能测试逻辑,满足不同系统的多样化测试需求。
  • 分布式与可扩展性强:支持分布式测试,能够将负载分散到多个节点上同时执行,通过简单的配置即可实现大规模并发用户的模拟,轻松应对超大规模的性能测试场景,有效提升测试的规模和效率,适应现代复杂系统的性能测试要求。
  • 统计结果直观便捷:基于Web界面的统计结果展示,让测试人员可以直观地查看各项性能指标,如平均响应时间、吞吐量、错误率等,而且无需复杂的配置即可轻松跨平台使用,无论是在Windows、Linux还是Mac系统上,都能方便地进行测试和结果分析,大大提高了测试的便利性和效率。
  • 测试范围广泛:不仅可以对常见的网页应用进行性能测试,还能够测试各种类型的应用程序和系统,包括但不限于RESTful API、Websocket服务等,具备广泛的适用性,能够满足不同类型项目的性能测试需求。

二、环境搭建准备

(一)Python环境配置

首先,前往Python官方网站(https://www.python.org/downloads/)下载Python 3.6及以上版本的解释器,根据操作系统选择对应的安装包进行下载。安装过程中,注意勾选“Add Python to PATH”选项,确保Python能够被系统正确识别。安装完成后,打开命令提示符(Windows)或终端(Linux/Mac),输入“python --version”和“pip --version”命令,如果能够正确显示Python版本号和pip版本号,则说明Python环境配置成功。

(二)Locust环境安装

在配置好Python环境后,通过命令提示符或终端执行以下命令安装Locust:“pip install locustio==0.14.6”(如果需要特定版本)或者“pip install locust”(安装最新版本)。安装过程中,pip会自动下载并安装Locust及其依赖项。安装完成后,进入Python开发环境,输入“import locust”,如果没有报错,则表明Locust安装成功,可以开始使用。

三、Locust核心类与方法

(一)HttpLocust类

HttpLocust类继承自Locust类,是Locust框架中用于生成虚拟HTTP用户的关键类。它负责向目标负载测试系统发送HTTP请求,模拟真实用户的行为。通过设置相关属性,如task_set、host、wait_time等,可以精确地控制虚拟用户的行为模式和请求频率,从而实现对系统的精准压力测试。

(二)TaskSet类及相关装饰器

1. TaskSet类概述

TaskSet类用于组织和描述用户执行的任务细节,它定义了一组任务以及任务之间的调度逻辑,是构建复杂测试场景的基础。在TaskSet类中,可以通过各种方法和装饰器来定义不同的任务,并通过内置的调度算法,如随机选择、按权重分配等,来确定任务的执行顺序和频率,以模拟真实用户在系统中的各种操作行为。

2. @task装饰器

@task装饰器用于标识测试任务,通过为不同的任务设置不同的权重,可以有效地控制任务的执行频率。例如:

from locust import HttpLocust, TaskSet, task

class UserBehavior(TaskSet):
    @task(3)
    def task1(self):
        # 执行任务1的代码,如发送特定的HTTP请求
        pass

    @task(1)
    def task2(self):
        # 执行任务2的代码,如发送另一个HTTP请求
        pass

在上述示例中,task1的权重为3,task2的权重为1,这意味着在模拟用户行为时,task1被执行的概率大约是task2的3倍,从而更精准地模拟实际业务场景中不同操作的频率分布。

3. @seq_task装饰器(若有)

@seq_task装饰器用于指定接口执行的顺序,当需要确保某些任务按照特定的顺序依次执行时,这个装饰器就非常有用。它可以与@task装饰器结合使用,进一步细化任务的执行逻辑。例如:

from locust import HttpLocust, TaskSet, task, seq_task

class UserBehavior(TaskSet):
    @seq_task(1)
    @task
    def task_a(self):
        # 第一个执行的任务
        pass

    @seq_task(2)
    @task
    def task_b(self):
        # 第二个执行的任务
        pass

在这个例子中,task_a会先于task_b执行,保证了任务执行的顺序性,适用于一些对操作顺序有严格要求的测试场景,如电商系统中的下单流程,需要先登录,再浏览商品,然后加入购物车,最后结账等操作,都可以通过这种方式精确模拟。

(三)其他重要属性和方法

1. task_set属性

task_set属性用于指向定义用户行为的类,它将HttpLocust类与具体的TaskSet类关联起来,使得虚拟用户能够按照定义好的任务集执行操作。例如:

from locust import HttpLocust, TaskSet, task

class UserBehavior(TaskSet):
    @task
    def task1(self):
        # 执行任务1的代码
        pass

class WebsiteUser(HttpLocust):
    task_set = UserBehavior
    # 其他属性设置

在上述代码中,WebsiteUser类的task_set属性指向了UserBehavior类,这样当启动Locust测试时,虚拟用户就会按照UserBehavior类中定义的任务进行执行,确保了测试流程的正确性和完整性。

2. host属性

host属性用于指定要加载的域名(URL前缀),在测试过程中,所有的请求都会基于这个域名进行发送。例如:

from locust import HttpLocust, TaskSet, task

class UserBehavior(TaskSet):
    @task
    def task1(self):
        # 发送基于host属性的HTTP请求
        self.client.get("/path/to/resource")

class WebsiteUser(HttpLocust):
    task_set = UserBehavior
    host = "http://example.com"

在这个例子中,所有的请求都会发送到“http://example.com”这个域名下的相应路径,测试人员可以根据实际测试目标,准确地设置host属性,确保测试请求能够正确地到达目标系统。

3. wait_time属性

wait_time属性用于控制虚拟用户发送Http请求时的等待时间,其值是一个时间区间范围,单位为毫秒。例如:

from locust import HttpLocust, TaskSet, task
import random

class UserBehavior(TaskSet):
    @task
    def task1(self):
        # 执行任务1的代码
        pass

class WebsiteUser(HttpLocust):
    task_set = UserBehavior
    wait_time = lambda self: random.randint(1000, 5000)

在上述示例中,虚拟用户在每次执行完一个任务后,会等待一个1秒到5秒之间的随机时间,然后再执行下一个任务。通过合理设置wait_time属性,可以模拟真实用户在操作过程中的停顿和思考时间,使测试场景更加贴近实际情况,从而得到更准确的性能测试结果。

4. 初始化方法(setup、teardown、on_start、on_stop)
  • setup方法:在整个测试任务开始前运行,主要用于进行一些全局的初始化工作,如创建数据库连接池、初始化全局变量等,确保测试环境的准备就绪。例如:
from locust import HttpLocust, TaskSet, task

class UserBehavior(TaskSet):
    def setup(self):
        # 进行全局初始化工作,如创建数据库连接等
        pass

    @task
    def task1(self):
        # 执行任务1的代码
        pass

class WebsiteUser(HttpLocust):
    task_set = UserBehavior
  • teardown方法:与setup方法相对应,在整个测试任务结束后运行,用于清理测试过程中产生的资源,如关闭数据库连接、释放文件句柄等,确保测试环境的干净整洁,避免资源泄漏问题。例如:
from locust import HttpLocust, TaskSet, task

class UserBehavior(TaskSet):
    def setup(self):
        # 进行全局初始化工作
        pass

    def teardown(self):
        # 清理测试资源,如关闭数据库连接等
        pass

    @task
    def task1(self):
        # 执行任务1的代码
        pass

class WebsiteUser(HttpLocust):
    task_set = UserBehavior
  • on_start方法:在每个虚拟用户开始执行任务时运行,主要用于进行一些与用户相关的初始化工作,如登录操作,获取用户的认证信息等,确保每个虚拟用户在执行具体任务前都处于正确的初始状态。例如:
from locust import HttpLocust, TaskSet, task

class UserBehavior(TaskSet):
    def on_start(self):
        # 模拟用户登录操作,获取认证信息
        self.client.post("/login", {"username": "testuser", "password": "testpassword"})

    @task
    def task1(self):
        # 执行任务1的代码,此时已登录
        pass

class WebsiteUser(HttpLocust):
    task_set = UserBehavior
  • on_stop方法:在每个虚拟用户停止执行任务时运行,用于清理与该用户相关的资源,如注销登录、释放用户相关的临时资源等,确保每个虚拟用户在结束测试时都能正确地清理自身占用的资源,保持测试环境的稳定性。例如:
from locust import HttpLocust, TaskSet, task

class UserBehavior(TaskSet):
    def on_start(self):
        # 模拟用户登录操作
        self.client.post("/login", {"username": "testuser", "password": "testpassword"})

    def on_stop(self):
        # 模拟用户注销操作
        self.client.get("/logout")

    @task
    def task1(self):
        # 执行任务1的代码
        pass

class WebsiteUser(HttpLocust):
    task_set = UserBehavior

四、Locust启动方式

(一)直接启动

直接启动Locust是最常见的方式,通过在命令提示符或终端中执行以下命令:“locust -f [执行脚本名].py”,其中“[执行脚本名].py”是编写好的Locust测试脚本文件名。在执行该命令前,确保已经在脚本中正确定义了HttpLocust类和TaskSet类等相关内容。启动成功后,Locust会在本地启动一个Web服务器,并在控制台输出相关信息,包括访问Locust Web界面的地址(通常为http://localhost:8089),测试人员可以通过浏览器访问该地址,进入Locust的测试控制界面,进行测试参数的设置和测试的启动。

(二)无web页面启动

在某些情况下,可能不需要Locust的Web界面,而是希望通过命令行参数直接控制测试的运行。此时,可以使用无web页面启动方式,通过以下命令:“locust -f [执行脚本名].py --no-web -c [并发用户数] -r [每秒启动的虚拟用户数] -t [运行时间]”,其中“-c”参数指定并发用户数,“-r”参数指定每秒启动的虚拟用户数,“-t”参数指定测试的运行时间,例如:“locust -f mytest.py --no-web -c 100 -r 10 -t 60s”表示启动100个并发用户,每秒启动10个用户,测试持续时间为60秒。这种启动方式适合在自动化测试场景中,通过脚本或持续集成工具来调用Locust进行性能测试,并获取测试结果进行后续的分析和处理。

(三)分布式启动

1. 指定master主机启动

在分布式测试中,首先需要指定一台主机作为master主机,通过以下命令启动:“locust -f [执行脚本名].py --master”。master主机负责协调和管理整个分布式测试过程,接收从机发送的测试数据,并汇总生成最终的测试结果。在启动master主机后,它会等待从机的连接,并在控制台输出相关信息,显示当前连接的从机数量和状态等。

2. 指定从机启动

其他参与分布式测试的机器作为从机,通过以下命令启动:“locust -f [执行脚本名].py --slave --master-host=[master主机IP]”,其中“[master主机IP]”是master主机的IP地址。从机在启动后,会连接到master主机,并等待master主机的指令,接收测试任务并执行,然后将测试数据发送回master主机。通过这种分布式启动方式,可以利用多台机器的资源,模拟更大规模的并发用户,对系统进行更全面、更严格的性能测试,以发现系统在高负载下可能存在的性能瓶颈和问题。

五、测试结果查看与分析

(一)启动页面各参数含义

当通过浏览器访问Locust启动后的Web界面(如http://localhost:8089)时,会看到一个测试启动页面,其中包含多个参数:

  • Number of total users simulate:表示要模拟的总用户数,测试人员可以根据系统的预期负载和性能测试目标,设置合适的用户数量,以评估系统在不同用户规模下的性能表现。
  • Hatch rate(users spawned/second):即每秒启动的虚拟用户数,通过调整这个参数,可以控制用户的并发增长速度,模拟不同的用户增长场景,如缓慢增长、快速爆发等,观察系统在不同增长模式下的性能变化情况。
  • Start swarming:点击该按钮后,Locust将开始执行测试脚本,按照设置的参数启动虚拟用户,并向目标系统发送请求,同时开始收集和统计测试数据,测试人员可以实时观察系统的性能指标变化情况。

(二)各模块功能说明

1. Statistics模块

Statistics模块类似于jmeter中的聚合报告,它展示了关键的测试数据,包括:

  • Type:请求的类型,如GET、POST、PUT、DELETE等,帮助测试人员了解不同类型请求的性能表现。
  • Name:请求的名称,通常是请求的路径或方法的描述,方便测试人员快速识别和定位不同的测试请求。
  • # requests:请求的数量,显示了在测试过程中发送的该类型请求的总数,通过对比不同请求的数量,可以了解系统的业务负载分布情况。
  • # fails:失败请求的数量,直观地反映了系统在处理请求过程中出现的错误情况,测试人员可以通过分析失败请求的原因,找出系统可能存在的问题点,如接口异常、服务器错误等。
  • Median:中位数响应时间,即所有请求响应时间的中间值,它不受极端值的影响,能够较好地反映系统的一般响应性能,相比平均响应时间,中位数更能代表系统的典型响应情况。
  • Average:平均响应时间,是所有请求响应时间的平均值,它综合考虑了所有请求的响应情况,但可能会受到少数极端值(如长时间的异常响应)的影响,与中位数结合使用,可以更全面地了解系统的响应性能分布。
  • Min:最小响应时间,展示了系统在最佳情况下的响应速度,反映了系统的最快处理能力,有助于测试人员了解系统的性能上限。
  • Max:最大响应时间,显示了系统在测试过程中出现的最长响应时间,可能是由于网络波动、服务器繁忙或其他异常情况导致的,通过分析最大响应时间,可以发现系统在高负载下可能出现的性能瓶颈和异常情况。
  • Average size:平均请求大小,以字节为单位,反映了系统处理的请求的数据量大小,对于评估网络带宽和服务器处理能力的匹配度有一定的参考价值。
  • Current RPS:当前每秒请求数,实时显示系统当前正在处理的请求数量,能够直观地反映系统的负载情况和处理能力,帮助测试人员观察系统在不同时间段的负载变化趋势。
  • Total RPS:总每秒请求数,是整个测试过程中的平均每秒请求数,综合考虑了测试过程中的所有情况,对于评估系统的整体吞吐量有重要意义。

通过对这些数据的综合分析,测试人员可以全面了解系统在不同负载条件下的性能表现,如响应时间是否满足业务要求、吞吐量是否能够支撑预期的用户并发量、系统在高负载下是否稳定等,从而为系统的性能优化提供有力的数据支持和决策依据。

2. Failures模块

Failures模块专门用于展示失败的请求,它列出了每个失败请求的详细信息,包括:

  • Error:失败的错误信息,详细描述了请求失败的原因,如“404 Not Found”表示请求的资源未找到,“500 Internal Server Error”表示服务器内部出现错误等,测试人员可以根据这些错误信息快速定位系统中的问题所在。
Logo

技术共进,成长同行——讯飞AI开发者社区

更多推荐