先说明一下执行的方法
:
每次写完代码都要在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, eventsclass 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, constantclass 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,例如:
from locust import constant, Userdef 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 )
这里没有加权重,执行结果就是随机的
如果需要权重信息,可以利用字典:
from locust import constant, Userdef 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 当定义了类时,通过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
初始化监听,一般用于多并发模式。类似Jmeter多并发,除了Master主机还有很多Slave从机,当你需要声明一个全局变量时,就可以利用init事件监听
from locust import eventsfrom 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" )
这个代码是官网给的案例,我们还没有到多并发那一步,暂时不做分析。