在Apache JMeter中针对SampleWorldCities地图服务创建一个负载测试(初级/中级)

4134
10
06-02-2021 11:22 PM
AaronLopez
通过 Esri贡献者
Esri贡献者
2 10 4134年

先决条件

本教程包含针对ArcGIS Server服务创建和运行动态负载测试的策略和过程,并假设您熟悉Apache JMeter的一些基础知识。如果您是Apache JMeter的新手,请参阅我们的使用Apache JMeter进行性能测试(简介)。

aaronlopez_0 - 1622592360115. - png

JMeter测试策略

在深入讨论构建和验证数据驱动负载测试的细节之前,首先讨论一些特定于JMeter的测试策略是很重要的。这些建议不同于我们列出的项目ArcGIS服务器部署负载测试的推荐策略文章旨在与任何测试工具一起使用(但也适用于JMeter)。

一个好的测试计划始于一个正确的文件夹结构

一种有助于在JMeter中管理多个测试和多个报告的策略是实现一个简单但一致的文件夹结构,用于存储每个测试的各种元素。JMeter测试的主要驱动程序是JMX文件,这是所有测试逻辑所在的地方。但是,当您继续向测试添加特性并多次运行它时,您将超出仅仅管理单个JMX文件的范围。

一个小小的组织可以走很长的路…手动创建一些关键目录可以帮助管理各种JMeter文件,这些文件将随着时间的推移填充硬盘驱动器。

注意:这种方法是从操作系统的文件系统中完成的,而不是直接从Apache JMeter中完成的。

推荐的文件夹结构:

  • name_of_project(JMX文件应该使用相同的名称存储在其中)
    • 数据集
      • 是否包含数据文件,使我们的请求在每次测试迭代中都是动态的
    • 日志
      • 是否包含JMeter测试环境的调试日志
    • 报告
      • 是否包含JMeter生成的报告
    • 结果
      • 是否包含JMeter测试结果文件
        • 这是RAW结果文件,也是测试中最重要的工件
    • 上传
      • 将包含要上传的文件
        • 可选

在“project”文件夹中,将创建5个空目录:数据集、日志、报告、结果和上传。

用户定义变量

像上面提到的文件夹结构一样,利用用户定义变量是一种有利于可移植性、可重用性和测试计划共享的测试构建策略。在ArcGIS服务测试中使用的一些常见变量有:

  • ProjectFolder
  • WebServerName
  • ServerInstanceName
  • SecurePort

在JMeter测试计划中,这些变量可以很容易地引用,如下所示:${名}它将在执行时自动替换为服务的名称。如果您计划在另一个环境中使用测试,使用变量比使用硬编码值更不容易出错。当测试针对另一个部署运行时,测试人员只需要调整变量定义。对于具有许多已定义的HTTP请求示例的测试计划,这可以真正节省时间。

选择正确的线程组

在定义步骤加载逻辑时,有几种选择。它们都很相似,提供相同的基本功能,但确实有一些细微的差异。线程组是一个很好的、安全的选择,它提供了最大的测试可移植性,因为它包含在核心JMeter产品中。

也就是说,使用JMeter插件管理器(安装为使用Apache JMeter进行性能测试(简介))添加“自定义线程组”可以为测试环境提供一些其他有用的选项。

在JMeter中添加自定义线程组支持

从JMeter中的插件管理器(选项—> . exe)插件管理器):

  • 选择可用插件
  • 找到并选择自定义线程组
  • 选择Apply Changes and Restart JMeter

apache_pluginmanager.png

一旦“自定义线程组”插件被安装,一个建议的替代线程组是bzm -并发线程组因为它允许直接的步骤配置,直观地呈现定义的压力,从测试的角度来看,这是一个很好的验证功能。

使用事务对请求进行分组

向测试中添加事务是分组的一种有用方法属于同一个“操作”的一个或多个类似请求.例如,加载一个应用程序,一个导航地图缩放或表单搜索。使用这样的事务可以极大地帮助分析,因为它将操作(例如表单搜索)隔离到自己的逻辑“容器”中,只有负责其功能的请求。然而,将许多不同功能或服务的请求放在一个大组中会使测试后的研究非常困难。通过事务,可以分别进行分析以了解每个操作的性能。

注:地图应用和工作流程各不相同;有些操作具有由许多请求组成的事务,而其他操作只有一个请求。

注意:测试中不同操作的性能并不总是以相同的方式扩展;有些人可能比其他人做得更好;能够识别性能较差的操作(通过惟一的事务名称)是很好的分析。

验证正在返回的响应

确保从远程服务器返回预期的响应与发送请求一样重要。由于各种原因,在测试ArcGIS资源(如服务)时,仅仅依赖HTTP状态码(例如HTTP 200)是不够的。

验证响应的一种方法是在Header或Body中查找关键字。如果请求的是PNG图像,但返回的是文本错误消息,则响应断言规则将在报头中查找“image/ PNG”,并将尝试标记为失败的.如果它出现在报头中,则认为它是通过了请求。

注意:对于JMeter测试计划中需要检查的每个HTTP请求,必须添加响应断言规则。

在JMeter中创建数据驱动的导出映射测试

使用上述策略,可以创建一个灵活而通用的JMeter测试计划,在每个请求中调用来自ArcGIS地图服务的不同感兴趣的区域。“动态测试”是理想的,因为它可以使服务器资源比每次都请求相同的数据更努力地工作。这样的测试更能代表现实世界的情况。

作为一名性能测试人员,我们希望使用如下所示的导出映射请求签名,并将其转换为动态JMeter负载测试:

https://yourwebadaptor.domain.com/server/rest/services/SampleWorldCities/MapServer/export?dpi=96&transparent=true&format=png32&layers=show%3A0%2C1%2C2&bbox=-108.76228873935%2C31.0409016308382%2C-88.8526618315487%2C46.9686031570791&bboxSR=4326&imageSR=4326&size=1477%2C827&f=image

JMeter提供了几种在测试计划中构建HTTP有效负载的方法,例如:

  • 手工创建请求(例如手动)
  • 使用内置记录器直接捕获浏览器请求
  • 从其他来源导入

本文将重点介绍手动创建JMeter测试的第一种方法,如何组装请求的组件,以及如何使其行为“动态”。这个数据驱动测试将通过导出函数调用SampleWorldCities地图服务(在本地部署上运行)。

注意:从许多方面来看,SampleWorldCities被认为是一个非常小且轻量级的地图服务,但是考虑到它在ArcGIS服务器部署中无处不在,使用它来完成负载测试的创建是非常理想的。

创建并保存一个新的测试计划

  • 从文件系统创建上面提到的文件夹结构:
    • 项目文件夹的名称将称为sampleworldcities1
      • 假设这将存在于:
        • C: \ \ JMeter测试
      • 创建支持项目目录:
        • 例如:数据集、日志、报告、结果、上传
  • 开始JMeter
  • 将JMeter创建的新测试计划保存到刚刚创建的sampleworldcities1文件夹中
    • 调用测试计划:sampleworldcities1.jmx
      • 假设jmx测试计划的完整路径是:
      • C: \ \ sampleworldcities1 \ sampleworldcities1.jmx JMeter测试

newtestplan_empty.png

  • 在文件系统中,项目文件夹看起来如下所示:

filesystem_newtestplan.png

向测试计划中添加变量

  • 在JMeter中,点击测试计划(例如sampleworldcities1)
  • 在用户定义变量部分的底部,单击Add
    • 名称输入:ProjectFolder
      • 输入值:C:\JMeter Tests\sampleworldcities1
    • 对于名称,输入:WebServerName
      • 数值输入:yourwebadaptor.domain.com
        • 输入Web适配器或ArcGIS服务器的主机名
    • 对于“名称”,输入:ServerInstanceName
      • 取值:服务器
        • 有些部署使用不同的值,例如arcgis
    • 名称输入:SecurePort
      • 取值:443
        • 如果指向一个ArcGIS Server实例,请使用6443
    • “名称”输入:“ServiceName”
      • 价值输入:SampleWorldCities

testplan_uservariables.png

将bzm并发线程组添加到测试计划中

  • 右键单击sampleworldcities1测试计划,在Add—>线程(用户)下,选择bzm—并发线程组

add_concurrencythreadgroup.png

  • 在sampleworldcities1测试计划下,单击bzm -并发线程组
  • 配置步骤加载逻辑如下:
    • 目标并发数:10
    • 加速时间(分钟):20
    • 计数器:10

configure_concurrencythreadgroup.png

使用bzm -并发线程组插件,配置的步骤加载逻辑可以在上面的图表中很容易地看到和直观地确认。该测试将被设置为运行20分钟,将通过使用10个不同的步骤来增加压力(每2分钟一次添加一个并发测试线程),达到最多10个并发测试线程后将停止。

向测试计划添加事务

  • 右键单击bzm -并发线程组,在添加——>逻辑控制器下,选择事务控制器

add_transactioncontroller.png

  • 一旦添加,给事务控制器(例如工作流操作)一个有意义的名称,以区别于测试中可能存在的其他名称
  • 对于名称,输入:MapScale_9M
    • 9M代表900万的地图比例尺(例如1:9,244,649)
    • 现在可以将一个或多个HTTP请求添加到此事务控制器
  • 从事务控制器部分选择“生成父样例”
    • 此选项可以帮助验证,因为它在Transaction对象下显示各自的请求

rename_transactioncontroller.png

添加HTTP请求

现在我们想要创建一个数据驱动的HTTP请求,每个请求都要求不同的空间范围。这是通过常规的JMeter HTTP请求完成的。

  • 右键单击名为MapScale_9M的事务控制器,然后在Add——>Sampler下,选择HTTP Request

add_httprequest.png

  • 新的空HTTP请求应该类似于以下内容:

empty_httprequest.png

使HTTP请求动态

导出映射的请求签名,例如:

https://yourwebadaptor.domain.com/server/rest/services/SampleWorldCities/MapServer/export?dpi=96&transparent=true&format=png32&layers=show%3A0%2C1%2C2&bbox=-108.76228873935%2C31.0409016308382%2C-88.8526618315487%2C46.9686031570791&bboxSR=4326&imageSR=4326&size=1477%2C827&f=image

包含几个URL组件,这些组件需要访问HTTP请求页面的不同位置(以最大限度地提高灵活性和维护)。让我们从分离URL参数的请求的键/值对开始。

下面的参数部分已被修改为包含几个JMeter变量,而不是原始值。有些部分会引用测试中尚未创建的JMeter变量名,这是可以接受的。

  • 复制以下内容,并通过单击底部的“从剪贴板添加”将其粘贴到HTTP请求中:

dpi = 96透明= true&format = png32&layers = % 3展示a0 % 2 c1 % 2 c2&bbox = $ {bbox_9244649} &bboxSR = $ {sr_9244649} &imageSR = $ {sr_9244649}大小= $ {width_9244649} {height_9244649}加元% 2 f =形象

这将有助于设置必要的几个部分,使HTTP请求的某些部分成为动态的。

keyvaluepairs_httprequest.png

  • 在Web服务器部分:
    • 协议输入:https
    • 对于服务器名或IP,输入:${WebServerName}
    • 端口号输入:${SecurePort}
  • 在HTTP请求部分:
    • 路径:“/${ServerInstanceName}/rest/services/${ServiceName}/MapServer/export”

serverpath_httprequest2.png

添加响应断言

  • 右键单击HTTP请求,在Add——>断言下,选择响应断言

add_responseassertion.png

  • 更改几个响应断言参数:
    • 在“要测试的字段”下,选择:响应头
    • 在“模式匹配规则”下选择:包含
    • 在Patterns to Test下,单击Add并输入:image/png

configure_responseassertion.png

添加CSV数据集配置

  • 右键单击测试计划(例如sampleworldcities1),并在Add—>Config Element下,选择CSV Data Set Config

add_csvdatasetconfig.png

  • 选择CSV数据集配置并将其重命名为CSV数据集配置—9M
    • 如果在一个测试中使用了多个数据文件,那么提供一个唯一的名称可以帮助维护/管理(例如,每个地图比例尺的边界框都有一个文件)

rename_csvdatasetconfig.png

  • 使用文本编辑器,用以下16行数据填充一个空CSV文件:

bbox,宽度,高度,mapUnits、sr、规模

-108.76228873935, 31.0409016308382, -88.8526618315487, 46.9686031570791, 1280年,1024年,esriDecimalDegrees, 4326, 9244649

23.1282001284589, 34.337748761293, 43.03782703626, 50.2654502875339, 1280年,1024年,esriDecimalDegrees, 4326, 9244649

-117.052786808947, 35.3545948648786, -97.1431599011459, 51.2822963911194, 1280年,1024年,esriDecimalDegrees, 4326, 9244649

-100.83549484975, 36.0637839078502, -80.9258679419492, 51.991485434091, 1280年,1024年,esriDecimalDegrees, 4326, 9244649

17.7030587822399, 34.3302705716379, 37.6126856900409, 50.2579720978788, 1280年,1024年,esriDecimalDegrees, 4326, 9244649

32.2827904735659, 37.2792197897781, 52.192417381367, 53.2069213160189, 1280年,1024年,esriDecimalDegrees, 4326, 9244649

0.222469446585188, 35.0562794764081, 20.1320963543862, 50.9839810026489, 1280年,1024年,esriDecimalDegrees, 4326, 9244649

100.262489726575, 20.8660021309943, 120.172116634376, 36.7937036572352, 1280年,1024年,esriDecimalDegrees, 4326, 9244649

72.4186084471192, 22.1748804724666, 92.3282353549203, 38.1025819987075, 1280年,1024年,esriDecimalDegrees, 4326, 9244649

-61.2094273153097, -26.7402777397378, -41.2998004075086, -10.812576213497, 1280年,1024年,esriDecimalDegrees, 4326, 9244649

-72.5908131920005, -26.6270515481087, -52.6811862841995, -10.6993500218679, 1280年,1024年,esriDecimalDegrees, 4326, 9244649

99.7474167083529, 20.7088254145549, 119.657043616154, 36.6365269407958, 1280年,1024年,esriDecimalDegrees, 4326, 9244649

102.59837658124, 20.384726879328, 122.508003489041, 36.3124284055689, 1280年,1024年,esriDecimalDegrees, 4326, 9244649

80.8239612278688, 23.4521454643548, 100.73358813567, 39.3798469905956, 1280年,1024年,esriDecimalDegrees, 4326, 9244649

-105.812716128284, 31.0536390717042, -85.9030892204829, 46.9813405979451, 1280年,1024年,esriDecimalDegrees, 4326, 9244649

  • 保存CSV文件到:C:\JMeter Tests\sampleworldcities1\datasets\bbox_9244649.csv
  • 在CSV数据集配置窗口中,单击“浏览”,浏览刚刚保存的bbox_9244649.csv文件
  • 配置数据源的几个项:
    • 更改文件名为:C:/JMeter Tests/sampleworldcities1/datasets/bbox_9244649.csv
      • : $ {ProjectFolder} /数据/ bbox_9244649.csv
    • 变量名添加:bbox_9244649,width_9244649, hight_9244649,sr_9244649
    • 忽略第一行
      • :真正的
    • 更改允许引用数据?
      • :真正的

configure_csvdatasetconfig.png

验证测试计划

  • 使用View Results Tree侦听器来帮助验证GUI中来自远程服务器的响应
    • 右键单击测试计划(sampleworldcities1)并在Add——>Listener下,选择查看结果树

add_viewresultstree.png

  • 选择View Results Tree,然后单击Apache JMeter GUI顶部的绿色三角形

play_viewresultstree.png

  • 按照配置的步骤负载,JMeter将通过重复发送请求(初始)开始。
    • 带有复选标记的绿色护盾是请求成功的标志,如果看到此标志,请等待几秒钟,以便发送少量请求并返回响应。
    • 单击其中一个MapScale_9M绿色护盾,将显示Sampler结果选项卡,其中显示的信息如下:
      • 加载时间(响应时间)
      • 大小(以字节为单位)(标题和正文)
      • 错误数
      • 响应代码
      • ContentType

注意:此信息对于验证测试回放非常有用,但对于性能故障排除也很有用

transactionresults_viewresultstree.png

  • 由于此测试正在执行导出映射功能,因此所请求图像的可视化也将有助于测试计划验证。
    • 单击Response data选项卡并展开MapScale_9M事务应该呈现所请求的图像。
      • 根据需要对其他MapScale_9M事务进行重复操作
    • 在几个请求之间切换应该显示不同的图像,这验证了在JMeter中创建数据驱动的导出映射负载测试

exportimage1_viewresultstree.png

exportimage2_viewresultstree.png

保存最近的更改

自上次Save以来,我们做了许多更改。

  • 保存测试计划
    • 文件- >保存

要下载本文中使用的Apache JMeter测试计划,请参见:sampleworldcities1.zip

要下载包含更多详细信息的Apache JMeter测试计划,请参阅:sampleworldcities2.zip

准备运行负载测试

Apache JMeter团队建议从GUI运行负载测试,而是从命令行调用测试,以获得最佳性能和资源利用。由于这一过程可能涉及到几个值得详细讨论的开关、参数调整和检查,因此这是一个值得单独讨论的过程,称为:从命令行模式运行Apache JMeter负载测试(初级/中级)

注意:如果您的Apache JMeter测试将向可能影响其他用户的服务器发送请求,请与您的GIS团队协调。负载测试应该安排在非高峰营业时间运行。

Apache JMeter根据Apache2.0许可。Apache、Apache JMeter、JMeter、Apache羽毛和Apache JMeter标志是Apache软件基金会的商标。

10评论
DeanHowell1
通过
临时贡献者III

你好@AaronLopez,感谢这些伟大的文章,因为这正是我现在需要做的,但我看不出来让它工作。

我已经完成了这些步骤,但似乎我可能需要生成一个令牌,以便它从我的一端工作。下面的图片来自JMeter,因此将感谢任何帮助。我以自己的身份运行它,但它需要以ArcGIS服务器管理员的身份运行吗?

deanhowell1_0 - 1624259061818. - png

AaronLopez
通过 Esri贡献者
Esri贡献者

@DeanHowell1

感谢阅读我们关于在Apache JMeter中创建负载测试的文章。

我同意你的观点……您的部署似乎需要一个令牌来使用SampleWorldCities地图服务。

我们最近添加了一个攻略使用Apache JMeter对ArcGIS企业认证服务进行负载测试(中级/高级)这可能会有所帮助。在那篇文章的末尾,您可以下载一个测试计划,其中包括讨论中列出的所有部分。

希望这能有所帮助!

亚伦

DeanHowell1
通过
临时贡献者III

谢谢@AaronLopez太完美了。

DeanHowell1
通过
临时贡献者III

你好,再一次@AaronLopez,你有任何使用查询而不是导出映射选项的功能服务的例子吗?

AaronLopez
通过 Esri贡献者
Esri贡献者

@DeanHowell1
这是个好问题。我们计划在未来的社区文章中解决测试功能服务的策略,以及从ArcGIS Pro中生成测试数据(边界框和点)的方法。

从短期来看,最快的方法可能是使用Apache JMeter内置的HTTP记录。当您与web应用程序的功能服务交互时,记录器将捕获请求,并将它们直接放入测试计划中。理想情况下,应用程序中的每个平移或缩放在测试中都是它自己的事务。

如果您预先录制了捕获的特性服务流量的HTTP Archive (*.har)文件,可以使用一个免费实用程序HAR2JMX(har to jmx),可以将它们直接转换为Apache JMeter测试计划。

DeanHowell1
通过
临时贡献者III

谢谢@AaronLopez,我期待将来的文章,谢谢你的建议。看起来JMeter将会是一个非常方便的工具。

AaronLopez
通过 Esri贡献者
Esri贡献者

@DeanHowell1

性能工程团队最近发布了一篇关于在Apache JMeter中针对托管的特性层服务创建负载测试!讨论涵盖了如何生成(特性服务)测试数据,以及如何将这些数据(查询范围)插入到Apache JMeter test Plan中进行负载测试。我们采用了一种程序化的方法来解决这个挑战,但是这部分测试逻辑对测试人员来说是隐藏的。

测试快乐!

亚伦

DeanHowell1
通过
临时贡献者III

谢谢@AaronLopez这是一篇非常全面的文章,我相信它会对你有好处。再次感谢,院长

AYUSHYADAV
通过
新贡献者III

@AaronLopez

在您上面的工作流程中,您提到了添加bzm -测试计划的并发线程组。

ayushyadav_0 - 1648810567470. - png

但是该选项/工具在Jmeter中不可见。只是想问问我们是否需要为此安装任何插件,或者我们将如何在我们的测试计划中获得它。

谢谢

Ayush

AaronLopez
通过 Esri贡献者
Esri贡献者

你好@AYUSHYADAV

只是想问问我们是否需要为此安装任何插件,或者我们如何在我们的测试计划中得到它。
bzm -并发线程组需要安装JMeter插件管理器。有了这些,当您打开测试计划时,JMeter将自动下载并安装在测试计划中引用的任何附加项。这真的很方便,但是你需要安装插件管理器。

安装插件管理器:
下载plugins-manager.jar文件,并将其放入JMeter的lib/ext目录(例如C:\apache-jmeter-5.4.3\lib\ext)。然后(重新)启动JMeter。