如何验证名称-值对的值是否包含 API 响应对象中的文本?

问题描述 投票:0回答:1

我目前正在用空手道编写 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"

如何迭代响应来验证名称以及该值是否包含特定字符串,而不会有误报的风险?

visual-studio-code karate web-api-testing
1个回答
0
投票

我建议采用不同的方法。当面对“动态键”时,最好将输入数据转换为更适合正常

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

© www.soinside.com 2019 - 2024. All rights reserved.