在Locust中(直接压测脚本文件中)可直接定义一个继承LoadTestshape类的类,有则自动启动。

  1. 在该类中定义tick()方法,返回用户数user_count和产生率spawn_rate的元组,如果返回None则停止测试
  2. _通过_get_run_time()方法获取测试运行时间,使用此方法控制压测时间

基于时间峰值策略

  1. # 基于时间峰值策略: 每秒生成10个用户,持续时间60s
  2. class TimePeadShape(LoadTestShape):
  3. # time_limit设置整个压测过程为60秒
  4. time_limit = 60
  5. # 设置产生率一次启动10个用户
  6. spawn_rate = 10
  7. def tick(self):
  8. """
  9. 设置 tick()函数
  10. 并在tick()里面调用 get_run_time()方法
  11. """
  12. # 调用get_run_time()方法获取压测执行的时间
  13. run_time = self.get_run_time()
  14. # 运行时间在 time_limit之内,则继续执行
  15. print('run_time', run_time)
  16. if run_time < self.time_limit:
  17. # 每10秒钟增加10个用户
  18. user_count = round(run_time, -1)
  19. return user_count, self.spawn_rate
  20. return None

基于步骤负载策略

  1. # 基于步骤负载策略:每5秒增加10个用户,持续1分钟
  2. class StepShape(LoadTestShape):
  3. """
  4. step_time -- 步骤时间间隔
  5. step_load -- 用户每一步增加数量
  6. spawn_rate -- 用户每一步每秒停止/启动数量
  7. time_limit -- 时间限制,以秒为单位
  8. """
  9. step_time = 5
  10. step_load = 10
  11. spawn_rate = 10
  12. time_limit = 60
  13. def tick(self):
  14. # 调用get_run_time()方法获取压测执行的时间
  15. run_time = self.get_run_time()
  16. print('run_time', run_time)
  17. # 运行时间在 time_limit之内,则继续执行
  18. if run_time > self.time_limit:
  19. return None
  20. # 判断当前负载用户数
  21. current_step = math.floor(run_time / self.step_time) + 1
  22. print('current_step', current_step)
  23. return current_step * self.step_load, self.spawn_rate

基于时间阶段负载策略

  1. # 基于时间段负载策略:前10s和10-20s用户数为10;20-50s用户数为50;50-80s用户数为100;80s后用户数为30
  2. class TimeStageShape(LoadTestShape):
  3. """
  4. duration -- 多少秒后进入下一个阶段
  5. users -- 用户数
  6. spawn_rate -- 每秒要启动/停止的用户数
  7. """
  8. stages = [
  9. {"duration": 10, "users": 10, "spawn_rate": 10},
  10. {"duration": 20, "users": 50, "spawn_rate": 10},
  11. {"duration": 50, "users": 100, "spawn_rate": 10},
  12. {"duration": 80, "users": 30, "spawn_rate": 10}
  13. ]
  14. def tick(self):
  15. # 调用get_run_time()方法获取压测执行的时间
  16. run_time = self.get_run_time()
  17. for stage in self.stages:
  18. # 判断运行时间在不同阶段负载不同用户数量
  19. if run_time < stage["duration"]:
  20. tick_data = (stage["users"], stage["spawn_rate"])
  21. return tick_data
  22. return None