python locust api_性能测试工具--Locust官方文档(API)解读(全)

文章略长Locust学习笔记汇总

若有错误,请指正

内容以官网为准https://locust.io/

Locust简介 Locust是什么?

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

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

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

Locust功能特性

用普通的Python编写用户测试场景不需要笨拙的UI或庞大的XML,只需像通常那样编码即可。基于协程而不是回调,您的代码看起来和行为都与正常的、阻塞Python代码一样。

分布式和可扩展——支持成千上万的用户Locust支持在多台机器上运行负载测试。由于基于事件,即使一个Locust节点也可以在一个进程中处理数千个用户。这背后的部分原因是,即使你模拟了那么多用户,也不是所有用户都积极的访问你的系统。通常,用户无所事事,想知道下一步该怎么做。每秒请求数不等于在线用户数。

基于web的UILocust具有简洁的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一起安装。

1$ pip3 install locust

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

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

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

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

1$ locust --help

Python版本支持

在Python 3.6、3.7和3.8

Windows上安装locust

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

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

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

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

1$ pip install name-of-file.whl

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

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

macOS上安装Locust

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

安装Homebrew。

安装libev(gevent的依赖):

1brew install libev

增加打开文件最大数限制

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

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

快速入门Locust

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

1from locust import HttpLocust, TaskSet, between23def login(l):4    l.client.post("/login", {"username":"ellen_key", "password":"education"})56def logout(l):7    l.client.post("/logout", {"username":"ellen_key", "password":"education"})89def index(l):10    l.client.get("/")1112def profile(l):13    l.client.get("/profile")1415class UserBehavior(TaskSet):16    tasks = {index: 2, profile: 1}1718    def on_start(self):19        login(self)2021    def on_stop(self):22        logout(self)2324class WebsiteUser(HttpLocust):25    task_set = UserBehavior26    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装饰器。下面代码与上面的代码效果一样:

1from locust import HttpLocust, TaskSet, task, between23class UserBehaviour(TaskSet):4    def on_start(self):5        """ on_start is called when a Locust start before any task is scheduled """6        self.login()78    def on_stop(self):9        """ on_stop is called when the TaskSet is stopping """10        self.logout()1112    def login(self):13        self.client.post("/login", {"username":"ellen_key", "password":"education"})1415    def logout(self):16        self.client.post("/logout", {"username":"ellen_key", "password":"education"})1718    @task(2)19    def index(self):20        self.client.get("/")2122    @task(1)23    def profile(self):24        self.client.get("/profile")2526class WebsiteUser(HttpLocust):27    task_set = UserBehaviour28    wait_time = between(5, 9)

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

1import random23class WebsiteUser(HttpLocust):4    task_set = UserBehaviour5    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即可看到响应数据,如下图:

性能相应数据

Locust--CSV存储测试数据

Locust的测试结果保存到CSV文件,在这种情况下,有两种方法可以执行此操作。

首先,通过Web UI运行Locust时,可以在“Download Data”选项卡下得到CSV文件。

其次,可以使用标签运行Locust,该标签将定期保存两个CSV文件。如果计划使用--no-web标签以自动化方式运行Locust,这将特别有用:

1$ locust -f examples/basic.py --csv=example --no-web -t10m

文件将被命名为example_response_times.csv 和 example_stats.csv (使用--csv=example)并记录Locust构建的信息。

如果你想要更快(慢)的写入速度,也可以自动以写入频率:

1import locust.stats2# 默认为2秒3locust.stats.CSV_STATS_INTERVAL_SEC = 5

此数据将写入两个文件,并将_response_times.csv和_stats.csv添加到你提供的名称中:

1$ cat example_response_times.csv2"Name","# requests","50%","66%","75%","80%","90%","95%","98%","99%","99.9%","99.99%","100%"3"GET /",31,4,4,4,4,4,4,4,4,4,4,44"/does_not_exist",0,"N/A","N/A","N/A","N/A","N/A","N/A","N/A","N/A","N/A"5"GET /stats/requests",38,3,4,4,4,4,5,5,5,5,5,56"None Total",69,3,4,4,4,4,4,5,5,5,5,5

1$ cat example_stats.csv2"Type","Name","# requests","# failures","Median response time","Average response time","Min response time","Max response time","Average Content Size","Requests/s"3"GET","/",51,0,4,3,2,6,12274,0.894"GET","/does_not_exist",0,56,0,0,0,0,0,0.005"GET","/stats/requests",58,0,3,3,2,5,1214,1.016"None","Total",109,56,3,3,2,6,6389,1.89

编写一个locustfile

locustfile是普通的python文件。唯一的要求是至少声明一个类(我们称之为locust类),该类继承自locust类。

Locust类

一个Locust类代表一个用户(或者一个集群Locust)。Locust将为每个正在模拟的用户生成(孵化)一个Locust类实例。Locust类通常应该定义一些属性。

task_set属性

task_set属性应该指向一个TaskSet类,这个类定义了用户的行为,下面将对其进行更详细的描述。

wait_time属性

除了task_set属性,还应该声明一个wait_time方法。它用于确定模拟用户在执行任务之间将等待多长时间。Locust提供了一些内置的函数,返回一些常用的wait_time方法。

最常见的是 between 。它用于使模拟用户在每次执行任务后等待介于最小值和最大值之间的随机时间。其他内置的等待时间函数是constant和constant_pacing。

使用以下locustfile,每个用户将在任务之间等待5到15秒:

1from locust import Locust, TaskSet, task, between23class MyTaskSet(TaskSet):4    @task5    def my_task(self):6        print("executing my_task")78class User(Locust):9    task_set = MyTaskSet10    wait_time = between(5, 15)

wait_time方法应该返回秒数(或几分之一秒),也可以在TaskSet类上声明,在这种情况下,

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值