如何使用 Rest assured 验证数组中元素的正确值
How to validate correct values of elements inside arrays with Rest assured
我正在尝试验证我的响应的某些属性,如 rest assured tutorial 中所示。
问题是,当测试数组内的属性时,我可以像示例中那样验证它们是否出现,但不能验证它们是否与元素的其他属性匹配。
为了澄清,假设我有教程的回复(添加 "prize")
{
"lotto":{
"lottoId":5,
"winning-numbers":[2,45,34,23,7,5,3],
"winners":[{
"winnerId":23,
"prize":5000,
"numbers":[2,45,34,23,3,5]
},{
"winnerId":54,
"prize":100000,
"numbers":[52,3,12,11,18,22]
}]
}
}
我可以验证 winnerIds 为 23 和 54
expect().
body("lotto.lottoId", equalTo(5)).
body("lotto.winners.winnderId", hasItems(23, 54)).
when().
get("/lotto");
我可以验证奖品是 500 和 100000,但我无法验证 winnerId=23 的奖品是 500,winnerId=54 的奖品是 100000。响应将显示 winnerId=23,奖品=100000,测试将通过。
我无法使用 contains() because the elements in the array can come in any order, so I need to user containsInAnyOrder()。
据我所知,Rest-Assured 只允许验证直接的值验证。对于条件验证,您必须改用 jsonpath:
$.lotto.winners.[?(@.winnerId==23)].prize
以上jsonpath搜索lotto
下的winners
数组,选择winnerId==23
的数组项,然后获取奖品;
expect().
body("$.lotto.winners.[?(@.winnerId==23)].prize", equalTo(5000)).
when().
get("/lotto");
SO 中还有其他帖子可供您参考 here and here
试试这个 link
中的表达式
可以找到 JsonPath 表达式语法 here。
使用 hamcrest,注意事项,获奖名单中的一项被视为地图。
@Test
void test() {
expect()
.body("lotto.lottoId", equalTo(5))
.body("lotto.winners.", allOf(
hasWinner(23, 5000),
hasWinner(54, 100000)
))
.when()
.get("/lotto");
}
private Matcher<Iterable<? super Map<? extends String, ? extends Integer>>> hasWinner(int winnerId, int prize) {
return hasItem(allOf(
hasEntry(equalTo("winnerId"), equalTo(winnerId)),
hasEntry(equalTo("prize"), equalTo(prize))
));
}
我正在尝试验证我的响应的某些属性,如 rest assured tutorial 中所示。
问题是,当测试数组内的属性时,我可以像示例中那样验证它们是否出现,但不能验证它们是否与元素的其他属性匹配。
为了澄清,假设我有教程的回复(添加 "prize")
{
"lotto":{
"lottoId":5,
"winning-numbers":[2,45,34,23,7,5,3],
"winners":[{
"winnerId":23,
"prize":5000,
"numbers":[2,45,34,23,3,5]
},{
"winnerId":54,
"prize":100000,
"numbers":[52,3,12,11,18,22]
}]
}
}
我可以验证 winnerIds 为 23 和 54
expect().
body("lotto.lottoId", equalTo(5)).
body("lotto.winners.winnderId", hasItems(23, 54)).
when().
get("/lotto");
我可以验证奖品是 500 和 100000,但我无法验证 winnerId=23 的奖品是 500,winnerId=54 的奖品是 100000。响应将显示 winnerId=23,奖品=100000,测试将通过。
我无法使用 contains() because the elements in the array can come in any order, so I need to user containsInAnyOrder()。
据我所知,Rest-Assured 只允许验证直接的值验证。对于条件验证,您必须改用 jsonpath:
$.lotto.winners.[?(@.winnerId==23)].prize
以上jsonpath搜索lotto
下的winners
数组,选择winnerId==23
的数组项,然后获取奖品;
expect().
body("$.lotto.winners.[?(@.winnerId==23)].prize", equalTo(5000)).
when().
get("/lotto");
SO 中还有其他帖子可供您参考 here and here
试试这个 link
中的表达式可以找到 JsonPath 表达式语法 here。
使用 hamcrest,注意事项,获奖名单中的一项被视为地图。
@Test
void test() {
expect()
.body("lotto.lottoId", equalTo(5))
.body("lotto.winners.", allOf(
hasWinner(23, 5000),
hasWinner(54, 100000)
))
.when()
.get("/lotto");
}
private Matcher<Iterable<? super Map<? extends String, ? extends Integer>>> hasWinner(int winnerId, int prize) {
return hasItem(allOf(
hasEntry(equalTo("winnerId"), equalTo(winnerId)),
hasEntry(equalTo("prize"), equalTo(prize))
));
}