locust--python实现的分布式性能测试工具

1.locust特点:

1.1 支持Python编写测试用例方案;

1.2 使用requests发送http请求;

1.3 使用协程实现,高并发时消耗更低;

1.4 使用Flask提供 Web UI;

1.5 有第三方插件支持扩展;

2.创建locust 性能测试用例步骤:

2.1 创建locust.TaskSet的子类;

2.2 为用例加上@locust.task()装饰器;

2.3 使用self.client发送请求;

2.4 制定await_time属性;

python 复制代码
import os

import locust
from locust import task, TaskSet, HttpUser, constant


# 任务集 用户行为脚本
class UserBehavior(TaskSet):  # 必须继承TaskSet
    wait_time = locust.between(1, 2)  # 每个task间隔1~2秒

    @locust.task(1)    #@task装饰该方法表示为用户行为,括号里面参数表示该行为的执行权重:数值越大,执行频率越高,不设置默认是1;
    def getBaidu(self):
        # headers根据自己的接口实际情况填写即可
        headers = {'content-type': 'application/x-www-form-urlencoded',
                   'ua': 'xxx',
                   'Cookie': 'xxx',
                   }
        url = "https://www.baidu.com/"
        res = self.client.get(url, headers=headers)
        print(res.status_code)
        assert res.status_code == 200

    # wait_time = constant(1)  # 每个用户在每次任务执行之间等待5秒


class WebsiteUser(HttpUser):    #WebsiteUser()类用于设置生成负载的基本属性:
    tasks = [UserBehavior]    #task_set:指向定义了用户行为的类
    min_wait = 500    #min_wait:模拟负载的任务之间执行时的最小等待时间,单位为毫秒
    max_wait = 1000    #min_wait:模拟负载的任务之间执行时的最大等待时间,单位为毫秒
    host = "http://localhost:8089"


if __name__ == "__main__":
    os.system("locust -f %s " % __file__)  # 此处导入os,可以在pycharm中直接运行此py文件

3.locust执行压测

3.1通过web UI执行

locust -f {用例文件.py}

3.2 通过命令行执行

locust -f {文件名.py} --headless -u 500 -r 10 -t 1h30m [--host 192.168xx]

-f:指定运行的用例文件;
--headless:非GUI方式执行;
-u:指定多少并发用户数;
-r:指定每秒启动多少用户;
-t:指定压测运行时间;
--host:指定base host参数;

4.数据关联:

通过变量self.token=res.json()["token"]方式,token可被其他方法使用。

5.参数化:

引入队列的概念 queue ,实现方式是将参数推入队列,测试时依次取出,全部取完后 locust 会自动停止。若是使用参数循环压测,需要将取出的参数再推入队尾。

python 复制代码
import csv
import os, requests
import queue
from locust import TaskSet, task, HttpUser
from requests.packages.urllib3.exceptions import InsecureRequestWarning


# 禁用安全请求警告
requests.packages.urllib3.disable_warnings(InsecureRequestWarning)


def fnReadData():
    f = open("uuid.text", "r") #读取参数文件
    data = []                  #声明空列表
    data = csv.reader(f)      #通过 csv读取文件内容
    s = queue.Queue()         #实例化一个queue对象
    for each in data:         #循环读取open里面的数据
        for key in each:
            try:
                s.put_nowait(key)    #put到队列中
            except queue.Full:
                print("Queue overflow")
    f.close()
    return s


class MyBlogs(TaskSet):
    # 访问我的博客首页
    @task(1)
    def get_blog(self):
        # 定义请求头
        header = {
            "User-Agent": "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/69.0.3497.100 Safari/537.36"}
        data = self.user.queueData.get()
        req = self.client.get("/357712148/%s" % data, headers=header, verify=False)
        if req.status_code == 200:
            print("success")
        else:
            print("fails")


class httpGet(HttpUser):
    tasks = [MyBlogs]
    min_wait = 3000  # 单位为毫秒
    max_wait = 6000  # 单位为毫秒
    queueData = fnReadData()  # 队列实例化


if __name__ == "__main__":
    #通过好
    os.system("locust -f lcome.py --host=https://blog.51cto.com  --headless -u 1 -r 1 -t 1s")
相关推荐
Awesome Baron2 分钟前
《Learning Langchain》阅读笔记8-RAG(4)在vector store中存储embbdings
python·jupyter·chatgpt·langchain·llm
阡之尘埃5 分钟前
Python数据分析案例73——基于多种异常值监测算法探查内幕交易信息
人工智能·python·机器学习·数据分析·异常检测·无监督学习
Yhame.10 分钟前
【使用层次序列构建二叉树(数据结构C)】
c语言·开发语言·数据结构
言之。16 分钟前
【Go语言】RPC 使用指南(初学者版)
开发语言·rpc·golang
蓝莓味柯基1 小时前
Python3:文件操作
python
投笔丶从戎1 小时前
Kotlin Multiplatform--01:项目结构基础
android·开发语言·kotlin
xiaoh_71 小时前
解决视频处理中的 HEVC 解码错误:Could not find ref with POC xxx【已解决】
python·ffmpeg·音视频
杜小暑2 小时前
动态内存管理
c语言·开发语言·动态内存管理
想不明白的过度思考者2 小时前
Java从入门到“放弃”(精通)之旅——JavaSE终篇(异常)
java·开发语言
明月与玄武2 小时前
Python编程的真谛:超越语法,理解编程本质
python·编程语言