前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >微服务的集成测试 | 微服务系列第八篇

微服务的集成测试 | 微服务系列第八篇

作者头像
魏新宇
发布2018-09-30 11:43:21
2.8K0
发布2018-09-30 11:43:21
举报

文章导读

  • 本文仅代表作者的个人观点;
  • 本文的内容仅限于技术探讨,不能作为指导生产环境的素材;
  • 本文素材是红帽公司产品技术和手册;
  • 本文分为系列文章,将会有多篇,初步预计将会有26篇。

一、比较单元测试和集成测试

在敏捷开发过程中,添加到现有微服务的任何更改或新功能都可能会破坏应用程序功能。 开发人员使用测试框架(如JUnit和TestNG)来创建单元测试,以验证小型自包含代码的功能。

但是,当应用程序(如数据库或外部服务)访问外部系统时,创建单元测试是不够的。 为了测试多个系统之间的通信,开发人员创建了集成测试,以便整个系统运行。

为了减轻开发测试的代码量,使用测试框架扩展来模拟测试中的系统。 Arquillian是一个测试框架扩展,允许在测试期间执行微服务的底层应用程序服务器基础结构,例如Wildfly Swarm。 这提供了运行集成测试所需的资源,无需复杂的测试编码。

二、使用Arquillian实现集成测试

构建集成测试的第一步是使用@RunWith批注对测试类进行批注,并将Arquillian.class类作为测试运行器参数传递。此批注指定测试应作为Arquillian集成测试运行。

要在Wildfly Swarm上运行Arquillian测试,Arquillian要求生成应用程序包,通常是Web应用程序资源(WAR)文件,该文件将部署在Wildfly Swarm容器中。使用Shrinkwrap库来构建此可部署的WAR文件。 Shrinkwrap提供了一个API,允许在启动测试容器之前创建可部署包作为集成测试的一部分。

要使用Shrinkwrap,必须使用@Deployment批注标记测试类中的静态方法,并返回WebArchive类的实例。此注释告诉Arquillian在启动Wildfly Swarm容器之前使用此方法在测试执行期间构建WAR。如果项目使用Maven来管理其依赖项,那么这个带注释的方法必须使用Maven.resolver静态方法来读取项目的pom.xml文件,并发现应用程序运行所需的所有外部JAR依赖项。使用importDependencies方法从Maven存储库下载项目使用的任何外部JAR文件的列表。

解析依赖关系后,使用ShrinkWrap.create静态方法捆绑项目中的所有依赖项,类和配置,以生成符合Java的文件(WebArchive.class)。要实现此目的,请使用addPackages方法将项目中运行测试所需的包和类添加到WAR文件中。然后,要激活CDI,请使用addAsWebInfResource方法将空beans.xml文件添加到Web存档。接下来,使用addAsLibraries方法将从Maven下载的依赖项列表包含在最终文件中。

最后,要触发WildFly Swarm,请通过在使用@CreateSwarm注释标记的静态方法中设置端口号等参数来配置测试服务器。此方法必须返回具有必要参数集的Swarm对象。

在某些测试方法中,可能需要运行时环境信息,例如可以访问REST API的URL。为了解决这个问题,Arquillian提供@ArquillianResource注释来注入运行时信息并在测试方法中使用它。

以下示例是使用Arquillian和Shrinkwrap编写的完整集成测试类。这会在正在运行的WildFly Swarm容器中运行测试:

1 通过使用来自JUnit的@RunWith注释从Arquillian启用扩展来自定义测试用例的执行。

2 从运行时环境中注入信息,例如REST API的URL。

3 使用@Deployment注释负责捆绑应用程序的方法。

4 获取当前项目的所有API依赖项。

五 创建Web归档(WAR)文件。

6 包括项目中的所有类和包。

7 添加空beans.xml文件以触发CDI扩展。

8 从项目中添加API依赖项。

9 创建测试所需的Swarm配置。

以下arquillian.xml文件提供了一些额外的配置,例如端口和主机名,必须从测试源代码外部化:

1 标识用于测试应用程序的容器。

2 在WildFly中配置用于管理目的的端口。

将arquillian.xml文件存储在项目的src / test / resources目录中。

最后,要运行测试,Maven使用的pom.xml文件必须声明Arquillian和Shrinkwrap使用的依赖项。

1 使用Arquillian中的所有依赖项导入org.wildfly.swarm:arquillian工件。

2 使用Shrinkwrap中的所有依赖项导入org.jboss.shrinkwrap.resolver:shrinkwrap-resolver-impl-maven工件。

三、比较容器内测试和客户端测试

开发人员可能需要在不同条件下执行测试:

检查测试执行的外部结果:在微服务中,开发人员可能需要检查REST API调用的输出,这只有在应用程序运行并且将API称为普通客户端时才可能。

检查容器内运行的测试执行:开发人员可能需要检查生成与预期不同的输出的代码执行结果。

在这两种情况下,微服务必须运行,但后者在将结果转换为人类可读输出之前评估结果。

Arquillian支持这两种方案,但默认情况下它会执行容器内测试。要运行客户端测试,开发人员必须使用@RunAsClient注释。要运行客户端测试,请使用Resteasy和Rest Assured库。

在以下源代码中,测试方法使用@RunAsClient进行批注,并使用Resteasy客户端API来调用REST API。

代码语言:javascript
复制
@ArquillianResource
private URL url;

@Test
@RunAsClient
public void testGet() {
  Client client = ClientBuilder.newBuilder()
          .build()
          .target(this.url.toExternalForm() + endpoint)
          .request(MediaType.APPLICATION_JSON_TYPE)
          .get();
...
}

或者,要运行容器内测试,必须使用@ javax.inject.Inject批注注入测试对象。 测试方法不能具有@RunAsClient注释。

代码语言:javascript
复制
@ArquillianResource
private URL url;

@Inject
private ShoppingCartService service;

@Test
public void testCart() {
  ShoppingCart cart = service.checkOut();
...
}

四、实验展现

首先通过JBDS导入一个已经存在的maven项目:

在JBoss Developer Studio中,通过展开JBoss Developer Studio左窗格中Project Explorer选项卡中的hola项打开HolaResourceFallBackIntegrationTest测试用例,然后单击hola→Java Resources→src / test / java→com.redhat.training.msa。

hola.rest中: 双击HolaResourceFallBackIntegrationTest.java文件。

源代码主要由提供方向的注释组成。 testFallback测试方法必须检查REST端点/ api / hola是否返回Hola de localhost消息。

右键单击HolaResourceFallBackIntegrationTest测试用例,然后在JBoss Developer Studio中选择Run As→JUnit Test。 JUnit选项卡显示测试用例执行的输出,并显示一个Failure Trace面板,其中显示testFallback方法具有AssertionError。 这是预期的,因为调用了fail static方法。

五、在测试用例中启用Arquillian

将测试用例的JUnit测试运行器设置为Arquillian。 在类声明之前添加@RunWith注释。 使用Arquillian.class作为注释参数,如下所示:

实现捆绑UberJar包的deploy方法。

添加@Deployment方法级注释。

为了简化开发,com.redhat.training.msa.hola.rest.ArquillianTestUtils帮助器类提供了deploy方法,该方法捆绑了Arquillian测试用例所需的所有依赖项。

但是,要运行实验,应将microprofile-config.properties文件添加到UberJar中的META-INF目录中。 使用addAsManifestResource方法将此文件包含到存档中。

deploy方法必须具有以下代码:

实现配置WildFly Swarm运行时的方法。

添加@CreateSwarm方法级注释。

为了简化开发,com.redhat.training.msa.hola.rest.ArquillianTestUtils帮助器类提供了newContainer方法,该方法配置WildFly Swarm所需的所有常用参数,例如端口号和环境变量。

将以下代码添加到createSwarm方法:

重新运行JUnit测试用例。

右键单击HolaResourceFallBackIntegrationTest测试用例,然后在JBoss Developer Studio中选择Run As→JUnit Test。 JUnit选项卡显示测试用例执行的输出,并显示一个Failure Trace面板,其中显示testFallback方法具有AssertionError异常。

与之前的执行不同,此测试运行时间比前一次更长。 启动需要更长时间,因为WildFly Swarm已初始化并加载集成测试使用的所有分数。

testFallback方法必须调用/ api / hola REST端点。 要调用它,请在测试方法中使用JAX-RS客户端API。 该方法必须使用ClientBuilder类调用REST端点。

使用ClientBuilder类需要REST端点URL。 要在测试执行期间获取Arquillian提供的值,请向测试用例声明url属性并使用@ArquillianResource对其进行注释。

要调用REST端点,请使用ClientBuilder类构建Client实例,如下所示:

要标识REST端点,请从客户端变量调用目标方法。 使用先前注入的url属性获取REST端点。

使用HTTP GET方法调用REST端点。

要评估测试的输出,请使用assertEquals方法。

重新运行JUnit测试用例。

右键单击HolaResourceFallBackIntegrationTest测试用例,然后在JBoss Developer Studio中选择Run As→JUnit Test。 JUnit选项卡显示测试用例执行的输出。 这次,整个测试通过,并在测试执行后显示绿色条。

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2018-08-22,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 大魏分享 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
容器服务
腾讯云容器服务(Tencent Kubernetes Engine, TKE)基于原生 kubernetes 提供以容器为核心的、高度可扩展的高性能容器管理服务,覆盖 Serverless、边缘计算、分布式云等多种业务部署场景,业内首创单个集群兼容多种计算节点的容器资源管理模式。同时产品作为云原生 Finops 领先布道者,主导开源项目Crane,全面助力客户实现资源优化、成本控制。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档