而不可否认的是,随着业界广泛采用云端微服务,我们在得益于处理多个可独立部署的组件的同时,需要提高微服务应用的测试级别,并按需增加测试策略的复杂性。下面,我将从使用者的角度出发,以一个Spring Cloud微服务为例,深入探究各种服务组件的相关测试。
站在用户的角度思考问题,与客户深入沟通,找到本溪网站设计与本溪网站推广的解决方案,凭借多年的经验,让设计与互联网技术结合,创造个性化、用户体验好的作品,建站类型包括:成都网站设计、成都网站建设、企业官网、英文网站、手机端网站、网站推广、空间域名、虚拟空间、企业邮箱。业务覆盖本溪地区。
我们的Spring Boot微服务示例会具有如下特征:
我们将通过Java 11、Apache Maven、Docker、以及一组协作库,“尽早地”在CI/CD管道中,进行单独的服务测试,而无需实际部署或占用其他服务、数据库、甚至是完整的测试环境资源。同时,您可以通过链接--https://github.com/kmandalas/spring-cloud-component-tests,在GitHub上获取该示例的所有代码。
该示例中的“订单跟踪”微服务是由一个Spring Controller、Service和Repository所组成。它公开了两个端点:
OrderControllerTest.java类将针对API提供的多种方法,来封装组件测试。例如,我们可以选用包括:Maven插件、JUnit功能、Spring Boot测试切片和分类单元测试、集成测试、组件测试、合同测试等方法。当然,并非所有的测试类别都需要在CI/CD管道中被执行(或重新执行)。鉴于该示例过于简单,我强烈建议您实施适当的分类。
在/src/test/resources/application.yml中,我们针对属性的测试配置如下:
YAML
server:
port: 0
spring:
application:
name: order-service-test
cloud:
service-registry:
auto-registration:
enabled: false
loadbalancer:
ribbon:
enabled: false
config:
enabled: false
jpa:
show-sql: true
eureka:
client:
enabled: false
service-url:
registerWithEureka: false
okta:
oauth2:
issuer: https://kmandalas/oauth2/default
location-service:
url: http://localhost:9999/v1/track/
在上述代码段所示中,我们禁用spring.cloud.config、eureka.client和spring.cloud.service-registry.auto-registration的原因在于,方便孤立地测试微服务。因此,既不会有Spring Cloud Config服务器在启动时,为OrderService的配置属性提供服务;也不会有Eureka服务器提供注册,并能够使用它来按需调用FulfillmentService的动态服务发现。
当出于测试目的而必须与数据库(关系型或NoSQL)集成时,我们通常有如下三种选择:
不同的选项所涉及到的测试资源,将会不尽相同。
可见,我们实际上只需要OrderControllerTest类上的@Testcontainers注释,以及如下的静态声明:
Java
@Container
static PostgreSQLContainer database = new PostgreSQLContainer("postgres:12")
.withDatabaseName("tutorial")
.withUsername("kmandalas")
.withPassword("dzone2022");
@DynamicPropertySource
static void setDatasourceProperties(DynamicPropertyRegistry propertyRegistry) {
propertyRegistry.add("spring.datasource.url", database::getJdbcUrl);
propertyRegistry.add("spring.datasource.password", database::getPassword);
propertyRegistry.add("spring.datasource.username", database::getUsername);
}
我们将使用Spring Cloud OpenFeign来调用FulfillmentService,它是另一个“内部”的Spring Cloud微服务,可以被注册到Eureka上。在正常执行的情况下,后台的feign客户端能够通过名称定位目标服务实例,实现客户端的负载均衡(如果发现了多个实例的话)。
在我们的测试中,在没有Eureka(或者是Consul等其他发现机制)的情况下,我们需要通过如下两个方面,尽可能真实地模拟此类集成:
当然,您也可以使用Hoverfly作为嵌入式模拟服务器。在本示例里,我们通过如下依赖项设置,来引入WireMock:
XML
org.springframework.cloud
spring-cloud-starter-contract-stub-runner
test
通过spring-cloud-starter-contract-stub-runner,WireMock在Spring Boot应用测试套件中的引导被简化了许多,同时这对于契约测试(contract tests)也是非常实用的。请通过查看Spring Cloud Contract WireMock的链接--https://docs.spring.io/spring-cloud-contract/docs/current/reference/html/project-features.html#features-wiremock,了解更多相关信息。
有了上面的基础,我们只需要使用@AutoConfigureWireMock去注释测试类,并在测试资源目录下的JSON文件中定义各种WireMock映射即可。
在集成的过程中,为了能够调用某些外部的(第三方)服务,我们仍然需要依赖有效的WireMock映射(毕竟能够提供的响应多多益善),以便在application.yml中定义测试URL资源。下面是一个简单的示例:
YAML
location-service:
url: http://localhost:9999/v1/track/
我们在外部服务的URL端点路径处,提供了WireMock嵌入式服务器运行的主机和端口。端口号虽然不必经过硬编码,但是可以被定义为动态的,以便在CI/CD管道中并行运行多个组件测试,且不会发生端口冲突。
值得一提的是,WireMock不仅可以用于模拟来自RESTful服务的各种JSON响应,还可以模拟基于SOAP的Web服务的响应。
正如前文提到的,Spring Cloud微服务基础设施通常能够合并出一个诸如Spring Cloud Gateway的API网关。据此,我们可以使用OAuth 2.0、JavaScript对象签名和加密(Object Signing and Encryption,JOSE)、以及JSON Web令牌标准的令牌中继模式,来处理用户的身份识别,授权应用程序查看他们的个人资料,以及访问网关后面的安全资源。通常,此类安全设置会由如下组件构成:
针对本测试示例,我们在单独测试Spring Boot微服务时,会采用Spring Security的SecurityMockMvcRequestPostProcessors。它将使我们能够在MockMvc调用期间,传递有效的JWT,定义权限(即用户角色),并在启用安全性的情况下,测试组件的行为。例如:
Java
mockMvc.perform(get("/api/orders/11212/status").with(jwt())).andExpect(status().isOk())
和
mockMvc.perform(get("/api/orders/").with(jwt().authorities(new
SimpleGrantedAuthority("backoffice"))))
.andExpect(status().isOk());
如今,对于成功的产品交付而言,开发人员是否能够在CI/CD管道中,以自动化的方式执行各类测试是至关重要的。希望上述讨论的有关Spring Cloud微服务组件测试的相关指南和注意事项,能够给您的实际项目交付提供帮助。
陈峻 (Julian Chen),社区编辑,具有十多年的IT项目实施经验,善于对内外部资源与风险实施管控,专注传播网络与信息安全知识与经验;持续以博文、专题和译文等形式,分享前沿技术与新知;经常以线上、线下等方式,开展信息安全类培训与授课。
原文标题:Component Tests for Spring Cloud Microservices,作者:Kyriakos Mandalas和Dimitris Stavroulakis
当前文章:详解Spring云端微服务的组件测试
URL分享:http://www.shufengxianlan.com/qtweb/news39/498089.html
网站建设、网络推广公司-创新互联,是专注品牌与效果的网站制作,网络营销seo公司;服务项目有等
声明:本网站发布的内容(图片、视频和文字)以用户投稿、用户转载内容为主,如果涉及侵权请尽快告知,我们将会在第一时间删除。文章观点不代表本网站立场,如需处理请联系客服。电话:028-86922220;邮箱:631063699@qq.com。内容未经允许不得转载,或转载时需注明来源: 创新互联