常见场景:

全局数据

同一份数据,随机取数

同一份数据,顺序取数

每个worker节点拥有独立的一份数据 & 不重复

通过init事件注册监听,可结合init_command_line_parser事件配置全局数据,数据针对worker独立唯一。

  1. def work_id_data():
  2. """队列获取作品ID数据"""
  3. # work_ids = queue.Queue()
  4. with open('work_id.txt', 'r', encoding='utf-8') as f:
  5. for i in f.readlines()[int(os.environ.get('first_index')):int(os.environ.get('last_index'))]:
  6. work_ids.put_nowait(int(i.strip('\n')))
  7. return work_ids
  8. @events.init_command_line_parser.add_listener
  9. def add_user_parser(parser, **kwargs):
  10. """自定义locust命令参数"""
  11. parser.add_argument(
  12. "-fi",
  13. "--first_index",
  14. help="获取截取列表首索引"
  15. "[fc:]",
  16. default=0,
  17. type=str
  18. )
  19. parser.add_argument(
  20. "-li",
  21. "--last_index",
  22. help="获取截取列表末索引"
  23. "[:li]",
  24. default=0,
  25. type=str
  26. )
  27. args = parser.parse_args()
  28. if args.first_index:
  29. os.environ['first_index'] = args.first_index
  30. if args.last_index:
  31. os.environ['last_index'] = args.last_index
  32. @events.init.add_listener
  33. def on_locust_init(environment, **kwargs):
  34. print("当前环境变量first_index为: %s" % os.environ.get('first_index'))
  35. print("当前环境变量last_index为: %s" % os.environ.get('last_index'))
  36. work_id_data()
  37. print('初始化测试数据完毕')
  38. if isinstance(environment.runner, MasterRunner):
  39. print("master节点执行")
  40. else:
  41. print("worker节点执行")
  42. if __name__ == "__main__":
  43. file_name = os.path.abspath(__file__)
  44. os.system(f'locust -f {file_name} --master --first_index 0 --last_index 1000')

非全局数据

动态入参,与上下文无联系(例如时间戳、uuid)

动态入参,与上下文联系(请求数据递增版本号)

通过函数方法调用,以字典方式存储,结合类属性定义索引,动态取数,数据针对模拟用户独立唯一。

  1. def version_id_data():
  2. """生成version_ids字典"""
  3. version_id = []
  4. for i in range(1000000):
  5. version_id.append(i)
  6. version_ids = dict(zip(version_id, version_id))
  7. return version_ids
  8. class ApiUser(TaskSet):
  9. """压测op操作"""
  10. index = 1
  11. @task(15)
  12. def test_op(self):
  13. """op操作"""
  14. all_locusts_spawned.wait() # 限制在所有用户准备完成前处于等待状态
  15. self.client.send('42["operation",{'
  16. f'"revision":{self.user.version_id.get(self.index)}'
  17. ',"op":[[["extra","user_state","275127340","current_stage_actor",{"r":true,"i":'
  18. f'"{uuid.uuid1()}"'
  19. '}]]]}]')
  20. self.index += 1