API 使用空手道测试容器化微服务

API Testing containerized microservices with Karate

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

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

我的第一个问题是这是好主意 (TM) 还是坏主意 (TM)。从表面上看,它似乎既合理又可以实现,但我想知道我是否正在尝试以一种从未打算使用的方式使用空手道。我考虑过将所有空手道内容(包括模拟服务器)保留在测试本身中的想法,但随后步骤 #3-5 必须将模拟信息注入微服务,然后 运行 命令获取微服务在测试套件中构建和部署,这在我看来是一个坏主意(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 将所需的内容复制到主目录的子目录中,以便可以启动模拟,但我想知道是否有更好的方法。 ..

欢迎任何反馈,但如果是否定的,请提出一个可供我尝试的替代方案。谢谢。

第二个问题的答案在这里:

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

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

请注意,空手道模拟旨在仅需要 JRE 和“fatjar”。这可以简化事情,例如您甚至可能不需要“Dockerize”东西,只需在 PATH 上设置 java 并指向您的 *.feature 文件即可。即使您使用 Java 代码,您也可以 或者您可以使用 maven-shade.

自己构建一个“fatjar”

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

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

进一步阅读: