java - 具有代码覆盖率的 REST API 集成测试

标签 java rest integration-testing code-coverage

我们构建了一个暴露大量业务服务的 REST API - 业务服务可以调用其他平台/实用程序服务来执行数据库读写、执行服务授权等。

我们已将这些服务部署为 Tomcat 中的 WAR 文件。

我们想使用集成测试套件来测试整个设置,我们也希望将其视为回归测试套件。

对此执行集成测试的好方法是什么以及可以加速套件开发的任何工具?以下是我们认为需要解决的一些要求:

  1. 能够定义运用业务场景的集成测试用例。
  2. 在运行套件之前使用测试数据设置数据库。
  3. 调用在远程服务器 (Tomcat) 上运行的 REST API
  4. 验证数据库后测试执行以验证预期输出
  5. 拥有 REST API 的代码覆盖率报告,以便我们知道我们应该对套件所涵盖的场景有多大信心。

最佳答案

在我的工作中,我们最近整理了几个测试套件来测试我们构建的一些 RESTful API。与您的服务一样,我们的服务可以调用它们所依赖的其他 RESTful API。我们将它分成两个套房。


  • 套件 1 - 单独测试每项服务
    • 使用 restito 模拟 API 依赖的任何对等服务.其他替代方案包括 rest-driver , wiremock , pre-cannedbetamax .
    • 测试、我们正在测试的服务和模拟都在单个 JVM 中运行
    • 启动我们正在 Jetty 中测试的服务

我肯定会推荐这样做。它对我们来说非常有效。主要优点是:

  • Peer 服务是模拟的,因此您无需执行任何复杂的数据设置。在每次测试之前,您只需使用 restito 来定义您希望对等服务的行为方式,就像您在 Mockito 的单元测试中使用类一样。
  • 该套件速度超快,因为模拟服务提供预先封装的内存响应。因此,我们可以获得良好的覆盖范围,而无需花费很长时间来运行套件。
  • 该套件可靠且可重复,因为它隔离在自己的 JVM 中,因此无需担心其他套件/人员在套件运行的同时破坏共享环境并导致测试失败。

  • 套件 2 - 完整的端到端
    • 套件在跨多台机器部署的完整环境中运行
    • 环境中Tomcat上部署的API
    • 对等服务是真正“实时”的完整部署

此套件要求我们在对等服务中进行数据设置,这意味着编写测试通常需要更多时间。我们尽可能使用 REST 客户端在对等服务中进行数据设置。

这个套件中的测试通常需要更长的时间来编写,所以我们将大部分覆盖范围放在套件 1 中。话虽如此,这个套件仍然有明显的值(value),因为我们在套件 1 中的模拟可能表现得不像真正的服务.


关于您的观点,这是我们的工作:

  • 能够定义运行业务场景的集成测试用例。
    • 我们使用 cucumber-jvm为上述两个套件定义业务场景。这些场景是业务用户可以理解并驱动测试的英文纯文本文件。
  • 在运行套件之前使用测试数据设置数据库。
    • 我们不会为我们的集成套件执行此操作,但过去我使用过 unitils使用 dbunit 进行单元测试,效果很好。
  • 调用在远程服务器 (Tomcat) 上运行的 REST API
    • 我们使用 rest-assured ,这是一个非常棒的 HTTP 客户端,专门用于测试 REST API。
  • 验证数据库后测试执行以验证预期输出
    • 我不能在这里提供任何建议,因为我们不使用任何库来帮助简化此操作,我们只是手动完成。如果你发现了什么,请告诉我。
  • 拥有 REST API 的代码覆盖率报告,以便我们知道我们应该对套件所涵盖的场景有多大信心。
    • 我们不测量集成测试的代码覆盖率,仅测量单元测试的代码覆盖率,因此我无法在此提供任何建议。

请密切关注我们的 techblog因为将来可能会有更多详细信息。

关于java - 具有代码覆盖率的 REST API 集成测试,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17433046/

相关文章:

java - Spring Boot 集成测试响应空体 - MockMvc

java - 如何反向迭代此 map

java - 使用 Sockjs 和 Stompjs 的 Spring MVC 和 Websocket 异常

javascript - 解析 .then 方法和链接 |语法让我困惑

http - URL 矩阵参数与查询参数

maven - 运行 selenium maven 插件时 firefox 配置文件为 "parent.lock"

java - DbUnit:增量 id 生成问题

java - 列出 Red5 可用的流

c# - 没有参数的 WebGet 或 UriTemplate 失败

linux - 使用熔岩运行测试用例