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压测的主要内容,如果未能解决你的问题,请参考以下文章