Gatling:来自 Json 对地图对象的响应的地图字段

Gatling: Map fields from Json Response to a Map Object

我的回复是这样的

{
   "data":[
      {
         "id":"919274ee42fe01d40f89f51239009a2b",
         "descriptor":"Long Count_copy_1938",
         "alias":"longCount_Copy_1938",
         "type":"Numeric"
      },
      {
         "id":"435274ee42fe01d40f89f51239009a2b",
         "descriptor":"Long Count2",
         "alias":"longCount_Copy2",
         "type":"Numeric"
      },
      {
         "id":"345274ee42fe01d40f89f51239009a2b",
         "descriptor":"Short Count2",
         "alias":"Short count",
         "type":"Numeric"
      }
   ]
}

我想将 "descriptor":"id" 提取到地图中。映射后,Map对象应该是这样的

"Long Count_copy_1938" -> "919274ee42fe01d40f89f51239009a2b"
"Long Count2" -> "435274ee42fe01d40f89f51239009a2b"
"Short Count2" -> "345274ee42fe01d40f89f51239009a2b"

我是这样实现的,如果有更好的方法请告诉我。谢谢!

exec(http("Get Field ids")
  .get(s"${wqlDataSources}/")
  .check(status.is(200),
  jsonPath("$.data[*].descriptor").findAll.saveAs("descriptors"),
  jsonPath("$.data[*].id").findAll.saveAs("ids")))
.exec(session => {
  val descriptors = session("descriptors").as[Vector[String]]
  val ids = session("ids").as[Vector[String]]
  val fieldIdMap = (descriptors zip ids).toMap
  session.set("fieldIdResultMap", fieldIdMap)
  session.remove("descriptors").remove("ids")
})

大多数 JSONPath 实现支持使用 [,] 联合运算符一次提取多个值,例如$..['id','descriptor'] 以匹配您的两个属性。
(但是,联合的可用性和结果既不通用也不一致,如果你通过切换到 Goessner 或 Jayway 检查上面的路径 online here 你会发现结果不一样,测试站点上的 Gattling 选项卡甚至会引发错误;我无法判断该站点是否会使用最新版本。)

我找不到任何确认 Gatling 支持联合的文档,但我在 Gatling 的 Github 存储库中发现 this test 有一个联合:JsonPath.query("$.menu['file','year']", json) ... 所以,联合应该工作,一般来说.

经过反复试验,我发现这条路径可以使用 Gatling(即使是旧版本):

$.data[*]['id','descriptor']

哪个returns:

[
   "919274ee42fe01d40f89f51239009a2b",
   "Long Count_copy_1938",
   "435274ee42fe01d40f89f51239009a2b",
   "Long Count2",
   "345274ee42fe01d40f89f51239009a2b",
   "Short Count2"
]

因此,您应该能够使用此路径一次映射 key/value 对!

这里还有 1 个有效的解决方案,

exec(http("Get Field ids for the data source")
  .get(s"${wqlDataSources}/" + "${datasourceId}/fields)
  .check(status.is(200),
  jsonPath("$.data[*].descriptor").findAll.saveAs("descriptors"),
  jsonPath("$.data[*].id").findAll.saveAs("ids")))
.exec(session => {
  val descriptors = session("descriptors").as[Vector[String]]
  val ids = session("ids").as[Vector[String]]
  val currentFieldIdMap = (descriptors zip ids).toMap
})