测试开发学苑 性能专题:Locust 工具实战之开篇哲学三问

狂师 · 2019年11月25日 · 最后由 JonnySen 回复于 2019年11月25日 · 4081 次阅读

阅读全文需 7 分钟,作为性能工具实战开篇,请认真读完。

1. 前言

在上一篇性能专题的文章:性能专题:性能测试实施全过程指南,已提前剧透告知了,从本篇开始,将结合服务端性能测试的两款常用工具进行实战操作介绍:Jmeter 和 Locust。 

就服务端性能测试而言,工具选择性上面,Jmeter 的选择热度和网上已有的学习资料明显高于 Locust,也正因如此,本篇计划会以 Locust 工具系列的实战介绍优先,算是弥补目前市面上 Locust 学习资料较少的空缺。

整个 Locust 系列连载内容目录大纲如图 1 所示,每篇具体的名称和内容后续可能会有所调整,最终以发表的为准:

2. 开篇介绍

在学习任何一款新工具之前,首先至少要先了解搞清楚这款工具的 “哲学三问”:我是谁(是什么),我从哪里来(为了解决什么问题),我将去哪里(具体是如何实现的)。

关于第一问:是什么,Locust 到底是什么呢?先来看一段官网的介绍,如图 2 所示

官网传送门:https://www.locust.io/

在图 2 官网主页介绍中,有两句对 Locust 的描述:

An open source load testing tool.

一个开源负载测试工具。

Define user behaviour with Python code, and swarm your system with millions of simultaneous users.

使用 Python 代码来定义用户行为。用它可以模拟百万计的并发用户访问你的系统。

看到这里,相信读者对 Locust 是什么,有了一个大致的印象,概括起来:Locust 是一款开源的性能负载测试工具,且是使用 Python 代码来定义用户行为的。

3. 进一步认识 Loucst

当前在网络上针对 Locust 的教程比较少,不管是中文还是英文,基本都是介绍安装方法和简单的测试案例演示,对于较复杂测试场景的案例演示却基本没有,因此很多工程师都感觉难以将 Locust 应用到实际的性能测试工作当中。有这类想法的人员,归根结底还是在于没有深入去学习了解 Locust 这款工具。

对于技术人而言,学习一款新工具,特别还是开源工具,最好的方式就是结合官网文档和项目源码来学习。

Locust 官方文档:https://docs.locust.io/en/stable/Locust
官方源码:https://github.com/locustio/locust

关于第二问:Locust 为了解决什么问题?从前面我们可以得知,官网对 Loucst 定位是一款负载测试工具。

而 Locust 一词英文翻译过来的意思为蝗虫,

原作者之所以选择 Locust 这个蝗虫名字,估计也是听过这么一句俗语,“蝗虫过境,寸草不生”。寓意为:Locust 工具生成的并发请求就跟一大群蝗虫一般,对我们的被测系统发起攻击,并以此检测系统在高并发压力下是否能正常运转。

在官方文档中,关于 Locust 介绍有这样一段描述:

通过上述官网对 Locust 的介绍,可以进一步加深认识 Locust:它是一款开源的分布式负载测试工具,使用 Python 代码定义用户行为,完全基于事件驱动,在模拟并发时,Locust 基于 gevent 协程、非阻塞 IO 来实现网络层的并发请求,可以实现单机模拟生成较高的并发压力。

4. Locust 特点、实现

Locust 是使用 Python 语言编写实现的开源性能测试工具,具有简洁、轻量、高效的优点,除此之外,还具备如下特点。

主要特点如下:

  • 使用纯 Python 来描述测试脚本、定义用户行为。

  • 分布式和可扩展,可支持成千上万的用户。

  • 基于 Web 的用户界面,用户可以实时监控测试脚本运行状态。

  • 几乎可以测试任何系统,除了 Web HTTP 接口外,还可自定义 Clients 测试其他类型系统。

  • Hackable,可定制性较高。

关于第三问:具体是如何实现的?

了解过性能测试的同学,应该都清楚,实现性能测试,其中有两个关键:

  • 尽可能模拟到真实用户行业。

  • 尽可能模拟更高的(有效)并发数。

关于第一点,尽可能模拟到真实用户行为:我们从上述介绍中可以得知,在 Locust 中,测试场景皆是采用纯 Python 脚本进行描述的。对于最常见的 HTTP(S) 协议的系统,Locust 采用的是 Python 的 Requests 库作为客户端,而对于其它协议类型的系统,Locust 也提供了接口,我们只需要采用 Python 编写对应的请求客户端。换而言之,只要你具备了 Python 编码能力,并且熟悉业务流程,就能很容易的在 Locust 中通过 Python 脚本实现模拟到真实用户行为。

对于第二点,如何实现有效的高并发

LoadRunner 和 Jmeter 这类采用进程和线程的测试工具,都很难在单机上模拟出较高的并发压力。而 Locust 的并发机制摒弃了进程和线程,基于事件驱动,采用 gevent 提供的非阻塞 IO 和 coroutines 协程机制。而协程避免了系统级资源调度,由此可以大幅提高单机的并发能力。并且 Locust 支持分布式多机联合测试,从而可以实现极高的并发数。

6. 小结

介绍到这里,相信读者们对 Locust 已经有了一定的认识,总结归纳成两点:

  • Locust 是开源,使用 Python 开发,基于事件,支持分布式并且提供 Web UI 执行测试执行和结果显示的性能测试工具。它之所以能够在资源占用方面明显优于 Jmeter,一个关键点在于两者模拟虚拟用户的方式不同,Jmeter 是通过线程来作为虚拟用户,而 Locust 借助 gevent 库对协程的支持,相同配置下 Locust 能支持的并发用户数相对 Jmeter 可以达到一个数量级的提升。(其中,gevent 是 Python 下实现协程的一个第三方库,通过 greenlet 来实现协程,而 greenlet 是 Python 的并行处理的一个库,能够使系统获取极高的并发性能)

  •  Locust 作为一款性能测试工具,可以说是它是由 Python 下的一些库集成而来。Locust 完全基于 Python 作为编程语言,采用 Pure Python 描述测试脚本,其中 HTTP 请求是基于 Requests 库,除了 HTTP/HTTPS 协议,Locust 也可以测其他协议的系统,只需要采用 Python 调用对应的库进行请求描述即可。

文章虽短,但也花费了笔者周末一个小时才码完,我想已经成功的引起了你的兴趣,接下来就跟着一起学习 Locust 的使用吧。

未完待续~

希望这篇文章能帮到你!更多干货文章请关注我们。

最后,公号「测试开发技术」后台回复 hi,免费领取全栈工程师进阶高清图谱。

如果觉得我的文章对您有用,请随意打赏。您的支持将鼓励我继续创作!
共收到 1 条回复 时间 点赞

楼主你好,请教个 locust 的用法,如何实现 “起始并发数 500,每分钟固定增加 200 并发,直到响应时间大于 5 秒或错误率大于 10% 自动停止” 这个功能呢,我用 jmeter 是可以实现的,但 locust 不知道怎么用,能否指点下?😀

需要 登录 后方可回复, 如果你还没有账号请点击这里 注册