参考自https://blog.csdn.net/Q0717168/article/details/122612363,http://www.51ste.com/share/det-6428.html
Locust是易于使用的分布式性能测试框架,使用协程的方式模拟用户请求,这与LoadRunner和Jmeter这类采用进程和线程的测试工具不一样,由于线程之间的切换是需要占用资源的,IO的阻塞和线程的sleep会不可避免地导致并发效率下降,所以这类测试工具很难在单机上模拟出较高的并发压力。协程是在用户态完成的,上下文切换的代价远比线程切换代价小得多,因此在单机上Locust能够达到更高数量级的并发。
Demo
trylucost.py
from locust import HttpUser, TaskSet, task
# 定义用户行为classUserBehavior(TaskSet):# 任一测试用例执行前均会执行一次defon_start(self):print('开始性能测试')# 表示一个用户为行,访问百度首页。使用 @task装饰该方法为一个事务。client.get()用于指请求的路径“ / ”,因为是百度首页,所以指定为根路径。@task(1)defindex(self):
self.client.get("/")@task(2)# task()参数用于指定该行为的执行权重。参数越大每次被虚拟用户执行的概率越高。如果不设置默认为1。defindex2(self):
self.client.get("/s?wd=locust&rsv_spt=1&rsv_iqid=0xbb8514200006b7d0&issp=1&f=8&rsv_bp=1&rsv_idx=2&ie=utf-8&tn""=baiduhome_pg&rsv_enter=1&rsv_dl=tb&rsv_sug3=8&rsv_sug1=9&rsv_sug7=101&rsv_sug2=0&inputT=1458&rsv_sug4""=1911&rsv_sug=2")# 用于设置性能测试classWebsiteUser(HttpUser):# 指向一个定义的用户行为类。
tasks =[UserBehavior]# 执行事务之间用户等待时间的下界(单位:毫秒)。如果TaskSet类中有覆盖,以TaskSet 中的定义为准。
min_wait =3000# 执行事务之间用户等待时间的上界(单位:毫秒)。如果TaskSet类中有覆盖,以TaskSet中的定义为准。
max_wait =6000# 设置 Locust 多少秒后超时,如果为 None ,则不会超时。
stop_timeout =5# 一个Locust实例被挑选执行的权重,数值越大,执行频率越高。在一个 locustfile.py 文件中可以同时定义多个 HttpUser 子类,然后分配他们的执行权重
weight =3# 脚本指定host执行测试时则不在需要指定
host ="https://www.baidu.com"
在示例中,定义了针对
https://www,baidu.com
网站的测试场景,分为:
- 用户行为
UserBehavior
类(继承自TaskSet
类):是一个行为集合,定义了用户将执行的任务,on_start(self)
在测试开始之前执行一次,这里用来打印开始性能测试的信息。使用@task()
装饰器标记任务,参数是其权重,决定了任务被执行的相对频率,权重越高,执行的可能性越大。 - 性能测试类
WebsiteUser
(继承自HttpUser
类):定义了用户的行为和测试的配置。
用
locust -f trylucost.py
运行,并用web执行,通过浏览器访问:http://localhost:8089(Locust启动网络监控器,默认为端口号8089)
- 设置模拟用户数
- 设置每秒启动的模拟用户数
- 开始运行性能测试
可以得到如下指标:
- Type:请求的类型,例如GET/POST
- Name:请求的路径。
- request:当前请求的数量
- fails:当前请求失败的数量
- Median:中间值,单位毫秒,一半的服务器响应时间低于该值,而另一半高于该值
- 95%ile,99%ile:响应时间的百分位点,即在所有请求中,由95%或99%的请求响应时间低于这个值
- Average(ms):平均值,单位毫秒,所有请求的平均响应时间
- Min:请求的最小服务器响应时间,单位毫秒
- Max:请求的最大服务器响应时间,单位毫秒
- Average size(bytes):响应的平均大小,以字节为单位,衡量每次请求返回给客户端的数据量的平均值
- Current RPS:RPS(Requests Per Second),每秒处理请求数
- Current Failures/s:每秒发生失败请求的数量
- no-web执行
locust -f test.py --host=https://www.baidu.com --no-web -c 10-r 2-t 1m
locust -f test.py --no-web -c 10-r 2-t 1m # 如果脚本中已经指定host,则不需要再次指定
- -no-web:表示不使用Web界面进行测试
- -c:设置虚拟用户数
- -r 设置每秒启动虚拟用户数
- -t:设置运行时间
关闭服务可直接Ctrl+C。
- 分布式运行和其他参考本文最上方的参考博客。
在性能脚本中设置检查点
在Locust中设置检查点通常意味着在测试脚本中加入断言,以验证某些条件是否满足,比如响应时间、响应状态码、响应体内容等,如:
@taskdefmy_task(self):
response = self.client.get("/my_endpoint")
response.success()# 如果状态码是200-299,将记录为成功
@taskdefmy_task(self):
response = self.client.get("/my_endpoint", catch_response=True)with response as res:if res.elapsed.total_seconds()>1:# 如果响应时间超过1秒
res.failure("响应时间过长")else:
res.success()
@taskdefmy_task(self):
response = self.client.get("/my_endpoint")assert"expected content"in response.text,"响应体不包含预期内容"
版权归原作者 雾重烟秋 所有, 如有侵权,请联系我们删除。