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

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

先决条件

本教程包含针对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的插件管理器(选项->)插件管理器):

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

apache_pluginmanager.png

一旦安装了“自定义线程组”插件,推荐的线程组替代方案是bzm——并发线程组因为它允许直接的步骤配置,可以直观地呈现定义的压力,从测试的角度来看,这是一个很好的验证特性。

使用事务对请求进行分组

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

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

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

验证正在返回的响应

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

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

注意:对于需要在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 Server部署中无处不在,使用它来完成负载测试的创建是理想的。

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

  • 在文件系统中创建上面提到的文件夹结构:
    • 项目文件夹的名称将称为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
      • 对于Value,输入:yourwebadaptor.domain.com
        • 输入您的Web适配器或ArcGIS服务器的主机名
    • “名称”输入:ServerInstanceName
      • 取值输入:server
        • 有些部署使用不同的值,例如arcgis
    • 名称输入:SecurePort
      • 取值输入:443
        • 如果指向ArcGIS Server实例,则使用6443
    • 名称输入:ServiceName
      • 对于值输入:SampleWorldCities

testplan_uservariables.png

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

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

add_concurrencythreadgroup.png

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

configure_concurrencythreadgroup.png

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

向测试计划添加事务

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

add_transactioncontroller.png

  • 一旦添加,给事务控制器(例如工作流操作)一个有意义的名称,将其与测试中可能存在的其他名称区分开来
  • 名称输入:MapScale_9M
    • 9M表示地图比例尺为900万(例如:9,244,649)
    • 现在可以将一个或多个HTTP请求添加到此事务控制器
  • 从Transaction Controller部分选择“Generate parent sample”
    • 该选项可以帮助进行验证,因为它在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 Request页面上的不同位置(以最大限度地提高灵活性和维护)。让我们通过分离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

  • 更改几个响应断言参数:
    • 在要测试的字段下,选择:响应标头
    • 在模式匹配规则下选择:包含
    • 在要测试的图案下,单击添加并输入:image/png

configure_responseassertion.png

添加CSV数据集配置

  • 右键单击测试计划(例如sampleworldcities1),然后在添加->配置元素下,选择CSV数据集配置

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\ datassets \bbox_9244649.csv
  • 在CSV Data Set Config窗口中,单击Browse并导航到刚刚保存的bbox_9244649.csv文件
  • 配置数据源的几个项目:
    • 将文件名改为:C:/JMeter Tests/sampleworldcities1/ datassets /bbox_9244649.csv
      • : $ {ProjectFolder} /数据/ bbox_9244649.csv
    • 对于变量名添加:bbox_9244649,width_9244649,height_9244649,sr_9244649
    • 忽略第一行
      • :真正的
    • 允许引用数据吗?
      • :真正的

configure_csvdatasetconfig.png

验证测试计划

  • 使用View Results Tree侦听器来帮助验证来自远程服务器的GUI中的响应
    • 右键单击Test Plan (sampleworldcities1),然后在Add- >Listener下,选择View Results Tree

add_viewresultstree.png

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

play_viewresultstree.png

  • 按照配置的步骤负载,JMeter开始时会重复发送请求,(最初)一次发送一个请求。
    • 带有复选标记的绿色屏蔽是请求成功的标志,如果看到这种情况,请等待几秒钟,等待发送一些请求并返回响应。
    • 点击其中一个MapScale_9M绿色屏蔽将显示采样结果选项卡,其中显示的信息如下:
      • 加载时间(响应时间)
      • 字节大小(报头和正文)
      • 错误数
      • 响应代码
      • ContentType

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

transactionresults_viewresultstree.png

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

exportimage1_viewresultstree.png

exportimage2_viewresultstree.png

保存最近的更改

自上次保存以来,进行了许多更改。

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

要下载本文中使用的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(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。