首页 > 解决方案 > 空手道独立作为具有多个功能文件的模拟服务器

问题描述

我尝试使用 Karate 设置集成/API 测试套件,并考虑使用 Karate Netty 来模拟所需的服务。对于测试设置,被测系统A(一个 Spring Boot 应用程序)完全启动。然后空手道测试由针对该实例运行的 Maven 测试执行。

服务A依赖于多个其他服务,这些服务需要为测试而模拟。为此,我的想法是将正在运行的 Karate Netty 独立实例配置为 HTTP 代理(由服务 A 的 JVM 参数完成)。

现在我的想法是创建一个测试功能文件xyz-test.feature
并且该文件所需的模拟在关联的模拟功能文件中定义:(xyz-mock.feature
测试场景相当复杂,外部服务的响应可能会有所不同)

这意味着对于完整的测试运行,我需要加载几个模拟功能文件。所以:

  1. 多个模拟特征文件的匹配策略是什么?可以这么说,哪种情况会获胜。

  2. 有什么方法可以确保正确的模拟文件用于相关的测试文件?
    (很明显,我可以重新配置正在运行的独立实例并建议它接下来使用 xyz-mock.feature。
    但这会阻止我对我的 API 测试使用并行执行,对吗?)

我已经考虑过重用Correlation-Id我可以为每个测试发送的,然后在模拟文件中匹配它(它也被发送到所有被调用的服务)。但:

  1. 有没有办法为每个模拟文件定义一个全局匹配器?

标签: karate

解决方案


听起来您只需要一个模拟文件。如果您愿意,您可以在不同的端口上启动 2,但是没有办法将它们“合并”到一个端口中 - 如果这是您正在寻找的。

根据我的经验,您将能够让一个模拟处理所有边缘情况。这是因为空手道的方法是非常规的:您几乎编写了一个有状态的服务器。但是通过将变量保存在内存中和一些巧妙的 JSON 路径,您可以用很少的代码行来模拟 CRUD:https ://github.com/intuit/karate/tree/master/karate-netty#background

  1. 根据设计,您一次只能使用一个

  2. 鉴于上述限制,这里有一个有趣的想法:添加类似额外pathMatches('/__test/reset')场景的内容,用于清理您的状态并将Background变量设置为* def cats = []. 现在在每个功能中,只需在开始时调用特殊的“重置”URL。好消息是空手道是线程安全的。正如您所说的另一个想法是您可以维护两个或三个不同的变量并使用一些逻辑来基于标题“路由”,这同样非常容易 IMO。使用地图的地图,例如:

    • def 数据 = { 猫 1:{},猫 2:{},猫 3:{} }

你可以得到标题,例如,如果它是mode: cats1

* def mode = karate.get('requestHeaders.mode[0]')
* def cats = data[mode]
  1. 不确定这是否回答了您的问题,但如果最后一个Scenario有“空”描述,则它是“包罗万象”,理论上可以委托给另一台服务器(或模拟):https ://github.com/intuit/karate /tree/develop/karate-netty#proxy-mode

您的问题有点令人困惑,因此如果我不明白,您可能需要对其进行编辑和重新措辞。

编辑:从 1.1.0 开始应该可以使用多个模拟文件:https ://github.com/intuit/karate/issues/1566


推荐阅读