专栏首页软测小生性能测试工具Locust--(1)概述及安装入门

性能测试工具Locust--(1)概述及安装入门

简介 Locust是什么?

Locust是一个简单易用的分布式用户负载测试工具。它用于web站点(或其他系统)的负载测试,并计算一个系统可以处理多少并发用户。

在测试中,一群locusts(蝗虫)会攻击你的网站。每个locusts (或者测试用户)的行为由您定义,集群过程由web UI实时监控。这将帮助你在允许实际用户使用之前测试并确定代码中的瓶颈。

Locust完全基于事件,因此可以在一台计算机上支持数千个并发用户。与许多其他基于事件的应用程序不同,它不使用回调。相反,它通过gevent使用轻量级进程。每个聚集站点上的蝗虫实际上是在它自己的进程中运行的(正确的说是greenlet)。这允许你使用Python编写非常有表现力的场景,而不用回调使代码复杂化。

Locust特性

  • 用普通的Python编写用户测试场景 不需要笨拙的UI或庞大的XML,只需像通常那样编码即可。基于协程而不是回调,您的代码看起来和行为都与正常的、阻塞Python代码一样。
  • 分布式和可扩展——支持成千上万的用户 Locust支持在多台机器上运行负载测试。由于基于事件,即使一个Locust节点也可以在一个进程中处理数千个用户。这背后的部分原因是,即使你模拟了那么多用户,也不是所有用户都积极的访问你的系统。通常,用户无所事事,想知道下一步该怎么做。每秒请求数不等于在线用户数
  • 基于web的UI Locust具有简洁的HTML + JS用户界面,可实时显示相关的测试细节。而且由于UI是基于Web的,因此它是跨平台且易于扩展的。
  • 可以测试任何系统 尽管Locust是面向web的,但它几乎可以用于测试任何系统。只需要未测试的内容编写一个客户端,然后用Locust访问!超级简单!
  • 可控 Locust很小,很容易被入侵,我们打算保持这种状态。事件I / O和协程的所有繁重工作都委托给gevent。替代测试工具的脆弱性是我们创建Locust的原因。

Locust背景

Locust 的诞生是因为我们厌倦了现有的解决方案。对我来说,他们都没有解决正确的问题,没有抓住重点。我们已经尝试了Apache JMeter和Tsung。 这两种工具都可以使用;我们已经在工作中多次使用了前一种方法。JMeter附带UI界面,您可能会认为这是一件好事。但是您很快就会意识到,通过某些点击界面“编码”你的测试方案是一种陷阱。其次,JMeter是线程绑定的。这意味着对于要模拟的每个用户,都需要一个单独的线程。不用说,在一台机器上对成千上万的用户进行基准测试是不可行的。

另一方面,Tsung没有这些线程问题,因为它是用Erlang编写的。它可以利用BEAM自身提供的轻量级流程,并且可以愉快地扩展规模。但是在定义测试场景时,Tsung和JMeter一样有限。它提供了基于XML的DSL来定义用户在测试时的行为方式。我想您可以想象“编码”这一点的恐怖。完成后显示各种图形或报告,需要对测试生成的日志文件进行后期处理。只有这样,您才能了解测试的具体情况。

不管怎样,我们在创造Locust的时候已经尝试解决这些问题。希望以上这些痛点都不存在。

我猜你可能会说我们真的只是在这里挠痒痒。我们希望其他人会发现它和我们一样有用。

安装

Locust可以在PyPI上使用,并且可以与pip一起安装。

$ pip3 install locust

如果您想要最新版本,可以使用pip直接从我们的Git存储库安装。例如,要使用Python 3安装master分支:

pip3 install -e git://github.com/locustio/locust.git@master#egg=locustio

安装了Locust之后,您的shell中应该可以使用Locust命令。(如果您没有使用virtualenv—您应该使用—请确保您的python脚本目录位于您的路径上)。

要查看可用的选项,请运行:

$ locust --help

Python版本支持

在Python 3.6、3.7和3.8

Windows上安装Locust

在Windows上,运行pip install locustio 即可。

但是,如果没有成功,那么可以先安装为pyzmqgeventgreenlet预先构建的二进制包来修复它。

你可以在这里找到一个非官方的集合,预先建立的python包的windows: http://www.lfd.uci.edu/~gohlke/pythonlibs/

下载预构建的.whl文件后,可以使用以下方法进行安装:

$ pip install name-of-file.whl

然后可以使用pip install locustio进行安装。

==注意:== 在Windows上运行Locust应该可以很好地开发和测试您的负载测试脚本。但是,在运行大规模测试时,建议您在Linux机器上这样做,因为gevent在Windows下的性能很差。

macOS上安装Locust

当前是使用Homebrew在OS X上安装gevent的最短路径。

  • 安装Homebrew。
  • 安装libev(gevent的依赖):
brew install libev

增加打开文件最大数限制

机器上的每个HTTP连接打开一个新文件(技术上称为文件描述符)。操作系统可以为可打开的文件的最大数量设置一个较低的限制。如果该限制小于测试中模拟用户的数量,则会发生故障。

将操作系统的默认最大文件数限制增加到大于你要运行的模拟用户数的数量。如何执行此操作取决于所使用的操作系统。

快速入门Locust

例子locustfile.py 下面是一个简单的locustfile.py的小例子:

from locust import HttpLocust, TaskSet, between

def login(l):
    l.client.post("/login", {"username":"ellen_key", "password":"education"})

def logout(l):
    l.client.post("/logout", {"username":"ellen_key", "password":"education"})

def index(l):
    l.client.get("/")

def profile(l):
    l.client.get("/profile")

class UserBehavior(TaskSet):
    tasks = {index: 2, profile: 1}

    def on_start(self):
        login(self)

    def on_stop(self):
        logout(self)

class WebsiteUser(HttpLocust):
    task_set = UserBehavior
    wait_time = between(5.0, 9.0)

这里我们定义了一些Locust任务,它们是普通的Python可调用函数,带有一个参数(一个Locust类实例)。这些任务收集在tasks属性中的TaskSet类下。然后,我们有一个代表用户的HttpLocust类,在这个类中定义了模拟用户在执行任务之间应等待的时间,以及哪个TaskSet类应定义用户的“行为”。TaskSet类可以嵌套。

HttpLocust类继承自Locust类,并且添加了一个client属性,该属性是HttpSession的实例,可用于发出HTTP请求。

默认情况下,我们不再设置代理以提高性能。如果确实想要测试请求通过HTTP代理,你可以继承HttpLocust类,并将trust_env字段设置为True。有关更多细节,请参阅请求的文档。

我们声明任务的另一种方法(通常更方便)是使用@task装饰器。下面代码与上面的代码效果一样:

from locust import HttpLocust, TaskSet, task, between

class UserBehaviour(TaskSet):
    def on_start(self):
        """ on_start is called when a Locust start before any task is scheduled """
        self.login()

    def on_stop(self):
        """ on_stop is called when the TaskSet is stopping """
        self.logout()

    def login(self):
        self.client.post("/login", {"username":"ellen_key", "password":"education"})

    def logout(self):
        self.client.post("/logout", {"username":"ellen_key", "password":"education"})

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

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

class WebsiteUser(HttpLocust):
    task_set = UserBehaviour
    wait_time = between(5, 9)

Locust类(以及HttpLocust,因为它是一个子类)还允许您指定任务执行之间的等待时间(wait_time = between(5, 9))以及其他用户行为。使用between函数,可以在指定的最大值和最小值之间随机选择时间,但是可以通过将wait_time设置为任意函数来使用任何用户定义的时间分布。例如,对于平均时间为1秒的指数分布等待时间:

import random

class WebsiteUser(HttpLocust):
    task_set = UserBehaviour
    wait_time = lambda self: random.expovariate(1)*1000

启动Locust

要使用上述Locust文件运行Locust,如果该文件名为locustfile.py且位于当前工作目录中,则可以运行: $ locust 如果Locust文件位于与locustfile.py在不同的子目录/或者文件名不一样,则使用参数-f+文件名: $ locust -f locust_files/my_locust_file.py

要在多个进程中运行Locust,我们可以通过指定--master: $ locust -f locust_files/my_locust_file.py --master 然后我们将启动任意数量的从属进程: $ locust -f locust_files/my_locust_file.py --slave 如果要在多台机器上运行Locust,则在启动从属服务器时还必须指定主服务器主机(在单台计算机上运行Locust时不需要,因为主服务器主机默认为127.0.0.1): $ locust -f locust_files/my_locust_file.py --slave --master-host=192.168.0.100 还可以在配置文件(locust.conf或~/.locust.conf)或以LOCUST_前缀的env vars中设置参数 例如:(这将与上一个命令执行相同的操作) $ LOCUST_MASTER_HOST=192.168.0.100 locust

注意:要查看所有可用选项,请键入:locust—help

打开Locust的Web界面

使用上述命令行之一启动Locust后,应打开浏览器并输入http://127.0.0.1:8089或者http://localhost:8089(如果您在本地运行Locust)。然后,你会看到以下界面: (或者浏览器中访问ipv6本地地址:http://[::1]:8089, 也可)

Locust UI

如果您在逐步负载模式下运行Locust,,则应该使用以下Locust UI,如下所示:

Locust UI Step Load Mode

然后在上述几面中输入数量,以及要访问的URL,点击Start即可看到响应数据,如下图:

性能相应数据

本文分享自微信公众号 - 软测小生(ruancexiaosheng),作者:软测小生

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2020-02-25

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 性能测试工具Locust--(3)分布式运行

    可以使用--master标志在主模式下启动Locust的一个实例。这个实例将运行Locust的web接口,您可以在这里启动测试并实时查看统计信息。主节点本身不模...

    软测小生
  • 性能测试工具--Locust官方文档(API)解读(全)

    Locust是一个简单易用的分布式用户负载测试工具。它用于web站点(或其他系统)的负载测试,并计算一个系统可以处理多少并发用户。

    软测小生
  • postman接口测试-参数化

    在环境变量里面设置好参数,比如 url=http://www.baidu.com 某一类型的 BaseUrl 全部都是 www.baidu.com, 参数化之后...

    软测小生
  • 软件性能:Locust工具实战之开篇哲学三问

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

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

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

    测试开发技术
  • 大型POS机系统全球僵尸网络

    安全研究人员发现一个全球范围网络犯罪活动,其中感染了36个国家的1500个POS(销售点)中断、会计系统和其他零售后台平台。这些受感染的系统组...

    安恒信息
  • 你真的了解MySQL 8.0 数据字典吗?

    作者:叶盛,腾讯云数据库TDSQL开发工程师,从事数据库内核开发工作。 在MySQL中,数据字典信息内容包括表结构、数据库名或表名、字段的数据类型、视图、索引...

    腾讯云数据库 TencentDB
  • 如何使用Locust做性能压测

    一直听开发说用locust做压测很方便,也没实际用过。最近刚刚好在学httprunner,看官方文档的时候发现这个自动化框架可以支持结合locust做性能压测,...

    小雯子打豆豆
  • 互联网世界的毒瘤——僵尸网络

    从世界上第一个蠕虫病毒————莫里斯————因其巨大的系统破坏力和传播速度被人们所关注,便意味着在恶意代码斗争的战场上传播速度势必成为新的衍变方式。而互联网自上...

    FB客服
  • 怎样有效的治理僵尸网络?

    僵尸网络 Botnet 是指采用一种或多种传播手段,将大量主机感染bot程序(僵尸程序)病毒,从而在控制者和被感染主机之间所形成的一个可一对多控制的网络。

    墨者安全科技

扫码关注云+社区

领取腾讯云代金券