15

我们已经构建了一个 REST API,它公开了一堆业务服务——一个业务服务可以调用其他平台/实用程序服务来执行数据库读取和写入,执行服务授权等。

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

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

什么是对这个和任何可以加速套件开发的工具进行集成测试的好方法?以下是我们认为需要解决的几个要求:

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

2 回答 2

30

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


  • 套件 1 - 单独测试每个服务

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

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

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

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

该套件中的测试通常需要更长的时间来编写,因此我们将大部分覆盖范围放在套件 1 中。话虽如此,该套件仍然具有明显的价值,因为套件 1 中的模拟可能与真实服务的行为不太一样。


关于您的观点,这是我们所做的:

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

请密切关注我们的技术博客,因为将来可能会有更多详细信息。

于 2013-07-02T21:49:15.147 回答
3

您还可以查看名为Arquillian的工具,一开始设置起来有点困难,但它提供了完整的集成测试运行时(即启动自己的容器实例并与测试一起部署您的应用程序)并提供扩展来解决您的问题问题(调用 REST 端点、提供数据库、比较测试后的结果)。

Jacoco 扩展生成覆盖率报告,然后可以通过 Sonar 工具显示。

我已经将它用于一个相对较小规模的 JEE6 项目,并且一旦我设法设置它,我对它的工作方式非常满意。

于 2013-07-05T11:14:46.760 回答