我目前正在用空手道编写 API 测试,并且遇到了一个我一直在努力解决的场景。我想验证响应中的每个对象是否都有一个特定项目,该项目的值包含子字符串。
例如,假设我的响应模式如下:
[
{
"Name-1": "Value-1",
"Name-2": "Value-2",
"Name-3": "Value-3",
"Name-4": "Value-4",
}
]
我想验证每个对象是否都有一个名为“Name-2”的项目,其值包含“2”。
我目前的方法如下:
* match each response[*].Name-2 contains "2"
这让我成功了。但是,架构最近发生了变化,我之前验证的一些项目不再存在。假设这个项目叫做
"Old-Name-2": "Old-Value-2"
。
使用的验证与上面类似:
* match each response[*].Old-Name-2 contains "2"
我遇到的问题是,当我用这条线运行测试时,我得到了误报结果。我希望测试出错,因为
Old-Name-2
不再位于响应对象中。
当我添加时,测试会出现适当的错误:
* match response[0].Old-Name-2 contains "2"
如何迭代响应来验证名称以及该值是否包含特定字符串,而不会有误报的风险?
我建议采用不同的方法。当面对“动态键”时,最好将输入数据转换为更适合正常
match
断言的形式。这是一种方法:
* def response =
"""
{
"Name-1": "Value-1",
"Name-2": "Value-2",
"Name-3": "Value-3",
"Name-4": "Value-4"
}
"""
* def keys = karate.keysOf(response)
* def pairs = keys.map(x => ({ key: x, value: response[x] }))
* match pairs contains { key: 'Name-2', value: "#? _.includes('2')" }
您可以在此基础上轻松进行任何其他断言。
有关类似 JSON 转换的详细信息,请参阅:https://stackoverflow.com/a/76091034/143475