locust升级到1.0版本时,引入了毕竟大的变化,下面总结一下,引文官方文档可以参考Changelog Highlights — Locust 2.10.2.dev27 documentation 。
1、Locust类和HttpLocust类重命名为User类和HttpUser类;
2、TaskSet类的locust属性也被重命名为user;
3、 Loust类的task_set属性被移除了,取而代之的是在User类上新增了tasks属性;
4、可以在继承User类下,直接使用@task装饰器来定义任务;
5、设置users数量的参数-c / --client 被重命名为-u / --users。
- from locust import task, between, TaskSet, User
-
-
- class MyTaskSet(TaskSet):
-
- @task
- def my_task1(self):
- print("excuting MyTaskSet my_task1")
-
- @task
- def my_task2(self):
- print("excuting MyTaskSet my_task2")
-
-
- class MyUser(User):
- tasks = [MyTaskSet]
- wait_time = between(5, 15)
-
- @task
- def my_task3(self):
- print("excuting MyUser my_task3")
在任务上新增tag标签,在执行时可以使用-T或--tags指定标签执行、-E或--exclude-tags排除指定标签执行。
- class MyTaskSet(TaskSet):
-
- @task
- @tag("tag1")
- def my_task1(self):
- print("excuting MyTaskSet my_task1")
-
- @task
- @tag("tag1", "tag2")
- def my_task2(self):
- print("excuting MyTaskSet my_task2")
-
- class MyTaskSet2(TaskSet):
-
- @task
- def my_task1(self):
- print("excuting MyTaskSet2 my_task1")
-
- @task
- @tag("tag2")
- def my_task2(self):
- print("excuting MyTaskSet2 my_task2")
-
- class MyUser(User):
- tasks = [MyTaskSet, MyTaskSet2]
- wait_time = between(5, 15)
-
- @task
- def userTask(self):
-
- for task in self.tasks:
- print(task)
- print("excuting MyUser userTask")
执行locust的命令为
locust -f locustTest.py --host=https://www.baidu.com --tags tag1 tag2
- LOCUST_MASTER 重命名为 LOCUST_MODE_MASTER
- LOCUST_SLAVE 重命名为 LOCUST_MODE_WORKER
- LOCUST_MASTER_PORT 重命名为 LOCUST_MASTER_NODE_PORT
- LOCSUT_MASTER_HOST 重命名为 LOCUST_MASTER_NODE_HOST
- 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事件监听;
- from locust import events
-
- @events.test_start.add_listener
- def on_test_start(**kw):
- print("test is starting")
-
- @events.test_stop.add_listener
- def on_test_start(**kw):
- print("test is stopping")
4、任务顺序类TaskSequence和顺序装饰器@seq_task被替换为 SequentialTaskSet,SequentialTaskSet将忽略任务的权重,任务的执行顺序以任务声明的顺序来执行。

5、运行数据记录,csv文件,表头发生变化,增加统计,使表头意思更清晰明了;
6、控制台日志,不在用标准输出stdout(或标准错误输出stderr),要输出日志,可以直接用print()进行输出,也可以用logging模块,定义日志。print()现在仅仅用来输出到标准输出stdout中,logging可以输出到log文件
- import logging
- logging.info("custom logging message)
来看一个脚本模板
- import random
- from locust import HttpUser, task, between, SequentialTaskSet, tag
-
-
- # 定义一个任务类,这个类名称自己随便定义,
- # 类继承SequentialTaskSet 或 TaskSet类,所以要从locust中,引入SequentialTaskSet或TaskSet
- # 当类里面的任务请求有先后顺序时,
- # 继承SequentialTaskSet类, 没有先后顺序,可以使用继承TaskSet类
-
- class MyTaskCase(SequentialTaskSet):
- # 初始化方法,相当于 setup
- def on_start(self):
- pass
-
- # @task python中的装饰器,告诉下面的方法是一个任务,
- # 这个装饰器和下面的方法被复制多次,改动一下,就能写出多个接口
- # 装饰器后面带上(数字)代表在所有任务中,执行比例
- # 要用这个装饰器,需要头部引入 从locust中,引入 task
- @task
- @tag("leave_1")
- def regist_(self): # 一个方法, 方法名称可以自己改
- url = '/erp/regist' # 接口请求的URL地址
- # 定义请求头为类变量,这样其他任务也可以调用该变量
- self.headers = {"Content-Type": "application/json"}
- self.username = "locust_" + str(random.randint(10000, 100000))
- self.pwd = '1234567890'
- # post请求的 请求体
- data = {"name": self.username, "pwd": self.pwd}
- # 使用self.client发起请求,请求的方法根据接口实际选,
- # catch_response 值为True 允许为失败 ,
- # name 设置任务标签名称 -----可选参数
- with self.client.post(url,
- json=data,
- headers=self.headers,
- catch_response=True) as rsp:
- if rsp.status_code > 400:
- print(rsp.text)
- rsp.failure('regist_ 接口失败!')
-
- @task # 装饰器,说明下面是一个任务
- def login_(self):
- url = '/erp/loginIn' # 接口请求的URL地址
- data = {"name": self.username, "pwd": self.pwd}
- with self.client.post(url,
- json=data,
- headers=self.headers,
- catch_response=True) as rsp:
- # 提取响应json 中的信息,定义为 类变量
- self.token = rsp.json()['token']
- if rsp.status_code < 400 \
- and rsp.json()['code'] == "200":
- rsp.success()
- else:
- rsp.failure('login_ 接口失败!')
-
- @task # 装饰器,说明下面是一个任务
- def getuser_(self):
- url = '/erp/user' # 接口请求的URL地址
- # 引用上一个任务的 类变量值 实现参数关联
- headers = {"Token": self.token}
- # 使用self.client发起请求,请求的方法 选择 get
- with self.client.get(url,
- headers=headers,
- catch_response=True) as rsp:
- if rsp.status_code < 400:
- rsp.success()
- else:
- rsp.failure('getuser_ 接口失败!')
-
- # 结束方法, 相当于teardown
- def on_stop(self):
- pass
-
-
- # 定义一个运行类 继承HttpUser类, 所以要从locust中引入 HttpUser类
- class UserRun(HttpUser):
- tasks = [MyTaskCase]
- # 设置运行过程中间隔时间 需要从locust中 引入 between
- wait_time = between(0.1, 3)
-
-
- '''
- 运行:
- 在终端中输入:locust -f 被执行的locust文件.py --host=http://被测服务器域名或ip端口地址
- 也可以不指定host
- 命令执行成功,会提示服务端口,如:*:8089
- 此时,则可通过浏览器访问机器ip:8089,看到任务测试页面
- '''