如何在没有 Jmeter 中的 foreach 控制器的情况下从数组中提取值(通过 JSON 提取器获得)

Posted

技术标签:

【中文标题】如何在没有 Jmeter 中的 foreach 控制器的情况下从数组中提取值(通过 JSON 提取器获得)【英文标题】:How to extract a value from an array (obtained through JSON extractor) without foreach controller in Jmeter 【发布时间】:2021-04-29 16:21:16 【问题描述】:

我正在处理 Jmeter 的一些问题。我向 API 发出 HTTP 请求,该 API 以 JSON 形式回答我,因此我使用 JSON 提取器来提取我需要的信息(我使用 JSON 路径表达式“$.asset_host”来获取并将其存储在名为“data”的变量中)。所以现在我有一个变量,它是一个名为“data”的数组,其中 data[0] = asset_host。

问题是我需要在下一个 HTTP 请求中使用此信息,但我不知道如何在不使用 foreach 控制器的情况下从“数据”获取asset_host。我尝试了 $data[0]$data[0]$data_0,但它不起作用.

请问有人知道如何在数组数据的键 0 处获取asset_host 值吗?

编辑

这是 JSON 响应:


    "chat_web_socket_port": "9009",
    "assets_server": "\/\/assets.local",
    "chat_web_socket_host": "chat",
    "chat_web_socket_secure": false

Here the JSON extractor

EDIT_2

好的,我找到了它不起作用的原因。 JSON响应给了我“//assets.local”,所以如果我在下一个请求中使用它作为主机,它会将“//assets.local”作为主机,这就是它不起作用的原因。我将不得不操纵字符串来删除“//”。

EDIT_3

好的,为了完成这篇文章,我使用了一个 JSR223 采样器来操作字符串并删除“//”。我把代码放在这里,也许对以后的人有帮助。

String assets = vars.get("assetServerHost_1");
String newAssets = assets.replace('//', '');
vars.put("hostForAssets", newAssets);

它正在将“//assets.local”更改为“assets.local

感谢您的阅读和帮助。

【问题讨论】:

【参考方案1】:

没有看到你的测试计划,你的 JSON Extractor 配置和 JSON 响应,很难说是什么问题,有太多可能的失败原因,最常见的一个是 JSON Extractor 放置不正确(参见JMeter Scoping Rules用户手册章节了解更多详情)

盲拍:

    0 放入“匹配编号:字段:

这样您就可以将所需的值称为$data

    如果你有 -1 那里 - 那么很可能你有 $data_1 变量和 $data_matchNr 变量保存匹配的数量

您可以使用 Debug Sampler and View Results Tree listener combination 检查 JSON 提取器生成了哪些变量

【讨论】:

感谢您的回答。我试图在“匹配号”中输入 0。领域,但它不起作用。它给了我“/”而不是我用 -1 的值。但是当我将 -1 放在同一个字段中时,如果我尝试使用 $data_1 它会向主机“$data_1”发出下一个请求,因此它不起作用。我试图找到调试采样器但我没有它,它是一个插件吗?再次感谢您尝试帮助我。【参考方案2】:

你能检查一下Debug Sampler中的数据吗?

我的猜测是:如果 $.asset_host 是一个数组,那么 jmeter 将创建单独的变量为 data_1data_2、....data_n 数组的第一个元素是data_1

以下编辑

调试采样器在 Jmeter 中是开箱即用的。详情here.

我使用了这个示例 JSON


"name": "John",
"age": 30,
"cars": [
    "Ford",
    "BMW",
    "Fiat"
],
"asset_host": "test string"

我的 JSON 提取器配置

请注意Match No 应该等于0

下面是 Debug Sampler 中提取的值

【讨论】:

感谢您帮助我。是 Jmeter 中的调试采样器和插件吗?我现在看不到。 $.asset_host 不是数组,它是 json 响应中的简单字符串,但是当我使用 JSON 提取器时,它会提取到数组中......所以我尝试使用 $data_1 访问它,但它不起作用. 根据上述回复编辑我的答案以增加清晰度 感谢您的“编辑”部分。最后我找到了为什么它不起作用。 JSON响应给我“//assets.local”作为响应,所以如果我在下一个请求采样器中使用它会将“//assets.local”放在主机中,这就是它不起作用的原因。所以我必须找到一种方法来操作字符串并删除 $data_1 开头的“//”。感谢您的帮助,现在我可以拥有一个有用的调试采样器! 很高兴您能够更正脚本。但是,您不必使用$data_1。由于这不是数组,您可以通过$data 访问它

以上是关于如何在没有 Jmeter 中的 foreach 控制器的情况下从数组中提取值(通过 JSON 提取器获得)的主要内容,如果未能解决你的问题,请参考以下文章

如何设置循环遍历CSV文件中每个值的jmeter测试?

JMeter基础 — JMeter中ForEach控制器详解

JMeter接口测试-ForEach控制器

jmeter ForEach Controller学习

jmeter 正则获取参数集合和ForEach控制器结合使用(转)

jmeter forEach控制器