【问题标题】:API Testing containerized microservices with Karate使用空手道 API 测试容器化微服务
【发布时间】:2020-12-07 21:25:18
【问题描述】:

我正在尝试利用空手道 (https://github.com/intuit/karate) 作为测试容器化、基于云的微服务的整体测试策略中的关键组件。假设被测微服务和空手道都有自己的容器,流程如下:

  1. 获取每个容器以进行本地部署
  2. 在空手道容器中构建(通过 gradle)组件(假设我们的 mock 需要 Java 类)
  3. 部署(通过 gradle)模拟并让它们在独立模式下运行
  4. 将有关 mock 的信息注入到微服务的 YAML 中
  5. 在本地构建和部署微服务
  6. 通过 CLI 运行空手道测试(传递有关模拟和/或环境的信息)

我的第一个问题是这是一个好主意(TM) 还是坏主意(TM)。从表面上看,这似乎既合理又可以实现,但我想知道我是否正在尝试以一种从未打算使用的方式使用空手道。我玩弄了将所有空手道内容(包括模拟服务器)保留在测试本身中的想法,但是步骤#3-5 必须将模拟信息注入微服务,然后运行命令来构建和部署微服务都在测试套件中,在我看来这是一个 Bad Idea(TM)。最好将其作为 Jenkins 工作中管道的一部分来执行,对吗?

我的第二个问题是如何最好地导出模拟、文件和 Java 依赖项以供外部使用(以支持步骤编号 2-3),例如这里是文件结构:

.
+-- build.gradle
+-- src
|   +-- main
|       +-- java
|           +-- JWTSigner
|           +-- PEMHelper
|       +-- resources
|           +-- private-key.pem
|           +-- public-key.pem
+-- test
|   +-- main
|       +-- java
|           +-- api
|               +-- cats
|                   +-- cats.feature
|               +-- dogs
|                   +-- dogs.feature
|               +-- AllTestsRunner.java
|           +-- mocks
|               +-- mock-auth.feature
|           +-- templates
|               +-- public-key.json
|       +-- resources
|           +-- lolcats.pdf
|           +-- loldawg.jpg

所以在这里,mock-auth.feature 需要 src/mainsrc/test/templates 中的内容。我已经能够玩 gradle 任务并将所需的东西复制到具有独立空手道 JAR 的主目录的子目录中,以便可以启动模拟,但我想知道是否有更好的方法......

感谢任何反馈,但如果是否定的,请建议我尝试的替代方法。谢谢。

【问题讨论】:

    标签: mocking karate web-api-testing


    【解决方案1】:

    第二个问题的答案在这里:https://stackoverflow.com/a/58339662/143475

    在我看来,没有 Right Way™ 可以编排您的模拟和被测应用程序。您提出的方法可行,我要做的是使用 Docker 中的 --network 选项,例如如果网络被称为 mocks 并且您必须决定并可能公开一个端口号,例如8080,你将第二个容器中的 URL-s 设置为http://mocks:8080

    您可以从空手道的分布式测试指南的此页面获得一些想法:https://github.com/intuit/karate/wiki/Distributed-Testing

    请注意,空手道模拟被设计为只需要一个 JRE 和“fatjar”。这可以简化事情,例如您甚至可能不需要“Dockerize”东西,只需在PATH 上添加java 并指向您的*.feature 文件即可。即使你使用 Java 代码,你也可以add those to the CLASSPATH 或者你可以使用maven-shade 自己构建一个“fatjar”。

    正如您所说,移动部件最少的选项可能是让模拟在同一个 Java 项目中站立。优点是:

    1. 您可以动态选择一个端口并将其传递给主应用配置
    2. 启动、停止和协调 2 个进程更容易(Java 代码)
    3. CLASSPATH 会自动处理
    4. 如果您有雄心并在未来尝试代码覆盖,会更容易

    延伸阅读:https://stackoverflow.com/a/61414022/143475

    【讨论】:

    • 我不明白为什么有人说“你可能不需要 dockerize 东西”.. 主要原因是你不需要安装 docker 以外的任何东西,而且它很简单将这些工具集成到 CI/CD 中。
    • @SachinGiri 因为唯一的先决条件是 JRE(Java 运行时环境),在许多情况下(例如 AWS)是预先安装的,并且可以说比 Docker 或大多数 CI 更容易安装/CD 环境。如果你不明白也没关系,其他人可能:) - 另见“jbang”github.com/intuit/karate#jbang
    猜你喜欢
    • 1970-01-01
    • 2017-11-08
    • 1970-01-01
    • 1970-01-01
    • 2023-03-15
    • 2018-07-28
    • 2017-10-04
    • 2019-08-25
    • 1970-01-01
    相关资源
    最近更新 更多