压测工具 Locust

一、认识Locust

定义

Locust是一款易于使用的分布式负载测试工具,完全基于事件,即一个locust节点也可以在一个进程中支持数千并发用户,不使用回调,通过gevent使用轻量级过程(即在自己的进程内运行)。

特点

①、不需要编写笨重的UI或者臃肿的XML代码,基于协程而不是回调,脚本编写简单易读;
②、有一个基于we简洁的HTML+JS的UI用户界面,可以实时显示相关的测试结果;
③、支持分布式测试,用户界面基于网络,因此具有跨平台且易于扩展的特点;
④、所有繁琐的I / O和协同程序都被委托给gevent,替代其他工具的局限性;

安装

pip install locust

Locust有六个依赖的python模块,一并安装好。

  1. gevent:在Python中实现协程的第三方库。协程又叫微线程Corouine。使用gevent可以获取极高的并发能力;
  2. flask:Python的一个web开发框架,和django相当;
  3. requests:支持http/https访问的库;
  4. msgpack-python:一种快速、紧凑的二进制序列化格式,使用与类似json的数据;
  5. six:提供了一些简单的工具封装Python2和Python3 之间的差异;
  6. pyzmq:安装这个第三方库,可以把Locust运行在多个进程或多个机器(分布式)
    检测安装是否成功
(demo) root@ubuntu1804:/opt/other# locust --version
locust 2.5.0

二、使用

简单使用

编写测试脚本 locust_test.py

from locust import HttpUser, TaskSet, task

class UserBehavior(HttpUser):
    @task(1)
    def baidu_index(self):
        self.client.get("/")

UserBehavior()类用户设置测试具体方法:
UserBehavior继承HttpUser,拥有request等方法。
@task装饰该方法表示为用户行为,括号里面参数表示该行为的执行权重:数值越大,执行频率越高,不设置默认是1;
baidu_index 是具体的测试方法,可以设置GET、POST请求,可以设置请求携带信息,可以设置请求的结果处理。

(demo) root@ubuntu1804:/opt/other# locust -f locust_test.py
/root/.virtualenvs/demo/lib/python3.8/site-packages/locust/util/deprecation.py:14: DeprecationWarning: Usage of User.task_set is deprecated since version 1.0. Set the tasks attribute instead (tasks = [UserBehavior])
  warnings.warn(
[2021-11-29 11:36:29,324] ubuntu1804/INFO/locust.main: Starting web interface at http://0.0.0.0:8089 (accepting connections from all network interfaces)
[2021-11-29 11:36:29,356] ubuntu1804/INFO/locust.main: Starting Locust 2.5.0

UI界面

打开网页:http://localhost:8089,进入UI界面。

UI界面的菜单
● Statistics:类似于jmeter中Listen的聚合报告;
● Charts:测试结果变化趋势的曲线展示图,分别为每秒完成的请求数(RPS)、响应时间、不同时间的虚拟用户数;
● Failures:失败请求的展示界面;
● Exceptions:异常请求的展示界面;
● Download Data:测试数据下载模块, 提供三种类型的CSV格式的下载,分别是:Statistics、responsetime、exceptions;

统计信息:

Type:请求类型,即接口的请求方法;
Name:请求路径;
requests:当前已完成的请求数量;
fails:当前失败的数量;
Median:响应时间的中间值,即50%的响应时间在这个数值范围内,单位为毫秒;
Average:平均响应时间,单位为毫秒;
Min:最小响应时间,单位为毫秒;
Max:最大响应时间,单位为毫秒;
Content Size:所有请求的数据量,单位为字节;
reqs/sec:每秒钟处理请求的数量,即QPS;

QPS图信息

官方文档:
https://docs.locust.io/en/stable/what-is-locust.html

三、进阶使用

控制RPS
wait_time 是请求的间隔时间
用户数 是开启的协程数
RPS = 间隔 x 用户数,要求的RPS可以根据这个公式调整。

class UserBehavior(HttpUser):
    wait_time = constant_throughput(0.5)

    @task(1)
    def get_ticket_user(self):
        url = "https://apiv3.shanbay.com/tickethub/ticket/user?code=2021-06-cet"
        cookies = {"auth_token": random.choice(token_list)}
        self.client.get(url, cookies=cookies)
posted @ 2022-08-20 20:18  金色旭光  阅读(473)  评论(0编辑  收藏  举报