我是一个相对新手的工程师,所以如果我误用术语或遗漏一些明显的东西,请原谅我。 针对问题-
我正在使用 Karate 框架编写 QA 自动化测试,并且尝试获取响应正文中收到的一系列 json 对象,评估每个对象是否存在特定的深层嵌套对象,然后创建一个对象变量,仅包含那些嵌套有该特定对象的对象,以便在以后的断言中使用,以验证该场景中的预定义模式。
我尝试了以下几种不同的变体,例如将!= null添加到filteredResponseObject定义中最深的对象中,但所有这些最终都会生成一个json变量对象,该对象仍然包含其中没有嵌套对象的对象它们,因此对于场景后面的断言无效
* def responseObjects = $.topLevelObjects[*]
// Other assertions
// creating a filtered Object that only contains topLevelObjects with the specificFourthLevel object present
*def filteredResponseObjects = $.responseObjects[?(@.specificSecondLevelObject[*].specificThirdLevelObject[?(@.specificFourthLevelObject)])]
And assert filteredResponseObjects.length > 0
//additional assertions
该对象已创建,但正如我所提到的,仍然具有不包含我正在查找的嵌套对象的 topLevelObjects。 我尝试了一些关于 CoPilot 和 Chat GPT 的建议,但没有成功。 我还应该补充一点,我想简单地使模式中测试的对象成为可选的,但我的技术主管不想使用该解决方案,因为该模式在许多其他功能文件中使用。任何帮助或建议将不胜感激。
我建议使用 JS 数组过滤器方法,而不是使用 JsonPath 方法。如果你不熟悉 JS,没关系,像
map()
和 filter()
这样的东西很容易上手。
这里有一个很好的解释:https://stackoverflow.com/a/76091034/143475
这是一个例子:
* def response =
"""
[
{
a: {
b: {
c: 1
}
}
},
{
a: {
b: {
}
}
}
]
"""
* def filtered = response.filter(x => x.a && x.a.b && x.a.b.c == 1)
如果你很难理解这一点和链接的答案 - 尝试找懂 JS 的朋友来帮助。