不能在空手道中使用条件逻辑在同一行场景中使用“==”和 "contains"
Cannot use "==" and "contains" in same line of scenario using conditional logic in Karate
这是
的跟进
假设我们实施的服务器 v1 和 v2 响应如下所示
v1Response = { id: "1", name: "awesome" }
v2Response = { id: "2", name: "awesome", value: "karate" }
类似地,我们为 v1 和 v2 定义客户端架构,如下所示
v1Schema = { id: "#string", name: "#string }
v2Schema = { id: "#string", name: "#string, value: "#string" }
我们在通用场景中按如下方式实现模式验证。根据我们的环境,我们可以轻松地将 "response" 设置为 v1Response/v2Response 和 "schema" 以及 v1Schema/v2Schema。
* match response == schema
只要我们针对 v1 客户端测试 v1 服务器/针对 v2 客户端测试 v2 服务器,上述通用脚本就可以正常工作。但是,当我们想要测试向后兼容性时,我们不能重复使用相同的场景
针对 v1 客户端的 v2 服务器。在这种情况下
* match response (actually v2Response) == schema (actually v1Schema) <--- will fail
所以为了让它工作并进行向后兼容性测试,我也想使用空手道 "contains" 功能,例如
* match response (actually v2Response) contains schema (actually v1Schema) <--- will pass
然而,为了让我的场景保持通用,目前无法做到
- 在同一行脚本中同时使用==/contains,如下所示
- 服务器版本==客户端版本? (匹配响应 == 架构):(匹配响应包含架构)
或
使用一些标志如下
- 匹配响应 SOMEFLAG 架构
而 SOMEFLAG 可以在空手道中设置为“==”或 "contains"-config.js,具体取决于我们正在测试的环境。
编辑
从上面的例子来看,我只想测试以下应该通过的情况
* match v1Response == v1Schema
* match v2Response == v2Schema
* match v2Response contains v1Schema
使用如下通用行
* match response == schema <--- can it possibly be solved using above suggested solutions ?
出于某种原因,您认为破解 match
子句是解决此问题的唯一方法。请保持开放的心态,给你:
* def schemas =
"""
{
v1: { id: "#string", name: "#string" },
v2: { id: "#string", name: "#string", value: "#string" }
}
"""
* def env = 'v1'
* def response = { id: "1", name: "awesome" }
* match response == schemas[env]
* def env = 'v2'
* def response = { id: "2", name: "awesome", value: "karate" }
* match response == schemas[env]
* def response = { id: "1", name: "awesome" }
* match response == karate.filterKeys(schemas[env], response)
最后一行尽可能通用。
这是
假设我们实施的服务器 v1 和 v2 响应如下所示
v1Response = { id: "1", name: "awesome" }
v2Response = { id: "2", name: "awesome", value: "karate" }
类似地,我们为 v1 和 v2 定义客户端架构,如下所示
v1Schema = { id: "#string", name: "#string }
v2Schema = { id: "#string", name: "#string, value: "#string" }
我们在通用场景中按如下方式实现模式验证。根据我们的环境,我们可以轻松地将 "response" 设置为 v1Response/v2Response 和 "schema" 以及 v1Schema/v2Schema。
* match response == schema
只要我们针对 v1 客户端测试 v1 服务器/针对 v2 客户端测试 v2 服务器,上述通用脚本就可以正常工作。但是,当我们想要测试向后兼容性时,我们不能重复使用相同的场景 针对 v1 客户端的 v2 服务器。在这种情况下
* match response (actually v2Response) == schema (actually v1Schema) <--- will fail
所以为了让它工作并进行向后兼容性测试,我也想使用空手道 "contains" 功能,例如
* match response (actually v2Response) contains schema (actually v1Schema) <--- will pass
然而,为了让我的场景保持通用,目前无法做到
- 在同一行脚本中同时使用==/contains,如下所示
- 服务器版本==客户端版本? (匹配响应 == 架构):(匹配响应包含架构)
或
使用一些标志如下
- 匹配响应 SOMEFLAG 架构
而 SOMEFLAG 可以在空手道中设置为“==”或 "contains"-config.js,具体取决于我们正在测试的环境。
编辑
从上面的例子来看,我只想测试以下应该通过的情况
* match v1Response == v1Schema
* match v2Response == v2Schema
* match v2Response contains v1Schema
使用如下通用行
* match response == schema <--- can it possibly be solved using above suggested solutions ?
出于某种原因,您认为破解 match
子句是解决此问题的唯一方法。请保持开放的心态,给你:
* def schemas =
"""
{
v1: { id: "#string", name: "#string" },
v2: { id: "#string", name: "#string", value: "#string" }
}
"""
* def env = 'v1'
* def response = { id: "1", name: "awesome" }
* match response == schemas[env]
* def env = 'v2'
* def response = { id: "2", name: "awesome", value: "karate" }
* match response == schemas[env]
* def response = { id: "1", name: "awesome" }
* match response == karate.filterKeys(schemas[env], response)
最后一行尽可能通用。