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。我们的测试计划

接下来,我们需要测试脚本。

要获得公平的比较,我们将为每个工具执行相同的自动化步骤:

  1. 生成随机客户帐户ID
  2. 发布一个事务
  3. 解析随机客户ID和事务ID的响应
  4. 使用客户id查询客户奖励帐户id
  5. 解析奖励帐户ID的响应
  6. 如果没有奖励帐户id存在,然后添加一个帖子
  7. 发布相同的初始交易与更新的奖励id使用交易id
  8. 通过奖励帐户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上

通用底部

开始使用Spring 5和Spring Boot 2,通过学习春天课程:

>>查看课程
3.注释
最老的
最新
内联反馈
查看所有评论
评论在本文上关闭!