locust学习记录
core文件
task装饰器的实现
task装饰器用于给任务设置执行权重的,设置了任务的 locust_task_weight属性。
Locust类的实现。
Locust类中包含的属性有:
host(测试地址),
min_wait, max_wait, (这个locust任务各任务间的执行间隔)
task_set, (TaskSet类,定义这个locust的任务执行行为)
stop_timeout,(locust的生命周期)
weight,(这个locust的比重)
client, (用来扩展locust测试对象的,比如client是个httpclient,则locust是个httplocust,同时也可以是xmppclient等等。)
包含的方法有:
run:task_set(Locust).run()
TaskSet元类
作用是在创建时更新TaskSet类的tasks属性,将tasks属性更改为一个list,list内容为callable对象,list中callable对象出现的概率由callable对象的weight决定。此元类主要做的事情有:
将继承类中的tasks内容直接拿过来,将属性中有locust_task_weight属性的属性添加进tasks(频率由locust_task_weight决定),将类创建时传入的tasks属性(一般是[(taskn,weightn ),]或者{taskn:weightn, }的形式)中的task添加进tasks(频率由weight决定)
TaskSet类
属性:
tasks属性:list of callable或者元组列表(callable,weight),或一个字典{callable:weight,}
min_wait, max_wait意义同Locust类中同名参数一致,而且如果设置为非零值,会对Locust类中的同名参数进行重写
locust:指向Locust主测试类
parent:此类的父类TaskSet或Locust类,注意非继承关系。
方法:
run:如果有on_start方法,则先执行on_start,然后进入循环,如果locust测试类中有定义stop_timeout则循环总时间就会被指定为此值,如果没有定义此时间,那么循环将永远执行下去直到出现异常。循环中主要分为两部分,错误处理和业务处理部分;业务处理部分内容为,先检索任务队列中是否有内容,如果有内容则执行一条任务,如果没有任务则排任务进去然后再执行一条任务。错误处理部分如果执行抛出了RescheduleTaskImmediately错误,则什么都不做再次进入下一个循环,如果出现了RescheduleTask错误则交出cpu执行权一段时间(任务执行的间隔时间)后再次进入下一轮循环;如果出现了StopLocust,GreenletExit错误退出循环并raise error;出现了其它的错误若locust属性中的_catch_exceptions为True(默认为True)则将代码的详细错误信息输出到stderr然后等待任务执行间隔时间后开始下一轮循环,如果_catch_exceptions为False则直接终止循环抛出异常。
cach
定义了一个装饰器,memoize, 此装饰器有两个参数,timeout和dynamic_timeout,timeout时间设定了被装饰的对象的执行频率,被装饰的对象首次被调用时,总是会被执行,当被再次调用的时候,装饰器会判断本次调用和上次执行完成的时间差,若大于timeout则执行,若小于timeout则不执行。定义了被装饰对象执行的频率。
dynamic_timeout开启时,当被调用对象两次执行的间隔大于timeout时间,则timeout时间会被动态的设置为原来的2倍。