当前位置: 首页 > 知识库问答 >
问题:

Spring Boot Cloud | Zuul Proxy |集成测试

齐弘业
2023-03-14

当使用Spring Boot构建微服务时,使用MockRestServiceServer编写广泛且可读的集成测试和模拟远程服务请求非常容易。

有没有办法使用类似的方法ZuulProxy上执行额外的集成测试?我想要实现的是能够模拟远程服务器,ZuulProxy将转发给并验证我的所有ZuulFitler都按预期运行。然而,ZuulProxy正在使用Netflix的RestClient(似乎不推荐使用?)它自然不使用restemplate,可以通过MockRestServiceServer重新配置,我目前找不到一种好方法来模拟远程服务对代理请求的响应。

我有一个微服务,负责处理API会话密钥创建,然后将采取类似于API网关的行动。通过Zuul Proxy向底层公开的服务转发,Zuul筛选器将检测会话密钥是否有效。因此,集成测试将创建一个有效的会话,然后转发到一个伪endpoint,例如“集成/测试”。

指定集成/测试是一个新的endpoint是可能的,通过设置@WebIntegrationTest上的配置属性,我可以成功地模拟正在通过RestTemboard处理的所有服务,但不能模拟Zuul转发。

实现对前向目标服务的嘲笑的最佳方式是什么?

共有2个答案

公孙巴英
2023-03-14

被接受的答案有其主旨。但在解决问题之前,我一直在努力解决一些问题。所以我想用Wiremock给出一个更完整的答案。

测试:

@ActiveProfiles("test")
@TestPropertySource(locations = "classpath:/application-test.yml")
@RunWith(SpringRunner.class)
@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT)
@AutoConfigureWireMock(port = 5001)
public class ZuulRoutesTest {

    @LocalServerPort
    private int port;

    private TestRestTemplate restTemplate = new TestRestTemplate();

    @Before
    public void before() {

        stubFor(get(urlPathEqualTo("/1/orders/")).willReturn(aResponse()
                .withHeader("Content-Type", MediaType.TEXT_HTML_VALUE)
                .withStatus(HttpStatus.OK.value())));
    }

    @Test
    public void urlOrders() {
        ResponseEntity<String> result = this.restTemplate.getForEntity("http://localhost:"+this.port +"/api/orders/", String.class);
        assertEquals(HttpStatus.OK, result.getStatusCode());

        verify(1, getRequestedFor(urlPathMatching("/1/.*")));
    }
}

以及应用测试。yml

zuul:
  prefix: /api
  routes:
    orders:
      url: http://localhost:5001/1/
    cards:
      url: http://localhost:5001/2/

这应该行得通。

但是Wiremck对我来说有一些限制。如果你有不同主机名的代理请求在不同的端口上运行,比如:

zuul:
  prefix: /api
  routes:
    orders:
      url: http://lp-order-service:5001/
    cards:
      url: http://lp-card-service:5002/

在同一端口上运行的localhost Wiremock将无法帮助您。我仍在试图找到一个类似的集成测试,在这个测试中,我可以模拟Spring中的一个Bean,并在Zuul代理发出请求调用之前读取它选择路由的内容。

胡俊美
2023-03-14

看看WireMock。我一直在用它对我的Spring Cloud Zuul项目进行集成级测试。

import static com.github.tomakehurst.wiremock.client.WireMock.*;

public class TestClass {
    @Rule
    public WireMockRule serviceA = new WireMockRule(WireMockConfiguration.options().dynamicPort());

    @Before
    public void before() {
        serviceA.stubFor(get(urlPathEqualTo("/test-path/test")).willReturn(aResponse()
            .withHeader("Content-Type", "application/json").withStatus(200).withBody("serviceA:test-path")));
    }

    @Test
    public void testRoute() {
        ResponseEntity<String> responseEntity = this.restTemplate.getForEntity("/test-path/test", String.class);
        assertThat(responseEntity.getStatusCode()).isEqualTo(HttpStatus.OK);

        serviceA.verify(1, getRequestedFor(urlPathEqualTo("/test-path/test")));
    }
}
 类似资料:
  • 主要内容:集成测试背后的原因,集成测试技术,集成测试方法,集成测试指南集成测试是单元测试后软件测试过程的第二个层次。在此测试中,软件的单元或单个组件在组中进行测试。集成测试级别的重点是在集成组件或单元之间交互时暴露缺陷。 单元测试使用模块进行测试,这些模块在集成测试中进行组合和测试。该软件使用许多软件模块开发,这些软件模块由不同的编码器或程序员编码。集成测试的目标是检查所有模块之间通信的正确性。 集成测试背后的原因 虽然软件应用程序的所有模块已经在单元测试中进行了测

  • 设计 集成测试包括 3 个模块:测试用例、测试环境以及测试引擎。 测试用例 用于定义待测试的 SQL 以及测试结果的断言数据。 每个用例定义一条 SQL,SQL 可定义多种数据库执行类型。 测试环境 用于搭建运行测试用例的数据库和 ShardingSphere-Proxy 环境。 环境又具体分为环境准备方式,数据库类型和场景。 环境准备方式分为 Native 和 Docker,未来还将增加 Emb

  • 英文原文:http://emberjs.com/guides/testing/integration/ 集成测试通常用来测试应用中得重要工作流。集成测试用来模拟用户交互和确认交互结果。 设置 为了对Ember应用进行集成测试,需要在测试框架中运行应用。首先需要将根元素(root element)设置为任意一个已知将存在的元素。如果根元素在测试运行时可见的话,这对测试驱动开发非常有用,带来的帮助非常

  • 我有一个用selenium进行单元测试和集成测试的项目。 当我用IntelliJ执行cucumber集成测试时,它工作得很好,您可以看到: 用Intellij执行cucumber集成测试 但是,当我执行mvn集成测试时,似乎没有发现任何联调: 故障保护输出 我定义了以下POM: > 文件夹结构是文件夹结构 mvn集成-测试输出https://drive . Google . com/file/d/

  • 我已经建立了一个简单的Spring集成流程,该流程由以下步骤组成: 然后定期轮询一个rest api 对有效载荷做一些处理 并将其置于Kafka主题上。 请遵守以下代码: 这非常有效,然而,我正在努力想出一些好的测试。 我应该如何模拟外部RESTAPI

  • 15. 集成测试

  • 9.3. 集成测试 然而,不用将你的应用程序部署到应用服务器上或者实际连接到企业集成系统里就可以进行一些集成测试也很重要。这将使你可以测试以下内容: Spring contexts装配是否正确 使用JDBC或者ORM工具的数据访问。这将包括诸如SQL语句或者Hibernate的XML映射文件是否正确等等。 Spring为集成测试提供了一流的支持。这种一流的支持是通过Spring发行包里 sprin