目录
前言:
Locust 是一个开源的性能测试工具,可以帮助我们快速地进行网站性能测试和压力测试。Locust 采用了 Hadoop 和 NGINX 的设计思想,可以支持大规模的并发请求,并且具有非常高的可扩展性和灵活性。在实际的应用中,Locust 已经被广泛地使用,包括阿里巴巴、腾讯、百度等大型公司。
为什么要做工具评测
作为性能测试的老司机们而言,要么对各大性能测试工具的特性都了然于心了,要么已经使用 “惯” 了手头上的工具;他们是不会没事做个性能评测的,只有新手们才会认认真真的、按部就班的从第一步走起。
而对于性能测试而言,首要的任务自然是选择工具了。所以就有了性能测试工具评测这一趴!
为什么要解析 Locust 源码
由于 Python 是我的主语言,所以在选择性能工具评测的时候,自然是会多 “关照” 下 Locust 了。因为对评测的结果不是很满意,所以就乘着兴致顺便看了下源码。而本文就是对 Locust 源码解析的简述。
Locust 的执行流程
首先,来看下 Locust 的执行命令如下:
locust -f performan.py --host http://www.testqa.cn --no-web -c 10 -r 5 -t 50s
# 执行performan.py进行性能测试,并发数为10,每秒启动5个并发,执行时间为50秒
那么执行了这一条语句后,Locust 究竟在后台做了哪些事情呢?请看下面的程序执行流程。
|--Python进程
|--主线程
|--参数解析(-f、--host等)
|--性能场景脚本(-f参数后的文件名)加载、分析VUser数量
|--协程1(local、master、slave)
|--计算各VUser的并发数占比(按VUser的权重)
|--生成VUser启动列表
|--启动VUser协程组
| |--子协程1(对应一个VUser)
| |--...
| |--子协程N
| |--获取VUser任务集
| |--循环执行任务(顺序、按权重)
| | |--嵌套执行子任务
| |--执行指定时间后停止(需设定)
|
|--协程组阻塞等待
接下来,我们一个个的来过一下。首先启动进程和主线程这个不用讲,所有的程序都是一样的。然后再是参数解析,这个也是大多数程序都会提供的常规逻辑。
在解析-f 参数成功之后(没有指定-f 参数则不会启动成功),会去自动的导入该脚本模块;再通过 python 的自省能力来检查脚本中的 VUser 类,主要检查继承自 Locust 且带有 task_set 属性的子类;一个子类相当于一个 VUser。通过-l 参数则可以直接列出脚本中所有的 VUser 名称且不会执行脚本。
当 VUser 类都检查完毕之后,会把这些 VUser 类收集到一个列表中去;之后就会根据指定的启动模式(local、no-web、master、slave)来启动一个协程,并且会把 VUser 列表和解析后的命令行参数内容都作为参数传递过去。
在该协程中会先计算各 VUser 的权重,这会影响 VUser 被执行的次数。具体的实现代码如下:
def wei