Python locust阶段压测

 

 

locust阶段压测

 

命令行运行

要通过命令行实现分阶段压测,需要在headless的模式下运行。此时:

  • 不需要通过web界面对User、ratio、host进行配置;
  • 不能通过页面展示实时的压测数据了,只能查看命令行下的结果。

详细参数:https://docs.locust.io/en/stable/configuration.html#command-line-options

在命令行下运行:

locust -f ./test.py --headless -u 100 -r 2 --run-time 1h10m --step-load --step-users 10 --step-time 5m --host https://www.baidu.com/

参数详解:

  • -u 总的用户数:100
  • -r 用户卵化速度:2/s
  • 运行方式:每隔5min增加10个用户
  • --run-time 运行时长:1h10min
  • --host 测试的主机
  • -f 指定压测locust脚本文件

 

代码自定义

在代码中继承LoadTestShape类。如果locust在运行的时候找到了此类,则locust将自动使用它。

在此类中,您定义了tick()方法,该方法返回具有所需用户数和产卵率的元组(或无则停止测试)。蝗虫将大约每秒调用一次tick()方法。

在该类中,您还可以访问get_run_time()方法,以检查测试运行了多长时间。

示例代码1(阶梯负载):

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


class UserTasks(TaskSet):
    @task
    def get_root(self):
        self.client.get("/")


class WebsiteUser(HttpUser):
    wait_time = constant(0.5)
    tasks = [UserTasks]


class StepLoadShape(LoadTestShape):
    """
    A step load shape
    Keyword arguments:
        step_time -- Time between steps
        step_load -- User increase amount at each step
        spawn_rate -- Users to stop/start per second at every step
        time_limit -- Time limit in seconds
    """

    step_time = 30
    step_load = 10
    spawn_rate = 10
    time_limit = 600

    def tick(self):
        run_time = self.get_run_time()

        if run_time > self.time_limit:
            return None

        current_step = math.floor(run_time / self.step_time) + 1
        return (current_step * self.step_load, self.spawn_rate)

示例代码2:

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


class UserTasks(TaskSet):
    @task
    def get_root(self):
        self.client.get("/")


class WebsiteUser(HttpUser):
    wait_time = constant(0.5)
    tasks = [UserTasks]


class StagesShape(LoadTestShape):
    """
    A simply load test shape class that has different user and spawn_rate at
    different stages.
    Keyword arguments:
        stages -- A list of dicts, each representing a stage with the following keys:
            duration -- When this many seconds pass the test is advanced to the next stage
            users -- Total user count
            spawn_rate -- Number of users to start/stop per second
            stop -- A boolean that can stop that test at a specific stage
        stop_at_end -- Can be set to stop once all stages have run.
    """

    stages = [
        {"duration": 60, "users": 10, "spawn_rate": 10},
        {"duration": 100, "users": 50, "spawn_rate": 10},
        {"duration": 180, "users": 100, "spawn_rate": 10},
        {"duration": 220, "users": 30, "spawn_rate": 10},
        {"duration": 230, "users": 10, "spawn_rate": 10},
        {"duration": 240, "users": 1, "spawn_rate": 1},
    ]

    def tick(self):
        run_time = self.get_run_time()

        for stage in self.stages:
            if run_time < stage["duration"]:
                tick_data = (stage["users"], stage["spawn_rate"])
                return tick_data

        return None

 

posted @ 2020-12-28 01:49  -零  阅读(862)  评论(0编辑  收藏  举报