REST API 与代码覆盖率的集成测试
Posted
技术标签:
【中文标题】REST API 与代码覆盖率的集成测试【英文标题】:Integration Test of REST APIs with Code Coverage 【发布时间】:2013-07-02 18:23:48 【问题描述】:我们已经构建了一个 REST API,它公开了一堆业务服务 - 一个业务服务可以调用其他平台/实用程序服务来执行数据库读取和写入,执行服务授权等。
我们已将这些服务部署为 Tomcat 中的 WAR 文件。
我们想使用集成测试套件来测试整个设置,我们也想将其视为回归测试套件。
在此以及任何可以加快套件开发的工具上执行集成测试的好方法是什么?以下是我们认为需要解决的几个要求:
-
能够定义执行业务场景的集成测试用例。
在运行套件之前使用测试数据设置数据库。
调用在远程服务器 (Tomcat) 上运行的 REST API
验证数据库后测试执行以验证预期输出
拥有 REST API 的代码覆盖率报告,以便我们知道我们应该对套件所涵盖的场景有多大信心。
【问题讨论】:
【参考方案1】:在我的工作中,我们最近整合了几个测试套件来测试我们构建的一些 RESTful API。与您的服务一样,我们的服务可以调用它们所依赖的其他 RESTful API。我们把它分成两套。
套件 1 - 单独测试每个服务 使用restito 模拟API 依赖的任何对等服务。其他替代方案包括rest-driver、wiremock、pre-canned 和 betamax。 测试、我们正在测试的服务和模拟都在单个 JVM 中运行 启动我们在 Jetty 中测试的服务
我绝对会推荐这样做。它对我们来说非常有效。主要优点是:
对等服务是模拟的,因此您无需执行任何复杂的数据设置。在每次测试之前,您只需使用 restito 来定义您希望对等服务的行为方式,就像您在使用 Mockito 的单元测试中使用类一样。 该套件速度非常快,因为模拟服务提供预先存储的内存响应。因此,我们可以在套件运行时间不长的情况下获得良好的覆盖率。 该套件可靠且可重复,因为它隔离在自己的 JVM 中,因此无需担心其他套件/人员在套件运行的同时在共享环境中捣乱并导致测试失败。套件 2 - 完整的端到端 套件针对部署在多台机器上的完整环境运行 API 部署在环境中的 Tomcat 上 对等服务是真正的“实时”完整部署
这个套件要求我们在对等服务中进行数据设置,这意味着测试通常需要更多时间来编写。我们尽可能使用 REST 客户端在对等服务中进行数据设置。
此套件中的测试通常需要更长的时间来编写,因此我们将大部分内容放在套件 1 中。话虽如此,该套件仍然具有明显的价值,因为我们在套件 1 中的模拟可能与实际服务不太一样.
关于您的观点,我们是这样做的:
能够定义执行业务场景的集成测试用例。 我们使用cucumber-jvm 来定义上述两个套件的业务场景。这些场景是业务用户可以理解并推动测试的英文纯文本文件。 在运行套件之前使用测试数据设置数据库。 我们不会为我们的集成套件执行此操作,但过去我曾使用unitils 和 dbunit 进行单元测试,并且效果很好。 调用在远程服务器 (Tomcat) 上运行的 REST API 我们使用rest-assured,这是一个非常棒的 HTTP 客户端,专门用于测试 REST API。 验证数据库后测试执行以验证预期输出 我无法在此提供任何建议,因为我们不使用任何库来帮助简化此操作,我们只是手动完成。如果您有任何发现,请告诉我。 拥有 REST API 的代码覆盖率报告,以便我们知道我们应该对套件所涵盖的场景有多大信心。 我们不衡量集成测试的代码覆盖率,只衡量我们的单元测试,所以我不能在这里提供任何建议。请密切关注我们的techblog,因为将来可能会有更多关于他们的详细信息。
【讨论】:
【参考方案2】:您还可以查看名为 Arquillian 的工具,起初设置有点困难,但提供了完整的集成测试运行时(即启动自己的容器实例并与测试一起部署您的应用程序)和提供解决您的问题的扩展(调用 REST 端点、提供数据库、在测试后比较结果)。
Jacoco 扩展生成覆盖率报告,然后可以通过 Sonar 工具显示。
我已经将它用于一个相对较小的 JEE6 项目,一旦我成功设置它,我对它的工作方式感到非常满意。
【讨论】:
+1 看起来非常适合端到端测试。他们似乎反对嘲笑 REST API,这是一种耻辱。如果他们支持测试完整的环境和模拟 API,那就太好了。 好吧,这实际上取决于您在测试部署中投入的内容(部署是作为 Arquillian 测试套件的一部分创建的)——如果您更喜欢在开发周期的某些点模拟您的 API ,你所要做的就是打包模拟而不是你的应用程序的实时实现。以上是关于REST API 与代码覆盖率的集成测试的主要内容,如果未能解决你的问题,请参考以下文章
如何在 Wildfly 服务器上运行的测试中获得 sonarqube 代码覆盖率