locust入门实操,简单上手压测

2022-06-13 12:12:01 浏览数 (2)

一:安装

使用 pip 安装 Locust:

代码语言:javascript复制
pip install locust

shift 右键可以进入PowerShell 命令行窗口,也可以进入cmd窗口,和pycharm命令窗口输入安装命令。

locust需要一个py文件描述压测内容和操作。

locust版本1.0之前:文件内容大致如下:

需要一个用户类,该类继承HttpLocust。

代码语言:javascript复制
class UserOne(HttpLocust):
    task_set = UserTask #指向定义了用户行为的类
    weight = 1 #同时运行多个Locust类时会用到,用于控制不同类型任务的执行权重,测试开始后,每个虚拟用户(Locust实例)的运行逻辑都会遵循如下规律:先执行WebsiteTasks中的on_start(只执行一次),作为初始化;从WebsiteTasks中随机挑选(如果定义了任务间的权重关系,那么就是按照权重关系随机挑选)一个任务执行;根据Locust类中min_wait和max_wait定义的间隔时间范围(如果TaskSet类中也定义了min_wait或者max_wait,以TaskSet中的优先),在时间范围中随机取一个值,休眠等待;重复2~3步骤,直至测试任务终止。
    min_wait = 1000 #最小等待时间毫秒
    max_wait = 1000 #最大等待时间毫秒
    #相同可控制每秒增长量
    stop_timeout = 5 Locust停止的秒数,如果为None,将不停止一直执行任务,单位为s秒
    host = "https://www.baidu.com" #压测地址根路径

一个用户描述类:

代码语言:javascript复制
class UserTask(TaskSet):
    @task #@task装饰该方法表示为用户行为,括号里面参数表示该行为的执行权重:数值越大,执行频率越高,不设置默认是1;
    def tc_index(self): 
        self.client.get("/")

locust版本1.0以后:文件内容大致如下:

可以看到从HttpLocust类变成了HttpUser类。

我们创建一个py文件取个喜欢的名字,并写出来大概的代码。

代码语言:javascript复制
from locust import HttpUser, between, TaskSet, task
class MyTest(TaskSet):
    @task #@task 装饰的方法才会在 Locust 虚拟用户运行过程中被调用
    def testdef(self):
        pass
class Userone(HttpUser):
    wait_time = between(1, 2) #思考时间,1秒到2之间随机等待
    # wait_time = constant(3)  # 每次请求停顿时间 (思考时间)
    host = 'http://xxxx'
    # tasks = {
    #     MyTest: 3 #后面数字表示多个行为时候选择比例
    #     MyTest: 1 #后面数字表示多个行为时候选择比例
    # }
    tasks = [MyTest]

这里教大家一个从postman导出Python脚本的方法,如下图。

代码语言:javascript复制
import requests

url = "http://www.weather.com.cn/data/cityinfo/101190408.html"

payload={}
headers = {}

response = requests.request("GET", url, headers=headers, data=payload)

print(response.text)

现在修改我们的locust代码,注意要使用locust的client客户端。

代码语言:javascript复制
from locust import HttpUser, between, TaskSet, task
class MyTest(TaskSet):
    @task
    def testdef(self):
        url='data/cityinfo/101190408.html' #调用接口 将会拼在根路径后面
        payload = {}
        headers = {}
        r=self.client.request(method='GET', url=url,  headers=headers, name='获取天气') #注意要使用locust的client客户端
        r.encoding = 'UTF-8' #解码
        print(r.text)
    def on_start(self):
        print('这是SETUP,每次实例化User前都会执行!')
    def on_stop(self):
        print('这是TEARDOWN,每次销毁User实例时都会执行!')
class Userone(HttpUser):
    wait_time = between(1, 2) #思考时间,1秒到2之间随机等待
    host = 'http://www.weather.com.cn/'
    # tasks = {
    #     MyTest: 3 #后面数字表示多个行为时候选择比例
    #     MyTest: 1 #后面数字表示多个行为时候选择比例
    # }
    tasks = [MyTest]
if __name__ == "__main__":
    import os
    os.system("locust -f 演示locust.py") #相当于我们在当前目录命令行下执行了locust -f 演示locust.py

实际使用当中我们会自己添加自己的断言,注意catch_response 属性,必须设置为TRUE才能设置断言错误。

代码语言:javascript复制
import json
import random
from locust import HttpUser, between, TaskSet, task
class MyTest(TaskSet):
    @task
    def testdef(self):
        url='data/cityinfo/101190408.html'
        payload = {}
        headers = {}
        f = [200, 100]
        x=random.choice(f)
        print(x)
        with self.client.request(method='GET', url=url,  headers=headers, name='获取天气',catch_response=True) as response:  #catch_response = True :布尔类型,如果设置为 True, 允许该请求被标记为失败。
            if response.status_code != x:
                response.failure("请求错误,返回状态不正确")
            elif response.elapsed.total_seconds() > 0.02:
                response.failure("请求错误,耗时太长")
            else:
                response.success()
        response.encoding = 'UTF-8'
        print(response.text)
    def on_start(self):
        print('这是SETUP,每次实例化User前都会执行!')
    def on_stop(self):
        print('这是TEARDOWN,每次销毁User实例时都会执行!')
class Userone(HttpUser):
    wait_time = between(1, 2) #思考时间,1秒到2之间随机等待
    host = 'http://www.weather.com.cn/'
    # tasks = {
    #     MyTest: 3 #后面数字表示多个行为时候选择比例
    #     MyTest: 1 #后面数字表示多个行为时候选择比例
    # }
    tasks = [MyTest]
if __name__ == "__main__":
    import os
    os.system("locust -f 演示locust.py")#相当于我们在当前目录命令行下执行了locust -f 演示locust.py

浏览器访问:运行命令locust -f 演示locust.py启动服务,可以看到默认端口8089,通过浏览器http://localhost:8089/访问,0.0.0.0运行以后我们的同事可以通过局域网我们的ip访问我们的服务,以后介绍django搭建平台时候也会用的。

增长折线图

运行的异常信息,可以看到类型里面描述是我们自己设置的错误原因。
下载运行结果

无浏览器模式:-u指定要产生的用户数,并-r指定产生速率(每秒要启动的用户数)

代码语言:javascript复制
locust -f 演示locust.py --headless -u 100 -r 10

--run-time

如果要指定测试的运行时间,则可以使用--run-time或进行操作-t ,一旦时间到,locust就停止运行,1h30m5s,h小时m分钟s秒。

代码语言:javascript复制
locust -f 演示locust.py --headless -u 100 -r 10 --run-time 5s

默认情况下,locust将立即停止任务(甚至不等待请求完成)。如果要允许任务完成其迭代,则可以使用--stop-timeout <seconds>参数

代码语言:javascript复制
locust -f --headless -u 1000 -r 100 --run-time 1h30m --stop-timeout 10
代码语言:javascript复制
locust -f 演示locust.py --headless -u 100 -r 10 --run-time 5s  --csv=mycsv
加上--csv=mycsv 参数保存CSV文件

简单的介绍了下locust入门,优点是快速上手,单机模拟出较高的并发压力,缺点是报告简单,性能上不去。读者可以深入了解下locust分布式,祝大家情人节快乐,有情人终成眷属,没对象的好好学习。

0 人点赞