1.介绍
为这项工作选择合适的工具可能是令人生畏的。在本教程中,我们将通过将三种web应用程序负载测试工具(Apache JMeter、Gatling和The grinder)与一个简单的REST API进行比较来简化这一过程。
2.负载测试工具
首先,让我们快速审查每一个背景。
2.1。加特林
加特林是一个用Scala创建测试脚本的负载测试工具。Gatling的记录器生成Scala测试脚本,这是Gatling的一个关键特性。看看我们的介绍格林机关枪有关更多信息的教程。
2.2。JMeter
JMeter是Apache的负载测试工具。它提供了一个漂亮的GUI,我们使用CAN进行配置。一个称为逻辑控制器的独特特性为在GUI中设置测试提供了很大的灵活性。
访问我们介绍jmeter.教程截图和更多的解释。
2.3。磨床
最后一个工具,磨床,提供了一个比其他两个更基于编程的脚本引擎,并使用Jython。然而,Grinder 3确实有录制脚本的功能。
通过允许控制台和药剂方法,研磨机也与其他两种工具不同。此功能提供了代理过程的能力,以便负载测试可以跨多个服务器缩放。它专门被宣传为为开发人员找到致命锁定和放缓的负载测试工具。
3.测试用例的设置
接下来,对于我们的测试,我们需要一个API。我们的API功能包括:
- 添加/更新奖励记录
- 查看一个/所有奖励记录
- 将事务链接到客户奖励记录
- 查看交易客户奖励记录
我们的场景:
一家商店拥有全国范围内的销售,并返回需要客户奖励帐户的新客户来节省。奖励API通过客户ID检查客户奖励帐户。如果不存在奖励帐户,请添加它,然后链接到事务。
在此之后,我们查询事务。
3.1。我们的休息API.
让我们通过查看一些方法存根来获得API的快速亮点:
@PostMapping(path="/rewards/add") public @ResponseBody RewardsAccount addRewardsAcount(@RequestBody RewardsAccount body) @GetMapping(path="/rewards/find/{customerId}") public @ResponseBody可选 findCustomer(@PathVariable Integer customerId) @PostMapping(path="/transactions/add") public @ResponseBody Transactionpublic @ResponseBody Iterable findTransactions(@PathVariable Integer rewardId) public @ResponseBody Iterable findTransactions(@PathVariable Integer rewardId)
注意一些关系,例如通过奖励ID查询交易并通过客户ID获取奖励帐户。这些关系强制为我们的测试场景创建进行一些逻辑和响应解析。
正在测试的应用程序还使用H2内存存储数据库来持久性。
幸运的是,我们的工具都处理得相当好,有些比其他更好。
3.2。我们的测试计划
接下来,我们需要测试脚本。
要获得公平的比较,我们将为每个工具执行相同的自动化步骤:
- 生成随机客户帐户ID
- 发布一个事务
- 解析随机客户ID和事务ID的响应
- 使用客户id查询客户奖励帐户id
- 解析奖励帐户ID的响应
- 如果没有奖励帐户id存在,然后添加一个帖子
- 发布相同的初始交易与更新的奖励id使用交易id
- 通过奖励帐户ID查询所有交易
让我们仔细看看每个工具的步骤4。并务必退房所有三个已完成脚本的示例。
3.3。加特林
对于Gatling,熟悉Scala为开发人员添加了一个福音,因为Gatling API是强大的,并且包含大量功能。
Gatling的API采用Builder DSL方法,正如我们在第4步中看到的那样:
.exec (http(“get_reward”). get(" /奖励/发现/ $ {custId} ")支票(jsonPath .saveAs (" $ .id ") (" rwdId ")))
特别值得注意的是,当我们需要读取和验证HTTP响应时,Gatling对JSON Path的支持。在这里,我们将获取奖励id并将其保存到加特林的内部状态。
另外,Gatling的表达式语言使得动态请求体更加容易字符串:
.body (StringBody(“”“{”customerRewardsId”:“$ {rwdId}”,“customerId”:“$ {custId}”,“transactionDate”:“$ {txtDate }" }""")). asJson)
最后我们为此比较配置。1000个运行设置为整个方案的重复,atonceusers.方法设置线程/用户:
Val SCN =方案(“奖励股份线”).repeat(1000){...}设置(scn.inject(atonceusers(100))).protocols(httpProtocol)
的整个scala脚本在我们的GitHub repo中是可见的。
3.4。JMeter
在GUI配置完成后,JMeter生成一个XML文件。该文件包含具有SET属性及其值的JMeter特定对象,例如:
检查testname.属性,可以标记它们,因为我们识别它们与上面的逻辑步骤匹配。添加子项,变量和依赖项步骤的能力使JMeter灵活性作为脚本提供。此外,我们甚至为我们的变量设置了范围!
我们在JMeter中的运行和用户的配置threadgroup:
100年< stringProp name = " ThreadGroup.num_threads " > < / stringProp >
查看整个jmx.作为参考的文件。如果可以的话,用XML编写测试jmx对于一个功能齐全的GUI来说,files没有意义。
3.5。磨床
没有Scala和Gui的功能编程,我们的Jython脚本对于研磨机看起来非常基础。添加一些系统Java类,我们有很多代码行。
customersid = str(random.nextint());结果= Request1.post(“http:// localhost:8080 / transaction / add”,“customerrewardsid”'':null,“'customersid”':“+ customerid +”,“''TransactionDate“''”:null}“)txnid = parsejsonstring(结果.gettext(),”id“)
但是,对于更多字符串维护代码,例如解析JSON字符串,更少的测试设置代码是较少的测试设置代码。此外,httprequestAPI的功能很简单。
使用研磨机,我们定义了线程,进程,并在外部属性文件中运行值:
磨床。螺纹= 100磨床。Processes = 1 grinder.runs = 1000
我们用于Grinder的完整Jython脚本如下所示这。
4.测试运行
4.1。测试执行
所有三种工具都建议使用命令行进行大负载测试。
我们要用加特林来做测试开源版本3.4.0作为独立工具,JMeter 5.3和磨床版本3。
Gatling只需要我们拥有java_home.和GATLING_HOME放。要执行Gatling,我们使用:
。/ gatling.sh
在gatling_home / bin目录中。
JMeter需要一个参数来禁用GUI进行测试,以便在启动GUI以进行配置时提示:
./jmeter.sh-n-t testplan.jmx -l log.jtl
和加特林一样,磨工也要求我们java_home.和磨床。然而,它也需要更多的属性:
/home/lore/Documents/grinder-3/lib/grinder.jar:$CLASSPATH export GRINDERPROPERTIES=/home/lore/Documents/grinder-3/examples/grinder.properties
如上所述,我们提供一个grinder.properties用于附加配置(如线程、运行、进程和控制台主机)的文件。
最后,我们使用以下引导控制台和代理:
java -classpath $ classpath net.grinder.console
java -classpath $ classpath net.grinder.grinder $ ginderproperties
4.2。测试结果
每个测试运行1000次,使用100个用户/线程。让我们来看看其中的一些亮点:
成功的要求 | 错误 | 总测试时间 | 平均响应时间(毫秒) | 平均吞吐量 | |
加特林 | 500000个请求 | 0 | 218年代 | 42 | 2283 req / s |
JMeter | 499997请求 | 0 | 237s. | 46 | 2101 req / s |
磨床 | 499997请求 | 0 | 221年代 | 43 | 2280 req / s |
结果表明,3工具具有相似的速度,基于平均通量,在另一个2中略微边缘。
每个工具还以更友好的用户界面提供额外的信息。
Gatling将在运行结束时生成HTML报告,其中包含多个图形和统计信息,用于总运行以及每个请求。下面是测试结果报告的一个片段:

当使用JMeter时,我们可以在测试运行后打开GUI,并根据日志文件生成HTML报告我们保存结果的地方:

JMeter HTML报告还包含每个请求的统计信息的细分。
最后,研磨机控制台记录每个代理的统计信息并运行:

磨床是高速的,它以额外的开发时间和较少的输出数据的成本。
5.总结
现在是时候全面地看一下每个负载测试工具了。
加特林 | JMeter | 磨床 | |
项目和社区 | 9 | 9 | 6 |
表现 | 9 | 8 | 9 |
脚本性/ API. | 7 | 9 | 8 |
用户界面 | 9 | 8 | 6 |
举报 | 9 | 7 | 6 |
一体化 | 7 | 9 | 7 |
概括 | 8.3 | 8.3 | 7 |
加特林:
- 固体,抛光负载测试工具,输出具有Scala Scripting的美丽报告
- 产品的开源和企业支持级别
jmeter:
- 用于测试脚本开发的强大API(通过GUI),无需编码
- Apache基础支持和与Maven的伟大集成
研磨机:
- 使用Jython的开发人员的快速性能负载测试工具
- 跨服务器的可伸缩性为大型测试提供了更多的潜力
简单地说,如果速度和可伸缩性是需要的,则使用磨床。
如果外观良好的交互式图表有助于显示性能的提高,那么可以使用Gatling。
JMeter是用于复杂业务逻辑或具有许多消息类型的集成层的工具。作为Apache软件基金会的一部分,JMeter提供了一个成熟的产品和一个庞大的社区。
六,结论
总之,我们看到这些工具在某些地区具有可比的功能,同时在其他方面发光。合适的工作的合适工具是在软件开发中工作的口语智慧。
最后,可以找到API和脚本在GitHub上。