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")
相关推荐
奋斗的小花生1 小时前
c++ 多态性
开发语言·c++
魔道不误砍柴功1 小时前
Java 中如何巧妙应用 Function 让方法复用性更强
java·开发语言·python
闲晨1 小时前
C++ 继承:代码传承的魔法棒,开启奇幻编程之旅
java·c语言·开发语言·c++·经验分享
_.Switch1 小时前
高级Python自动化运维:容器安全与网络策略的深度解析
运维·网络·python·安全·自动化·devops
老猿讲编程1 小时前
一个例子来说明Ada语言的实时性支持
开发语言·ada
Chrikk2 小时前
Go-性能调优实战案例
开发语言·后端·golang
幼儿园老大*2 小时前
Go的环境搭建以及GoLand安装教程
开发语言·经验分享·后端·golang·go
canyuemanyue2 小时前
go语言连续监控事件并回调处理
开发语言·后端·golang
杜杜的man2 小时前
【go从零单排】go语言中的指针
开发语言·后端·golang
测开小菜鸟3 小时前
使用python向钉钉群聊发送消息
java·python·钉钉