• Locust 1.0版本引入的变化


            locust升级到1.0版本时,引入了毕竟大的变化,下面总结一下,引文官方文档可以参考Changelog Highlights — Locust 2.10.2.dev27 documentation 。

    1、Locust类命名发生变化

            1、Locust类和HttpLocust类重命名为User类和HttpUser类;

            2、TaskSet类的locust属性也被重命名为user;

            3、 Loust类的task_set属性被移除了,取而代之的是在User类上新增了tasks属性;

            4、可以在继承User类下,直接使用@task装饰器来定义任务;

            5、设置users数量的参数-c / --client 被重命名为-u / --users。

    1. from locust import task, between, TaskSet, User
    2. class MyTaskSet(TaskSet):
    3. @task
    4. def my_task1(self):
    5. print("excuting MyTaskSet my_task1")
    6. @task
    7. def my_task2(self):
    8. print("excuting MyTaskSet my_task2")
    9. class MyUser(User):
    10. tasks = [MyTaskSet]
    11. wait_time = between(5, 15)
    12. @task
    13. def my_task3(self):
    14. print("excuting MyUser my_task3")

    2、新增了Tag任务标签

            在任务上新增tag标签,在执行时可以使用-T或--tags指定标签执行、-E或--exclude-tags排除指定标签执行。

    1. class MyTaskSet(TaskSet):
    2. @task
    3. @tag("tag1")
    4. def my_task1(self):
    5. print("excuting MyTaskSet my_task1")
    6. @task
    7. @tag("tag1", "tag2")
    8. def my_task2(self):
    9. print("excuting MyTaskSet my_task2")
    10. class MyTaskSet2(TaskSet):
    11. @task
    12. def my_task1(self):
    13. print("excuting MyTaskSet2 my_task1")
    14. @task
    15. @tag("tag2")
    16. def my_task2(self):
    17. print("excuting MyTaskSet2 my_task2")
    18. class MyUser(User):
    19. tasks = [MyTaskSet, MyTaskSet2]
    20. wait_time = between(5, 15)
    21. @task
    22. def userTask(self):
    23. for task in self.tasks:
    24. print(task)
    25. print("excuting MyUser userTask")

    执行locust的命令为

    locust -f locustTest.py --host=https://www.baidu.com --tags tag1 tag2

    3、环境变量发生变化

    1. LOCUST_MASTER 重命名为 LOCUST_MODE_MASTER
    2. LOCUST_SLAVE 重命名为 LOCUST_MODE_WORKER
    3. LOCUST_MASTER_PORT 重命名为 LOCUST_MASTER_NODE_PORT
    4. LOCSUT_MASTER_HOST 重命名为 LOCUST_MASTER_NODE_HOST
    5. CSVFILEBASE 重命名为 LOCUST_CSV

    4、其他变化

            1、master/slave 机制被改变成master/worker。因此执行命令的--slave、--expect-slaves变成了--worker和--expeted-workers;

            2、执行命令中关于--no-web的可选参数变成了--headless;

           3、 移除了 Locust.setup、 Locust.teardown、 TaskSet.setup、 TaskSet.teardown,改用 test_start、test_stop事件监听;

    1. from locust import events
    2. @events.test_start.add_listener
    3. def on_test_start(**kw):
    4. print("test is starting")
    5. @events.test_stop.add_listener
    6. def on_test_start(**kw):
    7. print("test is stopping")

            4、任务顺序类TaskSequence和顺序装饰器@seq_task被替换为 SequentialTaskSet,SequentialTaskSet将忽略任务的权重,任务的执行顺序以任务声明的顺序来执行。

             5、运行数据记录,csv文件,表头发生变化,增加统计,使表头意思更清晰明了;

            6、控制台日志,不在用标准输出stdout(或标准错误输出stderr),要输出日志,可以直接用print()进行输出,也可以用logging模块,定义日志。print()现在仅仅用来输出到标准输出stdout中,logging可以输出到log文件

    1. import logging
    2. logging.info("custom logging message)

    来看一个脚本模板

    1. import random
    2. from locust import HttpUser, task, between, SequentialTaskSet, tag
    3. # 定义一个任务类,这个类名称自己随便定义,
    4. # 类继承SequentialTaskSet 或 TaskSet类,所以要从locust中,引入SequentialTaskSet或TaskSet
    5. # 当类里面的任务请求有先后顺序时,
    6. # 继承SequentialTaskSet类, 没有先后顺序,可以使用继承TaskSet类
    7. class MyTaskCase(SequentialTaskSet):
    8. # 初始化方法,相当于 setup
    9. def on_start(self):
    10. pass
    11. # @task python中的装饰器,告诉下面的方法是一个任务,
    12. # 这个装饰器和下面的方法被复制多次,改动一下,就能写出多个接口
    13. # 装饰器后面带上(数字)代表在所有任务中,执行比例
    14. # 要用这个装饰器,需要头部引入 从locust中,引入 task
    15. @task
    16. @tag("leave_1")
    17. def regist_(self): # 一个方法, 方法名称可以自己改
    18. url = '/erp/regist' # 接口请求的URL地址
    19. # 定义请求头为类变量,这样其他任务也可以调用该变量
    20. self.headers = {"Content-Type": "application/json"}
    21. self.username = "locust_" + str(random.randint(10000, 100000))
    22. self.pwd = '1234567890'
    23. # post请求的 请求体
    24. data = {"name": self.username, "pwd": self.pwd}
    25. # 使用self.client发起请求,请求的方法根据接口实际选,
    26. # catch_response 值为True 允许为失败 ,
    27. # name 设置任务标签名称 -----可选参数
    28. with self.client.post(url,
    29. json=data,
    30. headers=self.headers,
    31. catch_response=True) as rsp:
    32. if rsp.status_code > 400:
    33. print(rsp.text)
    34. rsp.failure('regist_ 接口失败!')
    35. @task # 装饰器,说明下面是一个任务
    36. def login_(self):
    37. url = '/erp/loginIn' # 接口请求的URL地址
    38. data = {"name": self.username, "pwd": self.pwd}
    39. with self.client.post(url,
    40. json=data,
    41. headers=self.headers,
    42. catch_response=True) as rsp:
    43. # 提取响应json 中的信息,定义为 类变量
    44. self.token = rsp.json()['token']
    45. if rsp.status_code < 400 \
    46. and rsp.json()['code'] == "200":
    47. rsp.success()
    48. else:
    49. rsp.failure('login_ 接口失败!')
    50. @task # 装饰器,说明下面是一个任务
    51. def getuser_(self):
    52. url = '/erp/user' # 接口请求的URL地址
    53. # 引用上一个任务的 类变量值 实现参数关联
    54. headers = {"Token": self.token}
    55. # 使用self.client发起请求,请求的方法 选择 get
    56. with self.client.get(url,
    57. headers=headers,
    58. catch_response=True) as rsp:
    59. if rsp.status_code < 400:
    60. rsp.success()
    61. else:
    62. rsp.failure('getuser_ 接口失败!')
    63. # 结束方法, 相当于teardown
    64. def on_stop(self):
    65. pass
    66. # 定义一个运行类 继承HttpUser类, 所以要从locust中引入 HttpUser类
    67. class UserRun(HttpUser):
    68. tasks = [MyTaskCase]
    69. # 设置运行过程中间隔时间 需要从locust中 引入 between
    70. wait_time = between(0.1, 3)
    71. '''
    72. 运行:
    73. 在终端中输入:locust -f 被执行的locust文件.py --host=http://被测服务器域名或ip端口地址
    74. 也可以不指定host
    75. 命令执行成功,会提示服务端口,如:*:8089
    76. 此时,则可通过浏览器访问机器ip:8089,看到任务测试页面
    77. '''

  • 相关阅读:
    redis笔记01-5种数据类型
    python-第12章 魔法方法
    [附源码]计算机毕业设计springboot高校学生宿舍管理系统
    瑞芯微 Rockchip RKNN-Toolkit 环境搭建
    C++中的##、#符号含义
    牛客刷题<九>使用子模块实现三输入数的大小比较
    Java中的dozer对象转换
    Java数组
    用户体验地图是什么?UX设计心得分享
    CentOS7源码安装 lldpd 并附查询脚本
  • 原文地址:https://blog.csdn.net/liuqinhou/article/details/126077980