gpt4 book ai didi

java - REST 保证 : How to find element using nested property in JSON and validate other properties

转载 作者:行者123 更新时间:2023-12-04 20:47:36 25 4
gpt4 key购买 nike

我对放心的经验有限。我们有许多测试,我通常可以在其中找到示例,或者让 google 失败,但是在尝试匹配匿名数组中元素的嵌套属性时,我被卡住了,并上下验证属性(堂兄弟?) .

示例 JSON:

[  
{
"id":1,
"type":{
"typeId":3,
"name":"LPM"
},
"status":{
"id":1,
"price":1.20,
"source":172,
"valid":0
}
},
{
"id":2,
"type":{
"typeId":2,
"name":"ST"
},
"status":{
"id":10,
"price":1.20,
"source":172,
"valid":0
}
}
]

我用的是放心,我想在列表中找到 type.name的元素等于LPM,然后验证 status.price , status.source , 和 status.id只有那个元素。

当我最初开始验证响应时,数组中只能有一个项目,所以我使用了:
response.then()
.assertThat()
.body("size", greaterThan(0))
.body("[0].type.name", equalToIgnoringCase("LPM"))
.body("[0].status.id", equalTo(statusId))
.body("[0].status.source", equalTo(sourceId))
.body("[0].status.price", equalTo(price));

然而,这不再保证有效,因为数组中可能有多个元素,并且无法保证顺序。

我已将我的 body 检查修改为:
response.then()
.assertThat()
.body("size", greaterThan(0))
.body("type.name", hasItem("LPM"))
.body("status.id", hasItem(statusId))
.body("status.source", hasItem(sourceId))
.body("status.price", hasItem(price));

这足以让测试通过,但这会带来风险 status.id , status.source , 和 status.price元素的 type.name LPM 可能不正确,但这不会被检测到,因为它们会与具有 type.name 的元素匹配。英石。

所以我希望能够找到具有 LPM 的元素,因为它是 type.name ,我可以保证只有一个,然后是 status.id , status.source , 和 status.price ,仅检查该元素,即 不是 ST 元素。

我试图修改我的 body 匹配器以找到带有 type.name 的元素我需要,但我无法让它工作,因为我无法弄清楚如何回到树上,横向和向下,以检查同一元素中的其他属性:
response.then()
.assertThat()
.body("size", greaterThan(0))
.body("$.findAll (it.type.name = LPM}.status.id ", hasItem(statusId))
.body("$.findAll (it.type.name = LPM}.status.source", hasItem(sourceId))
.body("$.findAll (it.type.name = LPM}.status.price", hasItem(price));

此外,即使这行得通,它也会搜索树 3 次,而实际上只搜索一次。

我的中场比赛现在已经通过了这个测试,但我想把它做对。我知道我可以将元素放入 List并从那里解决它,但为了与我们其他示例的一致性,我宁愿不这样做,尽管我目前看不到其他选择。

我试图在文档、多个放心教程和示例中找到我想要做的事情的示例,但我没有,所以总是有可能这实际上是不可能的。如果不是,我很乐意教育它背后的理论。

任何帮助表示赞赏。

最佳答案

这是一种方法:

...
then().
root("find {it.type.name == '%s'}.status").
body("id", withArgs("LPM"), is(1)).
body("price", withArgs("LPM"), is(1.20f)).
body("source", withArgs("LPM"), is(172)).
body("id", withArgs("ST"), is(10));

(您显然也可以将 withArgs 提取到变量中以避免重复)。
find是 Groovy 查找与谓词 ( {it.type.name == '%s'} )、 findAll 匹配的第一个元素的方法将始终返回一个列表。
root指示 REST Assured 使用在后续预期中使用的“根路径”(参见 docs)。

关于java - REST 保证 : How to find element using nested property in JSON and validate other properties,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42147425/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com