Groovy 验证 JSON 响应中是否存在某些值的脚本断言
Groovy script assertion that validates the presence of some values in a JSON response
所以我正在使用一个名为 ReadyAPI 的测试工具,并且它使用 Groovy 语言编写脚本。我不熟悉这种语言,而且它基于 Java 的事实不知何故使它变得更糟。
现在,我正在尝试使用断言来验证 JSON 中的 REST 响应,该断言会检查响应中是否存在某些元素。
这是我现在的代码:
import groovy.json.*
def response = context.expand( 'RequestResponseHere' )
def object = new JsonSlurper().parseText(response)
assert response.contains("CODE1")
assert response.contains("CODE2")
assert response.contains("CODE3")
assert response.contains("CODE4")
这个断言似乎有效,但我想知道是否有比写这么多行并减少它更简单的方法 'bulky'?
非常感谢任何帮助。
谢谢!
添加了一个我必须解析的 json 数据的示例:
我需要的是检查“代码”的值是否始终是可接受值列表的一部分 e.i。 CODE1、CODE2 等
{
"_embedded": {
"taskList": [
{
"code": "CODE1",
"key": 123
},
{
"code": "CODE2",
"key": "234"
},
{
"code": "CODE3",
"key": "2323"
},
{
"code": "CODE4",
"key": "7829"
},
{
"code": "CODE5",
"key": "8992"
}
]
}
}
The assertion seems to work but I was wondering if there is maybe a
simpler way to do it than to have to write so many lines and making it
less 'bulky'?
不清楚什么是庞大的,但如果您想要减少语句的数量,您可以做的一件事是使用单个 assert
.
而不是这个:
assert response.contains("CODE1")
assert response.contains("CODE2")
assert response.contains("CODE3")
assert response.contains("CODE4")
你可以这样:
assert response.contains("CODE1") &&
response.contains("CODE2") &&
response.contains("CODE3") &&
response.contains("CODE4") &&
如果你想检查那里是否有某些东西,你可以 DRY that
代码:
["code1","code2"].each{ assert response.contains(it) }
并且如评论中所述,如果您想确定“所有都在那里,
但我不关心订单”,提取值并进行比较
因为结果可以缩短这个:
assert response._embeded.taskList*.code.toSet() == ["code1", ...].toSet()
注意 *.
的使用,它是“扩展运算符”。基本上是
与 ...collect{ it.code }
相同。然后比较字符串集
剩下的(如果你比较的项目不多,这很好,因为
power assert 将打印失败断言中的所有项目;如果
你必须在大海捞针中找到众所周知的针,你会更好
写一些更聪明的东西来检查两组)。
所以我正在使用一个名为 ReadyAPI 的测试工具,并且它使用 Groovy 语言编写脚本。我不熟悉这种语言,而且它基于 Java 的事实不知何故使它变得更糟。
现在,我正在尝试使用断言来验证 JSON 中的 REST 响应,该断言会检查响应中是否存在某些元素。
这是我现在的代码:
import groovy.json.*
def response = context.expand( 'RequestResponseHere' )
def object = new JsonSlurper().parseText(response)
assert response.contains("CODE1")
assert response.contains("CODE2")
assert response.contains("CODE3")
assert response.contains("CODE4")
这个断言似乎有效,但我想知道是否有比写这么多行并减少它更简单的方法 'bulky'?
非常感谢任何帮助。
谢谢!
添加了一个我必须解析的 json 数据的示例: 我需要的是检查“代码”的值是否始终是可接受值列表的一部分 e.i。 CODE1、CODE2 等
{
"_embedded": {
"taskList": [
{
"code": "CODE1",
"key": 123
},
{
"code": "CODE2",
"key": "234"
},
{
"code": "CODE3",
"key": "2323"
},
{
"code": "CODE4",
"key": "7829"
},
{
"code": "CODE5",
"key": "8992"
}
]
}
}
The assertion seems to work but I was wondering if there is maybe a simpler way to do it than to have to write so many lines and making it less 'bulky'?
不清楚什么是庞大的,但如果您想要减少语句的数量,您可以做的一件事是使用单个 assert
.
而不是这个:
assert response.contains("CODE1")
assert response.contains("CODE2")
assert response.contains("CODE3")
assert response.contains("CODE4")
你可以这样:
assert response.contains("CODE1") &&
response.contains("CODE2") &&
response.contains("CODE3") &&
response.contains("CODE4") &&
如果你想检查那里是否有某些东西,你可以 DRY that 代码:
["code1","code2"].each{ assert response.contains(it) }
并且如评论中所述,如果您想确定“所有都在那里, 但我不关心订单”,提取值并进行比较 因为结果可以缩短这个:
assert response._embeded.taskList*.code.toSet() == ["code1", ...].toSet()
注意 *.
的使用,它是“扩展运算符”。基本上是
与 ...collect{ it.code }
相同。然后比较字符串集
剩下的(如果你比较的项目不多,这很好,因为
power assert 将打印失败断言中的所有项目;如果
你必须在大海捞针中找到众所周知的针,你会更好
写一些更聪明的东西来检查两组)。