当前位置: 首页 > 知识库问答 >
问题:

不能在空手道中使用条件逻辑的场景的同一行中使用“==”和“包含”

夔宏深
2023-03-14

这是这里提到的一个问题的后续

假设我们实现的服务器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" }

我们在通用场景中实现模式验证,如下所示。我们可以很容易地使用v1Response/v2Response设置“response”,使用v1Schema/v2Schema设置“schema”,具体取决于我们的环境。

* match response == schema

只要我们针对v1客户机测试v1服务器,或者针对v2客户机测试v2服务器,上述通用脚本就可以很好地工作。然而,当我们想要测试例如v2服务器与v1客户端的向后兼容性时,我们不能重复使用相同的场景。在这种情况下

* match response (actually v2Response) == schema (actually v1Schema) <--- will fail

所以为了让它工作并进行向后兼容性测试,我还想使用空手道的“contains”特性,比如

* match response (actually v2Response) contains schema (actually v1Schema) <--- will pass

然而,为了让我的场景保持通用性,目前也不可能做到这一点

  • 在同一行脚本中使用两个==/包含,如下所示
    • serverVersion==clientVersion?(匹配响应==模式):(匹配响应包含模式)

    或者

    使用一些标志如下

    • 匹配响应标志模式

    而在karate-config.js中,SOMEFLAG可以设置为“==”或“contains”,具体取决于我们测试的环境。

    编辑

    从上面的例子中,我只想测试以下应该通过的案例

    * match v1Response == v1Schema
    * match v2Response == v2Schema 
    * match v2Response contains v1Schema
    

    使用通用行如下

    * match response == schema <--- can it possibly be solved using above suggested solutions ?
    

共有1个答案

甘永春
2023-03-14

出于某种原因,您觉得破解匹配子句是解决这个问题的唯一方法。请保持开放的心态,给你:

* 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)

最后一行是尽可能通用的。

 类似资料:
  • 空手道是否支持这样一个特性:您可以在一个场景中定义一个变量,并在同一个特性文件中在其他场景中重用它。我试着做同样的事,但得到一个错误。在同一个特性文件中重用变量的最佳方法是什么? 错误:

  • 我想在发送请求之前将每个请求转换为以下格式。 我相信我们可以使用类似来转换字符串。 我们如何在空手道中使用这一点,将每个请求转换成以下格式: 我还想处理响应,并将其还原为以下格式?

  • 真希望有人能帮上忙。 在cucumber的“示例”中是否可以使用两个不同的外部数据文件?如下所示: @play_movie 场景概述:在网站上播放视频 在这个场景中有一个数据文件,但是如果我想在这个场景中使用两个或更多不同的数据文件呢。有可能用cucumber做吗? 我使用Java作为编码语言。 谢谢

  • 任何帮助都将非常感谢! 谢里奥

  • 我在文档中读到,通过在simulation类中为不同的类路径添加新的行,我们可以运行多个功能文件。有没有一种方法可以让我们像在FeatureRunner文件中一样运行属于同一个包的多个功能文件?

  • 空手道标头示例不显示如何访问以外的配置值。当我切换环境(传递作为run命令的一部分)然后被正确设置。 问题是,我想使用这里所示的其他配置值,但是当我运行测试时,它无法访问正确。相反,我得到了这个错误 我的文件和。 (这里类似的问题,使用单独的:https://github.com/intuit/karate/issues/94)