基于python的压力测试框架locust的基础使用

概述

locust是一个用python写的可分布式部署、模拟大量用户同时请求你的web系统或其他系统从而进行压力测试的框架。locust,中文蝗虫,蝗虫过境,寸草不生。估计作者也是这个意思。

github开源地址

官网文档地址

对于压力测试的要点,引用一位网友的观点:

服务端性能测试工具最核心的部分是压力发生器,而压力发生器的核心要点有两个,一是真实模拟用户操作,二是模拟有效并发

那locust是怎么做到这两点的呢?

locust github上的介绍如下:

Locust is an easy-to-use, distributed, user load testing tool. It is intended for load-testing web sites (or other systems) and figuring out how many concurrent users a system can handle.

The idea is that during a test, a swarm of locusts will attack your website. The behavior of each locust (or test user if you will) is defined by you and the swarming process is monitored from a web UI in real-time. This will help you battle test and identify bottlenecks in your code before letting real users in.

Locust is completely event-based, and therefore it's possible to support thousands of concurrent users on a single machine. In contrast to many other event-based apps it doesn't use callbacks. Instead it uses light-weight processes, through gevent. Each locust swarming your site is actually running inside its own process (or greenlet, to be correct). This allows you to write very expressive scenarios in Python without complicating your code with callbacks.

概括一下有以下几个特点:

  1. 简单易用,只需要用python写脚本代码,在代码中去定义用户行为,然后以命令行方式启动脚本代码即可。不像有些测试工具需要操作软件录制脚本或者配置复杂的xml文件。嗯,jmeter也是很优秀的开源工具,不然也不会那么受欢迎,但是总觉得有些傻瓜,也不够灵活,😜。

  2. 在模拟有效并发方面,locust的优势在于其摒弃了进程和线程,完全基于事件驱动,使用gevent提供的非阻塞IOcoroutine来实现网络层的并发请求。

  3. 可以分布式部署,单台机器可以模拟数千用户,也就是说如果有几十台机器,那同时在线用户数可以模拟到百万级,对绝大多数中小公司来说够用了。

  4. 压测过程中可以通过一个web系统实时查看系统的表现,还有数据及图表结果,能导出csv格式的结果文件。

基本的使用方法

第一步:安装locust

首先确保你电脑上已经安装了python开发环境,3.6及以上版本,我目前用的3.7.3版本。

然后可以按照官网的安装说明安装,不同的系统平台会有差异,以MacOS系统为例,打开terminal,先安装libev 依赖:

brew install libev

然后用pip安装locust:

pip3 install locust

locust --help测试一下:

locust1.png

出现上图说明安装成功。

第二步:写脚本代码

先上示例代码,后面会简单介绍

from locust import HttpLocust,TaskSet,between,task

class WebsiteTasks(TaskSet):

    def on_start(self):
        self.client.post("/login", {
            "username": "test",
            "password": "123456"
        })

    @task(2)
    def index(self):
        self.client.get("/")

    @task(1)
    def about(self):
        self.client.get("/about/")

    def on_stop(self):
        print("stop")

class WebSiteUser(HttpLocust):
    task_set = WebsiteTasks
    host = "http://192.168.31.180"
    wait_time = between(1, 2)


在这个示例中,定义了针对http://192.168.31.180网站的测试场景:先模拟用户登录系统,然后随机地访问首页(/)和关于页面(/about/),请求比例为2:1;并且,在测试过程中,每一个模拟出来的用户的两次请求的间隔时间为1~2秒间的随机值。

示例脚本主要包含两个类,一个是WebsiteUser(继承自HttpLocust,而HttpLocust继承自Locust),另一个是WebsiteTasks(继承自TaskSet)。事实上,在Locust的测试脚本中,所有业务测试场景都是在LocustTaskSet两个类的继承子类中进行描述的。

测试开始后,每个虚拟用户(Locust实例)的运行逻辑都会遵循如下规律:

  1. 先执行WebsiteTasks中的on_start(只执行一次),作为初始化;
  2. WebsiteTasks中随机挑选(如果定义了任务间的权重关系,那么就是按照权重关系随机挑选)一个任务执行;
  3. 根据Locustwait_time定义的间隔时间范围(如果TaskSet类中也定义了wait_time,以TaskSet中的优先),在时间范围中随机取一个值,休眠等待;
  4. 重复2~3步骤,直至测试任务终止。
第三步:脚本调试

正式开始前有必要先调试一下脚本,看看报不报错。可以先通过下面这种单机下no-web的形式调试,-f是指定脚本文件名称,-c是指并发用户数量,-r是启动虚拟用户的速率。

locust -f locustfile.py --no-web -c 1 -r 1

如果没有报错,terminal中会打印类似下面的日志信息(因为我的host没开,所以各个结果都是0)

locust2.png
第四步:执行测试

因为我只做了单机单进程模式的测试,所以就不写单机多进程、多机多进程多的测试方法了,毕竟没有亲身实践过的东西咱不能乱说,以后如果用到,再写。

另外我就以默认的web ui based的方式做,这样结果看起来更直观。上面第三步no-web的形式我们也看到了。

在terminal以如下命令启动locust,通常情况下不需额外指定其他参数:

locust -f locustfile.py

Locust默认采用8089端口启动web,如果要使用其它端口,就可以使用如下参数进行指定:

locust -f locustfile.py --port 8089

启动成功后测试并没有开始,还需要在下面的web页面中设置好几个参数。

如果Locust运行在本机,在浏览器中访问http://127.0.0.1:8089即可进入Locust的Web管理页面;如果Locust运行在其它机器上,那么在浏览器中访问http://locust_machine_ip:8089即可。

locust3.png

因为host的地址我已经在脚本中写好了,所以会直接显示在这上面,如果脚本中没写,也可以在这里写。现在只需要设置前两个参数:

  • Number of total users to simulate: 设置并发用户数,对应no_web模式的-c参数

  • Hatch rate (users spawned/second): 启动虚拟用户的速率,对应着no_web模式的-r参数

参数配置完毕后,点击【Start swarming】即可开始测试。

这里我把并发用户数设为100,生成模拟用户的速率设为1,那开始后,就会先有一个动态的用户数量爬坡增长的过程,增长的过程中,每个产生的用户会按照脚本定义的行为去请求网站地址或者接口地址,然后等用户数量增长到100后,对系统的请求数也会维持在一个基本稳定的范围里。

虚拟用户产生的过程如下:

locust5.gif

Locust的结果展示十分简单,主要就四个指标:并发数RPS响应时间异常率。但对于大多数场景来说,这几个指标已经足够了。

测试完成后,可以查看图表结果,也可以下载csv格式的文件。

locust4.png

总结

本文只是基本的介绍了一下locust,和基础的使用方法。高阶的用法还需要配合实战进行研究使用。

参考文章

深入浅出开源性能测试工具 Locust(使用篇)

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,530评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 86,403评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,120评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,770评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,758评论 5 367
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,649评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,021评论 3 398
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,675评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,931评论 1 299
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,659评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,751评论 1 330
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,410评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,004评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,969评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,203评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,042评论 2 350
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,493评论 2 343

推荐阅读更多精彩内容