【问题标题】:In Karate API mocking not working as expected for me在空手道 API 模拟中,我没有按预期工作
【发布时间】:2021-03-30 21:17:31
【问题描述】:

我正在探索用于集成测试的 Karate API double(模拟)。对于以下场景,我没有得到预期的模拟响应。我们将不胜感激。

我的设置: 1. 空手道模拟服务器在端口 8001 上使用 pathMatches 规则:http://localhost:8001(工作,针对“/cat”和一些测试调用进行验证) 2. 我自己的应用程序是从端口 8080 上的 docker 启动的。从 Docker 也暴露了 8001 端口。

模拟案例: 1. 我的 应用程序REST调用暴露给所有用户http://localhost:8080/service/v1/findUser。这个暴露的 API,底层 调用其他 REST 调用 http://dev-STG/userservice/v1/findUser,它实际上给出了 JSON 响应。因此,我想模拟底层 API 调用并相应地验证我的 API 行为。

尝试的步骤: 1. 现在,在我的应用程序配置中,将实际底层 API 调用替换为空手道模拟服务器 (http://localhost:8001/userservice/v1/findUser)。然后确实构建了我的应用程序 docker。

  1. 在空手道中,我定义了测试,例如“testIntgrtn.feature”,它调用我的应用程序 APIhttp://localhost:8080/service/v1/findUser”和空手道模拟服务器并使用路径匹配“/userservice/v1/findUser”进行设置。
  2. 在执行“testIntgrtn.feature”后,空手道不模拟底层调用 (http://localhost:8001/userservice/v1/findUser)。
  3. 现在,在“testIntgrtn.feature”文件中,我将我的应用程序 URL 更改为底层 REST URL,即 (http://localhost:8001/userservice/v1/findUser),然后模拟将像魅力一样工作。

    我不明白为什么底层 API 调用没有在这里被嘲笑?我在这里错过了什么吗? 此外,在空手道中,我们可以监控所有 REST 调用(如 cypress 模拟)。

感谢这个精彩的框架。这对于编写自动化案例很直观。

【问题讨论】:

    标签: testing karate


    【解决方案1】:

    空手道不能自动拦截呼叫。

    推荐的方法是,当您启动在localhost:8080 运行的应用程序时,您更改配置,以便调用http://localhost:8001/v1/findUser 之类的东西,而不是调用http://dev-stg/userservice/v1/findUser。这是大多数团队所做的,而且很容易,因为您无论如何都应该将外部 URL-s 定义为 application.properties(或等效项)作为最佳实践。

    例如,在 Spring Boot 中覆盖应用程序属性非常容易,您可以通过命令行执行此操作:https://stackoverflow.com/a/37053004/143475

    如果需要,您可以为模拟动态配置端口。所以你的单元测试可以先启动一个mock,拿到端口,然后启动服务器。您可以在空手道文档中找到详细信息。

    综上所述,如果您能够在localhost:8080 的应用程序启动之前更改(系统)HTTP 代理,您可以在不修改配置的情况下执行此操作。 (但这很棘手,所以我推荐上面解释的方法。)所以在这种情况下,空手道实际上可以“拦截”应用程序在localhost:8080 发出的传出 HTTP 调用。

    在此处查看表格中的倒数第二行 (5a):https://github.com/intuit/karate/tree/master/karate-netty#consumer-provider-example

    【讨论】:

      猜你喜欢
      • 2018-09-11
      • 1970-01-01
      • 2019-08-08
      • 2015-06-12
      • 1970-01-01
      • 2018-04-24
      • 2021-08-18
      • 2021-07-18
      相关资源
      最近更新 更多