locust压测

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了locust压测相关的知识,希望对你有一定的参考价值。

参考技术A 它采用纯 Python 实现,是一个分布式用户负载测试的工具。 使用基于 Requests 库的客户端发起请求,使编写脚本大大简化; 在模拟并发方面摒弃进程和线程,完全基于时间驱动,采用协程(gevent)提供的非阻塞 IO 和 coroutine 来实现网络层的并发请求。因此单台压力机也能产生数千并发请求数。

Locust官网

特点:

支持Python版本: 3.6, 3.7, 3.8

安装方式: pip install locust -i https://pypi.tuna.tsinghua.edu.cn/simple

案例

--- 一个用户下一步具体要执行什么动作,是随机的,也就是 locust 会从动作列表中随机选择一个
--- @task 接受一个参数,表示权重,数值越大,这个动作被选中的概率就越高

然后打开浏览器, 直接在浏览器输入 http://localhost:8089 打开UI界面, 界面如下:

locust -f locustfile.py --headless -u 100 -r 10 -t 10s

运行多个进程的Locust, 使用 --master 命令启动主进程, 使用 --worker 启动从属进程

主进程控制从进程并收集从进程的测试结果;从进程负责执行测试,并反馈结果给主进程。

启动无界面主进程

locust -f locustfile.py --master --headless --master-bind-host=127.0.0.1 --master-bind-port=8090 -t 15s -u 5 -r 1

启动后,如果当前没有从进程的话会显示等待从进程。当从进程启动后便可以执行脚本了。

启动无界面的从进程:

locust -f locustfile.py --worker --master-host=127.0.0.1 --master-port=8090 --headless

从进程启动后将开始执行测试,主进程将会统计结果。

对于 web 网站来说,通常情况下,网站的一个页面中用户能够执行多个动作,并且这些动作通常是为了某个特定的目标,比如注册页面,用户可以执行的动作: 验证用户名,手机号码是否重复,更新图形验证码,获取手机验证码等。这些动作的目标就是为了完成用户注册。我们可以把这些动作组合在一起。

在 locust 中我们通过 TaskSet 类来组合多个动作,然后在 HttpUser 对象中引入 taskset ,引入方式是在 tasks 属性列表中,添加 taskset 类。

taskset 也是可以嵌套的,我们在 taskset 的 tasks 属性中添加要嵌套的其他 taskset 类。类似于: 网站首页包含用户登录页面,用户登录页面包含用户注册页面这种关系

我们在 HttpUser 以及 TaskSet 下定义动作后,locust 是从这些动作中随机选择一个动作来执行,有时候我们希望用户执行的动作是有序的,比如:

1.验证用户名是否重复
2.验证手机号码是否重复
3.验证获取图形验证码
4.获取手机验证码
5.注册
这时候就需要通过 SequentialTaskSet 来定义动作集合,他会按照定义 task 定义的顺序来一次调用。

我们需要判断一个请求是失败还是成功,需要给请求参数携带 catch_response=True ,这样请求方法就会返回一个上下文管理器

这个上下文管理器返回的是响应对象,我们通过调用响应对象的 failure(消息) 来标记本次请求失败,

通过 catch_response=True 参数来进行断言。

性能压测工具之 Locust

  Locust 是一款基于python语言开发的一款新的性能压测工具,它是以协程(比线程还小)的方式运行。

先看一张 locust 运行图:
技术图片

源码如下:

#!/usr/bin/env python
#-- coding: utf-8 --

from locust import HttpLocust, TaskSet, task
import subprocess
import json
import time
import random
import hashlib
import os

class UserBer(TaskSet):
def on_start(self):
pass

@task
def pubsend(self):
    url = "/pub/send"
    f = open("F:/python/data.json", ‘r‘)
    data = f.read()
    data = json.loads(data)
    data["from"]["time"] = int(time.time())
    data["from"]["nonce"] = random.randint(100000, 999999)

    pubToken = [data["from"]["no"], data["from"]["pub"], data["from"]["pubtoken"]
    pubToken.sort()
    pubToken = "".join(pubToken)
    sha1 = hashlib.sha1(pubToken.encode(‘utf-8‘))
    sha1 = sha1.hexdigest()
    data["from"]["pubtoken"] = sha1
    dataCop = json.dumps(data)
    head = {"Content-Type": "application/json"}

    req = self.client.post(url=url,data=dataCop,headers=head)

    if req.status_code == 200 and req.[‘success‘]==True:
        print("响应正常!")          
    else:
        print("服务端返回异常!")

class MobileUserLocust(HttpLocust):
task_set = UserBer
host = "http://hlep.his.com"
min_wait = 1000
max_wait = 3000

if name == "main":

os.system("locust -f locust-script.py")

说明:wins 下 pip install locustio ;运行脚本后 在浏览器中输入: localhost:8089

以上是关于locust压测的主要内容,如果未能解决你的问题,请参考以下文章

Locust压测框架实战:HTTP脚本编写

locust接口压测

性能压测工具之 Locust

locust压测 学习使用笔记

Locust性能评测及优化详解

Locust性能评测及优化详解