首页 > 解决方案 > 测试 Spring Cloud 配置服务器

问题描述

有没有关于测试 Spring Cloud Config Server 的最佳实践?

我发现在部署到 Kubernetes 时很难正确配置,而且每次都需要时间来修复和重新部署。当进行更改时,还有回归失败的问题。

首先,有没有办法编写应用程序上下文将加载的冒烟测试?与此类似:

@SpringBootTest
@TestPropertySource(properties = { "spring.config.location=classpath:application.yml" })
@Tag("Smoke")
public class TellusIngestionApplicationTests {

    @Test
    void contextLoads() {
    }

}

但不是加载测试 application.yml 文件,从 Spring Cloud Config Server 加载配置,然后测试不同的配置文件?例如。开发阶段、生产等

标签: spring-bootspring-cloud

解决方案


感谢 Spencer 提供的示例代码!

针对 JUnit5 进行调整,我必须编写一个自定义扩展来在应用程序上下文启动之前启动配置服务器(@BeforeAll 似乎不起作用)。我最终得到以下代码:

import com.example.configserver.ConfigServerApplication;
import org.junit.jupiter.api.Nested;
import org.junit.jupiter.api.Tag;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.extension.AfterAllCallback;
import org.junit.jupiter.api.extension.BeforeAllCallback;
import org.junit.jupiter.api.extension.ExtendWith;
import org.junit.jupiter.api.extension.ExtensionContext;
import org.springframework.boot.builder.SpringApplicationBuilder;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.context.ConfigurableApplicationContext;
import org.springframework.test.context.ActiveProfiles;

import static org.springframework.boot.test.context.SpringBootTest.WebEnvironment.RANDOM_PORT;

@ExtendWith(ClockApplicationTests.ConfigServerExtension.class)
@SpringBootTest(classes = ClockApplication.class,
        // Normally spring.cloud.config.enabled:true is the default but since we have the config server on the classpath
        // we need to set it explicitly.
        properties = {
            "spring.cloud.config.enabled:true",
            "management.security.enabled=false",
            "management.endpoints.web.exposure.include=*"
        },
        webEnvironment = RANDOM_PORT)
@Tag("Smoke")
class ClockApplicationTests {

    static class ConfigServerExtension implements BeforeAllCallback, AfterAllCallback {

        @Override
        public void beforeAll(ExtensionContext extensionContext) {
            if (server == null) {
                server = new SpringApplicationBuilder(ConfigServerApplication.class)
                        .run("--server.port=" + CONFIG_PORT,
                                "--spring.cloud.config.server.git.uri=???",
                                "--spring.cloud.config.server.git.username=???",
                                "--spring.cloud.config.server.git.password=???",
                                "--spring.cloud.config.server.git.default-label=master",
                                "--spring.cloud.config.server.git.search-paths=???");
            }
        }

        @Override
        public void afterAll(ExtensionContext extensionContext) {
            if (server != null) {
                server.close();
            }
        }
    }

    private static final int CONFIG_PORT = 8888;

    private static ConfigurableApplicationContext server;

    @Nested
    @ActiveProfiles("docker")
    @Tag("docker")
    class Docker {

        @Test
        void contextLoads() {
            // The application context will fail to load if the required properties are not found
        }

    }

    @Nested
    @ActiveProfiles("kubernetes")
    @Tag("kubernetes")
    class Kubernetes {

        @Test
        void contextLoads() {
            // The application context will fail to load if the required properties are not found
        }

    }

}

注意:这假设您没有为属性设置默认值。或者,您可以断言属性的值,类似于 Spencer 的示例代码。


推荐阅读