繁体   English   中英

测试 Spring 云配置服务器

[英]Testing Spring Cloud Config Server

有没有关于测试 Spring 云配置服务器的最佳实践?

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

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

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

    @Test
    void contextLoads() {
    }

}

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM