不能在空手道中使用条件逻辑在同一行场景中使用“==”和 "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

然而,为了让我的场景保持通用,目前无法做到

  1. 在同一行脚本中同时使用==/contains,如下所示
    • 服务器版本==客户端版本? (匹配响应 == 架构):(匹配响应包含架构)

  1. 使用一些标志如下

    • 匹配响应 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)

最后一行尽可能通用。