背景:

LoadRunner,jmeter,Apache Benchmark 是测试人员最常使用的性能测试工具,以前的工作中一直使用 LoadRunner,现在需要从 LoadRunner 转向开源免费性能测试工具时,需要去进行新测试工具的学习。由于测试人员对 python 相对熟悉而且 python 流行度也处于不断上升的趋势,基于以上考虑,想寻找一款有 python 支持的性能测试工具,并且代码编辑功能比 jmeter 强的开源工具或框架(jmeter 中编写代码在 swing 控件中编写非常的不便,除非不使用 beanshell 而采用扩展 jar 包自定义插件或自定义方法)。机缘巧合发现 locust 框架,打算进行一些学习并在项目的性能测试中使用和总结。

Locust 的介绍:

Locust 是一个比较新的 python 性能测试框架,在近几年才受到关注。该框架的主要功能是可以让用户使用纯 python 进行性能测试脚本的开发。Locust 具有高扩展性,它是一个完全事件驱动的框架,它拥有一个很大和快速发展的社区,Locust 完全基于事件,因此可以在一台计算机上支持数千个并发用户,与许多其他基于事件的应用程序相比,它不使用回调。相反,它通过协程(gevent)机制使用轻量级过程。

Locust 内置功能只支持 http 的 web 接口的测试,因为用户可以使用 python 进行 locust 的扩展,所以任何 python 支持的功能 locust 都可以支持,但自定义的脚本都需要额外的开发工作。以下的例子都会以 http 接口的性能测试为例,进行一些探索和学习。

locust 的权重设置比较灵活,可以设置每个方法接口访问的比例。例如有 3 个接口分别设置了 3,12,2 那访问第一个接口的比例为 3/(3+12+2),第二个接口的比例为 12/(3+12+2)。

还提供一种比较灵活的是嵌套任务,例如可以先设置权限 1,2 那流量就会按照 1/3,2/3 进行划分。然后在 2/3 的流量中再次进行流量的切分,分别设置 3,7,1 那流量会再次按照 3/(3+7+1),7/(3+7+1),1/(3+7+1) 进行分流。

Locust 还提供顺序的任务,使用@seq_task进行标识。

Locust 提供一种可以在脚本运行中,使一定数量的线程退出脚本运行的机制。某个接口设置了比例 1,1 那就会有 50% 的脚本在运行时慢慢的退出,这样可以更好的模拟一些真实的场景,例如在电商网站模拟一些用户在浏览商品后退出网站的行为,提供更好的灵活性。

Locust 是一个事件驱动的框架,例如在请求成功,请求失败,error 报错,达到集结点,退出事件时触发某些方法。

Locust 的运行方式可以使用命令行的方式,也有界面模式。Locust 内置一个使用 flask 实现的 web 服务。
命令行采用 locust -f 4traing_taskLocust.py --no-web -c 2 -r 1 -t 1m 的形式运行-f 制定需要运行的脚本,--no-web 制定是在命令行下运行没有界面,-c 表示并发用户,-r 表示每秒起多少用户,-t 运行时间。

分布式运行

locust -f viewXXXDetail.py --master

locust -f viewXXXDetail.py --slave 同一台机器

locust -f viewXXXDetail.py --slave --master-host 另一台机器

Locust 项目中的尝试使用

介绍完了 locust 的特性,我们来看下在项目的日常性能测试中,locust 如何使用。所有接口都采用同时触发的形式,没有先后运行的顺序。

Locust 没有像 jmeter 那样的 csv 读取器,使用函数生成随机数等功能,所有的数据准备,读取都需要自行代码的实现。数据可以通过 list,dict 等 python 数据类型进行存储,如果是使用 excel 或者 csv 等格式的数据,需要自行编写读取数据,循环数据的代码。没有即插即用的插件和方法。

Locust 接口的请求基于 requests 库实现,可以通过调用 client.post,client.get 等方法实现,通过 headers,data 入参进行接口参数的传递和使用 requests 库的方法相似。但代码中需要使用 client.post 的方法而不是 requests.post,不然无法在界面上监控到接口的请求,无法统计性能的指标。

例如在性能测试的场景中,如果用户查看订单详情的页面时,页面的总数超过一页时就随便进入当前页的某个详情页面,如果页数小于一页时那就在已有的条数中随机选择一个详情页进行查看。可以使用代码方便的编写任何逻辑。

Locust 没有像 jmeter 那样的响应断言的检查插件,所有的逻辑校验需要自行进行响应体 json 格式的解析,然后判断并调用 response.failure 方法进行设置具体的输出信息,该方法是 locust 自带方法,设置后就可以在页面的 failures tab 中查看具体日志。




Locust 并没有像 perMon 的插件可以监控服务器端使用资源,需要使用第三方的软件进行监控,一般可以使用 nmon,或者 Granfana 等。

Locust 实践后总结

经过一段时间的实践,对比以前用过的其他工具,发现 locust 有如下优点

1. 使用的内存相对较少

进行一定的测试后发现在和 jmeter 的对比中内存消耗较小。在 GUI 模式下 Jmeter 的消耗是 Locust 的 30 倍,在 non-GUI 模式下内存消耗 jmeter 仍然是 locust 的 14 倍。单机的并发能力比较出色。

2. 脚本灵活

Python 实现所有脚本的逻辑,灵活性较大。并提供了事件驱动能力,脚本分流控制,脚本的退出等,可以使用脚本编写任何形式的脚本逻辑。使用 ide 进行编写代码,比在 jmeter 的 swing 控件中编写可以很大的提高效率。

3. 提高自己的编码能力

若站在提高脚本能力,学习新技术的角度出发,locust 需要编写大量的代码来完成性能测试。Locust 只提供基础的并发功能和 api,其他所有的脚本开发都需要编码完成。无疑是对自己编码能力的一个提升。

4. 只需要掌握 python 语法

无需去学习其他性能测试工具的使用和提供的语法,只要掌握 python 的语法和库就可以轻松的入手。

不过 locust 也有一些地方不是很友好,比如

1. 不支持录制回放

2. 报告较弱

只在 download data tab 中提供一个压测数据的下载,没有报告的生成。

3. 参数化,校验等都需要自行编写代码

4. 比较小众
所以在学习资料方便相对较少,掌握的人也较少不利于互相的学习提高。

还有重要的一点是学习成本:需要较强的 python 能力,而不是使用比较完善的即插即用的工具,需要花费大量学习时间。所有的扩展例如支持 dubbo 或者其他协议也需要额外的编码,工作量较大。如测试人员本身就掌握 python 就可以方便上手,而不用去学习性能测试工具的使用和语法。对于在项目团队中快速普及存在制约作用。

总结:

对于 locust 的探索学习总结,这是一个可以提高自身编程能力,学习新的性能测试脚本思路的框架。但 locust 比较小众,且对无编程经验人学习成本较大,资料也相对较少,在以任务为目的的性能测试中并不是最佳的选择,但在学习提高的层面可以进行一定的学习,拓展自己的认识和思路。

更多详情交流加微信:


↙↙↙阅读原文可查看相关链接,并与作者交流