Apache JMeter™和Locust都是是最受欢迎的性能测试工具。
JMeter是久经考验的性能框架之一,其第一个版本大约在20年前发布。 它是用纯Java语言编写的。 最初,JMeter开发用于执行Web和FTP应用程序的负载测试。 但是,现在它允许测试几乎所有应用程序和协议,使用户能够使用与任何OS平台兼容的桌面应用程序来创建测试。
https://github.com/apache/jmeter 6000+星
Locust是Python编写的相对新颖的性能框架,在过去的五年中广为人知。 该框架的主要特点是使用纯Python编写性能脚本。具有高度可扩展性,因为它基于事件的完全实现。 Locust拥有广泛且快速发展的社区,他们比JMeter更喜欢这个框架。
https://github.com/locustio/locust 210000+星
工具许可范围的问题是最重要的问题之一,因为您可能想知道是否需要支付额外的第三方工具来完成负载测试。 如果某个工具是开源的,那么您几乎可以实现为性能测试设置的任何目标,而无需任何额外付款。 开源JMeter和Locust也不例外。
JMeter和Locust都提供了许可软件许可证,该许可证支持免费软件,对软件的分发方式提出最低要求。 JMeter是由Apache开发的,它基于Apache License 2.0,而Locust是由由社区驱动的开发人员组成的小团队开发的 ,基于MIT许可证。 在这两种情况下,这些工具都是开源的,允许您自由使用它们,而不受任何使用限制。
性能测试工作流程有三个主要步骤:创建,运行和分析。 一般第一步是最耗时的。
编写JMeter性能测试的最常用方法是使用其GUI模式。 JMeter GUI模式提供了桌面客户端,允许您轻松创建测试,而无需编写单行代码(直到您需要创建棘手的测试)。 所以最简单的场景可能如下所示:
JMeter非常简单,通常,即使是没有经验的工程师也可以毫无困难地上手。但是如果需要,您可以使用Java在GUI和非GUI模式下使用代码。 但是,由于脚本实现的复杂性(因为JMeter旨在与GUI模式一起使用)以及缺乏如何制作此类脚本的文档,因此这种方式在JMeter社区中并不流行。
Locust则需要python编程基础。
理想情况下,您应该能够使用尽可能少的工具测试所有工具,只要它不会影响测试质量。
使用JMeter,您可以使用完整的内置函数和第三方插件,在一个地方创建所有内容的性能测试。 您无需编码即可测试不同的协议甚至数据库。 这些包括JDBC,FTP,LDAP,SMTP等。JMeter还可以通过jar包扩展,比如加载jython,可以使用python脚本。
根据文档,Locust主要用于基于HTTP Web的测试。但可以扩展其默认功能并创建自定义Python函数来测试可以使用Python编程语言进行测试的任何内容。
JMeter和Locust有完全不同的方式来处理机器资源。 JMeter有一个基于线程的模型,它为每个用户分配一个单独的线程。 每个步骤的线程分配和基准测试需要大量资源,这就是为什么JMeter对于您可以在一台机器上模拟的用户数量非常有限的原因。 您可以在一台计算机上运行的用户数取决于许多因素,如脚本复杂性,硬件,响应大小等。 如果您的脚本很简单,JMeter允许您在一台机器上运行多达数千个,但脚本执行逐渐变得不可靠。


Locust有完全不同的用户模拟模型,它基于事件和异步方法,以gevent coroutine作为整个过程的基石。 这种实现允许Locust框架在一台机器上轻松模拟数千个并发用户,即使是在非常规的笔记本电脑上,也可同时运行内部有许多步骤的复杂测试。

这两个工具提供相对相同的生成负载的方式 - 您可以指定在性能测试期间要使用的用户数以及它们应该加速的速度。
在JMeter中,您可以在指定字段的“线程组”控制器中配置负载:但是JMeter还有其他插件,可以让您配置非常灵活的负载。 最好的方法之一是使用Ultimate Thread Group ,它允许用户制作非常具体的加载模式:
Locust有不同的方法。 当您运行性能脚本时,Locust会自动在http://localhost:8089 上启动Web界面的服务器,该界面为您提供仅指定线性负载的输入元素, 当然也可以命令行执行通过参数定制。
这是JMeter具有强大优势的地方,因为它具有脚本录制的内置功能,而Locust根本没有此功能。 除此之外,还有许多第三方插件可以为JMeter制作脚本录制。 记录此类脚本最方便的方法之一是使用BlazeMeter chrome扩展。
JMeter和Locust都提供了强大的内置功能来监控性能脚本并分析您的测试结果。 JMeter有许多不同的元素叫做监听器。 每个侦听器都提供特定类型的监视,你也可以使用许多现有的自定义监听器扩展默认库。另一方面,JMeter监听器在其运行的机器上消耗大量资源。这就是为什么通常,JMeter是以非GUI模式执行的,没有任何监听器或监控过程,在这种情况下,可使用3方工具,如BlazeMeter 。

Locust的监测能力稍弱,不过几乎提供了所有可用于监控基本负载的信息。在脚本运行期间,Locust运行一个简单的Web服务器,您可以在其中找到所有可用的监视结果:


与JMeter相比,Locust监控不占用您机器的大量资源。 这就是为什么Locust比JMeter有很大的好处,因为你可以使用内置监控,即使你需要模拟很多用户。 另一方面,默认监控不提供您可以从第三方工具获得的非常详细的信息。 这就是为什么你可能想检查脚本监控的其他选项。
监控和分析测试结果的最简单方法之一是使用Taurus框架和BlazeMeter报告,它为您提供出色的实时报告,并能够保存它们以进行进一步比较。 您可以查看这篇文章以获得基本想法。
具备python基础对性能或灵活性要求高的建议使用Locust。反之JMeter可能是更好的选择。
很好奇,就使用rubyonrails自动化单元测试而言,你们正在做什么?您是否创建了一个脚本来在cron中运行rake作业并将结果邮寄给您?git中的预提交Hook?只是手动调用?我完全理解测试,但想知道在错误发生之前捕获错误的最佳实践是什么。让我们理所当然地认为测试本身是完美无缺的,并且可以正常工作。下一步是什么以确保他们在正确的时间将可能有害的结果传达给您? 最佳答案 不确定您到底想听什么,但是有几个级别的自动代码库控制:在处理某项功能时,您可以使用类似autotest的内容获得关于哪些有效,哪些无效的即时反馈。要确保您的提
我正在编写一个包含C扩展的gem。通常当我写一个gem时,我会遵循TDD的过程,我会写一个失败的规范,然后处理代码直到它通过,等等......在“ext/mygem/mygem.c”中我的C扩展和在gemspec的“扩展”中配置的有效extconf.rb,如何运行我的规范并仍然加载我的C扩展?当我更改C代码时,我需要采取哪些步骤来重新编译代码?这可能是个愚蠢的问题,但是从我的gem的开发源代码树中输入“bundleinstall”不会构建任何native扩展。当我手动运行rubyext/mygem/extconf.rb时,我确实得到了一个Makefile(在整个项目的根目录中),然后当
我有一个围绕一些对象的包装类,我想将这些对象用作散列中的键。包装对象和解包装对象应映射到相同的键。一个简单的例子是这样的:classAattr_reader:xdefinitialize(inner)@inner=innerenddefx;@inner.x;enddef==(other)@inner.x==other.xendenda=A.new(o)#oisjustanyobjectthatallowso.xb=A.new(o)h={a=>5}ph[a]#5ph[b]#nil,shouldbe5ph[o]#nil,shouldbe5我试过==、===、eq?并散列所有无济于事。
我有一些Ruby代码,如下所示:Something.createdo|x|x.foo=barend我想编写一个测试,它使用double代替block参数x,这样我就可以调用:x_double.should_receive(:foo).with("whatever").这可能吗? 最佳答案 specify'something'dox=doublex.should_receive(:foo=).with("whatever")Something.should_receive(:create).and_yield(x)#callthere
我正在编写一个小脚本来定位aws存储桶中的特定文件,并创建一个临时验证的url以发送给同事。(理想情况下,这将创建类似于在控制台上右键单击存储桶中的文件并复制链接地址的结果)。我研究过回形针,它似乎不符合这个标准,但我可能只是不知道它的全部功能。我尝试了以下方法:defauthenticated_url(file_name,bucket)AWS::S3::S3Object.url_for(file_name,bucket,:secure=>true,:expires=>20*60)end产生这种类型的结果:...-1.amazonaws.com/file_path/file.zip.A
Sinatra新手;我正在运行一些rspec测试,但在日志中收到了一堆不需要的噪音。如何消除日志中过多的噪音?我仔细检查了环境是否设置为:test,这意味着记录器级别应设置为WARN而不是DEBUG。spec_helper:require"./app"require"sinatra"require"rspec"require"rack/test"require"database_cleaner"require"factory_girl"set:environment,:testFactoryGirl.definition_file_paths=%w{./factories./test/
我遵循MichaelHartl的“RubyonRails教程:学习Web开发”,并创建了检查用户名和电子邮件长度有效性的测试(名称最多50个字符,电子邮件最多255个字符)。test/helpers/application_helper_test.rb的内容是:require'test_helper'classApplicationHelperTest在运行bundleexecraketest时,所有测试都通过了,但我看到以下消息在最后被标记为错误:ERROR["test_full_title_helper",ApplicationHelperTest,1.820016791]test
我已经构建了一些serverspec代码来在多个主机上运行一组测试。问题是当任何测试失败时,测试会在当前主机停止。即使测试失败,我也希望它继续在所有主机上运行。Rakefile:namespace:specdotask:all=>hosts.map{|h|'spec:'+h.split('.')[0]}hosts.eachdo|host|begindesc"Runserverspecto#{host}"RSpec::Core::RakeTask.new(host)do|t|ENV['TARGET_HOST']=hostt.pattern="spec/cfengine3/*_spec.r
我在app/helpers/sessions_helper.rb中有一个帮助程序文件,其中包含一个方法my_preference,它返回当前登录用户的首选项。我想在集成测试中访问该方法。例如,这样我就可以在测试中使用getuser_path(my_preference)。在其他帖子中,我读到这可以通过在测试文件中包含requiresessions_helper来实现,但我仍然收到错误NameError:undefinedlocalvariableormethod'my_preference'.我做错了什么?require'test_helper'require'sessions_hel
当我尝试安装Ruby时遇到此错误。我试过查看this和this但无济于事➜~brewinstallrubyWarning:YouareusingOSX10.12.Wedonotprovidesupportforthispre-releaseversion.Youmayencounterbuildfailuresorotherbreakages.Pleasecreatepull-requestsinsteadoffilingissues.==>Installingdependenciesforruby:readline,libyaml,makedepend==>Installingrub