先说明一下执行的方法
:
- 每次写完代码都要在Pycharm的Terminal/终端中执行命令:
locust -f 文件名.py --host=https://api.weixin.qq.com
如果你有测试地址,可以换成你的地址,现在只是演示用法,所以写了地址也没有做请求。 - 终端执行以后
点击上面链接或刷新网站这个地址页面都可以
然后点击Start swarming
,我们这里了解代码写法,所以用户数和每秒增加用户数都不用管。
如果要中断执行,可以在终端中通过Control c
中断,也可以再页面点击Stop
停止
前后置
有时候我们做压测前需要先登录,然后才能执行测试
locust提供了on_start
和on_stop
方法,类似selenium中的setUpClass
和tearDownClass
,这两个方法只有在测试开始和测试结束/中断时执行一次。
from locust import HttpUser, task, between, events
class QuickstartUser(HttpUser):
wait_time = between(1, 2)
def on_start(self):
print("每个用例前执行一次")
@task
def get_access_token(self):
print("标记为task(3)的用例")
def on_stop(self):
print("停止测试时执行")
在终端执行命令locust -f testindex.py --host=https://api.weixin.qq.com
执行结果:
wait_time
:设定每个任务执行中间的间隔时间,between(min, max)
表示在最小值和最大值中间随机取;constant
表示间隔固定时间。
@task任务装饰器
@task
装饰器:定义任务的方式。比如on_start
和on_stop
我们只是做一些前后操作准备,而通过@task
装饰的方法才是我们真正要执行的测试用例。@task
可以通过数字标记权重,比如
from locust import HttpUser, task, constant
class QuickstartUser(HttpUser):
wait_time = constant(1)
@task(2)
def create_tags(self):
print('标记为task(2)的用例')
@task(1)
def get_access_token(self):
print("标记为task(1)的用例")
@task(3)
def my_test(self):
print("标记为task(3)的用例")
在终端执行命令:locust -f createFlag.py --host=https://api.weixin.qq.com
注意:任务权重,代表任务执行的概率,数字越大,被执行到的可能性就越大,可以看到,因为task(3)
方法权重最高,所以他被执行到的次数最多,我执行了5秒,得到的输出除了个别task(2),都是task(3),而task(1)根本没有被执行到,这与用例执行间隔时长无关。也就是说你不能利用权重来给用例排执行的顺序
,因为权重高的可能执行了100次,而权重低的一次都没有执行。执行的顺序目前来看只能你通过代码执行顺序进行定义。
也可以通过列表或者字典来标记task,例如:
代码语言:javascript复制
from locust import constant, User
def create_tags(self):
print('标记为task(2)的用例')
def get_access_token(self):
print("标记为task(1)的用例")
def my_test(self):
print("标记为task(3)的用例")
class MyUser(User):
tasks = [create_tags, get_access_token, my_test]
wait_time = constant(1)
这里没有加权重,执行结果就是随机的
如果需要权重信息,可以利用字典:
代码语言:javascript复制
from locust import constant, User
def create_tags(self):
print('标记为task(2)的用例')
def get_access_token(self):
print("标记为task(1)的用例")
def my_test(self):
print("标记为task(3)的用例")
class MyUser(User):
tasks = tasks = {create_tags: 1, get_access_token: 4, my_test: 3}
wait_time = constant(1)
@tag标签装饰器
可以利用@tag(tag_name)
给用例打标签,方便执行的时候只执行标签用例,或者排除某些用例
# coding: utf-8
from locust import constant, User, tag
@tag(3)
def create_tags(self):
print('标记为task(2)的用例')
@tag('tag1')
def get_access_token(self):
print("标记为task(1)的用例")
@tag('tag1', 'tag2')
def my_test(self):
print("标记为task(3)的用例")
class MyUser(User):
tasks = {create_tags: 1, get_access_token: 4, my_test: 3}
wait_time = constant(1)
如果只想执行tag2、tag3标签用例,则:
locust -f createFlag.py --tags tag2 tag3 --host=https://api.weixin.qq.com
注意,执行多个标签用例时,执行哪个、分别执行多少次,都是随机的。即使是我们刚才说的权重,也只能说权重高的比权重低的被执行的概率高。
如果只是不执行tag2标签用例,则:
locust -f createFlag.py --exclude-tags tag2 --host=https://api.weixin.qq.com
Events
- test_start和test_stop
当定义了类时,通过on_start
和on_stop
可以实现对任务开始和结束操作的定义。但是如果没有定义类,这两个方法就不起作用了,这时候就可以通过事件
的test_start
和test_stop
进行监听
# coding: utf-8
from locust import constant, User, tag, events
@events.test_start.add_listener
def on_test_start(environment, **kwargs):
print("A new test is starting")
@events.test_stop.add_listener
def on_test_stop(environment, **kwargs):
print("A new test is ending")
@tag('tag3')
def create_tags(self):
print('标记为task(2)的用例')
@tag('tag1')
def get_access_token(self):
print("标记为task(1)的用例")
@tag('tag1', 'tag2')
def my_test(self):
print("标记为task(3)的用例")
class MyUser(User):
tasks = [create_tags, get_access_token, my_test]
wait_time = constant(1)
执行locust -f createFlag.py --host=https://api.weixin.qq.com
- init
初始化监听,一般用于多并发模式。类似Jmeter多并发,除了Master主机还有很多Slave从机,当你需要声明一个全局变量时,就可以利用init事件监听
代码语言:javascript复制from locust import events
from locust.runners import MasterRunner
@events.init.add_listener
def on_locust_init(environment, **kwargs):
if isinstance(environment.runner, MasterRunner):
print("I'm on master node")
else:
print("I'm on a worker or standalone node")
这个代码是官网给的案例,我们还没有到多并发那一步,暂时不做分析。