【问题标题】:Testing Spring Cloud Config Server测试 Spring Cloud 配置服务器
【发布时间】:2021-03-21 09:56:18
【问题描述】:

有没有关于测试 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-boot spring-cloud


【解决方案1】:

感谢 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 的示例代码。

【讨论】:

    猜你喜欢
    • 2017-09-07
    • 2017-07-25
    • 2023-03-24
    • 1970-01-01
    • 2018-08-24
    • 2016-09-12
    • 2020-09-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多