一个更好用的性能测试框架

Hi!大家好呀!我是你们努力喵哥!

大家应该对 Jmeter 都不陌生吧。Jmeter 是现在最常用的性能测试工具。对于测试人员来说,Jmeter 技术是必不可少的。

但是,今天喵哥推荐的可不是 Jmeter。因为对于喵哥,Jmeter 有一些喵哥不太顺手的地方。

首先,Jmeter 提供了一个非常完善的 UI 界面。使用者需要在 UI 界面上选择组件来组建起测试脚本。对于很多人来说,可能比较直观。但是,这种方式使整个测试脚本失去了灵活性,只能构建一些简单的测试逻辑。

再则,Jmeter 模拟的负载是线程绑定的,意味着模拟的每个用户,都需要一个单独的线程。单台机器可模拟的负载数有限。对于我们使用个人 PC 测试的话,是非常不利的。

因此今天,喵哥要给大家推荐另一款性能测试神器 Locust。Locust 的寓意是蝗虫。Locust 希望工具生成并发请求就和一大群蝗虫一般,向我们的被测系统发起攻击,以此测试系统在高并发压力下是否能正常运转。

再来严肃的介绍下。Locust 是一款易于使用的分布式负载测试工具。其完全基于事件机制,即一个 Locust 节点也可以在一个进程中支持数千并发用户。不使用回调,通过 gevent 使用轻量级过程(即在自己的进程内运行)。

特性

用 Python 编写用户测试方案

不需要笨拙的UI或庞大的XML,只需编写代码即可。基于协程而不是回调,您的代码逻辑和行为类似于正常的 Python代码。

分布式和可扩展-支持数十万用户

Locust 支持在多台计算机上分布的运行负载测试。由于基于事件,因此即使一个蝗虫节点也可以在单个过程中处理数千个用户。其背后的部分原因是,即使您模拟了这么多用户,也并非所有人都在积极使用您的系统。每秒请求数不等于在线用户数。

基于 Web 的 UI

Locust 具有简洁的 HTML + JS,可实时显示所有相关的测试详细信息。而且由于 UI 是基于 Web 的,因此它是跨平台的并且易于扩展。

可以测试任何系统

即使 Locust 是面向Web的,它也可以用于测试几乎所有系统。只需编写一个您想要测试的客户端并将其与用户一起使用!超级容易!

可入侵的

蝗虫非常小,非常容易入侵,我们打算保持这种状态。事件 I / O 和协程的所有繁重工作都委托给gevent。替代测试工具的脆弱性是诞生 Locust 的原因。

安装

支持的python版本:2.7、3.4、3.5、3.6。

  • 首先升级pip,不然可能会报错pip install --upgrade pip然后安装Locustpip install Locust安装完成

    如果打算运行Locust 分布在多个进程/机器,需要安装 pyzmq。

  • 通过pip命令安装。pip install pyzmq

    使用

    在Locust中,您可以使用Python代码定义用户行为。然后,您可以使用该locust命令和(可选)其Web界面在收集请求统计信息时生成并模拟其中的许多用户。

  • locustfile.py示例import randomfrom locust import HttpUser, task, betweenclass QuickstartUser(HttpUser):      wait_time = between(5, 9)      @task      def index_page(self):          self.client.get("/hello")          self.client.get("/world")      @task(3)      def view_item(self):          item_id = random.randint(1, 10000)          self.client.get(f"/item?id={item_id}", name="/item")      def on_start(self):          self.client.post("/login", {"username":"foo", "password":"bar"})

    让我们分解一下。

  • import randomfrom locust import HttpUser, task, between

    蝗虫文件只是普通的Python模块,它可以从其他文件或包中导入代码。

  • class QuickstartUser(HttpUser)

    在这里,我们为要模拟的用户定义一个类。它继承自 HttpUser该client属性,从而为每个用户提供一个属性,该属性是的一个实例HttpSession,可用于向要加载测试的目标系统发出HTTP请求。当测试开始时,蝗虫将为它模拟的每个用户创建一个此类的实例,并且这些用户中的每个将开始在自己的绿色gevent线程中运行。

  • wait_time = between(5, 9)

    我们的类定义了一个wait_time函数,该函数将使模拟用户在每个任务执行后等待5到9秒。有关更多信息,请参见wait_time属性。

  • @taskdef index_page(self):    self.client.get("/hello")    self.client.get("/world")@task(3)def view_item(self):     ...

    我们还通过用修饰两个方法来声明了两个任务@task,其中一个具有较高的权重(3)。当这种类型的用户运行时,它将选择一个index_page或一个(view_item有三倍的选择机会)view_item调用该方法,然后统一选择一个介于5到9之间的持续时间,并在该持续时间内休眠。等待时间过后,它将选择一个新任务并继续重复执行。

  • @task(3)def view_item(self):    item_id = random.randint(1, 10000)    self.client.get(f"/item?id={item_id}", name="/item")

    在此view_item任务中,我们通过使用查询参数来加载动态URL,该查询参数是一个从1到10000之间随机选择的数字。为了不在Locust的统计信息中获得10k个单独的条目-由于统计信息是按URL分组的,因此我们使用名称参数将所有这些请求分组到一个名为的条目下"/item"。

    请注意,只有用修饰的方法@task会被调用,因此您可以根据自己的喜好定义自己的内部帮助器方法。

  • def on_start(self):

    此外,我们还声明了on_start方法。每个模拟用户在启动时都会调用具有该名称的方法。有关更多信息,请参见on_start和on_stop方法。

    蝗虫开始

    将上面的代码放在当前目录中名为locustfile.py的文件中,然后运行:

  • $ locust

    如果您的蝗虫文件位于其他位置,则可以使用-f。

  • $ locust -f locust_files/my_locust_file.py

    要查看所有可用选项,请输入或检查配置locust --help。

    蝗虫的网络界面

    使用上述命令行之一启动Locust后,应该打开浏览器并将其指向http://127.0.0.1:8089。然后,您应该会收到类似以下内容的问候:

    填写内容并开始!(请注意,如果您不更改蝗虫文件以匹配目标系统,则大多数情况下会收到错误响应)

    更多的选择

    要运行分布在多个Python进程或计算机上的Locust,可以使用--master命令行参数启动单个Locust主进程,然后使用--worker命令行参数启动任意数量的Locust worker进程。有关更多信息,请参见运行蝗虫。

    要直接开始测试而不使用Web界面,请使用--headless。

    也可以通过环境变量或在 配置文件中设置参数。

    最后

    Locust 也有其自身的局限性。目前其本身对测试过程的监控和测试结果展示,不如 jmeter 全面和详细,需要进行二次开发才能满足需求越来越复杂的性能测试需要。

    Locust 和 Jmeter 怎么选择那?如果你懂代码,强力建议你使用 Locust。反之,最好还是使用 Jmeter。

    Locust 的作者是 Locust.io 团队,共有149位贡献者。Locust 已经开源并维护了10年,在 Github 上收获了 13.3k Star。Locust 也算是比较知名的开源项目了,其用户包含微软、亚马逊、Google等知名互联网企业。

    项目地址:https://github.com/locustio/locust

    在线官网:https://locust.io/


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