简体   繁体   English

测试 Spring 云配置服务器

[英]Testing Spring Cloud Config Server

Are there any best practices around testing Spring Cloud Config Server?有没有关于测试 Spring 云配置服务器的最佳实践?

I'm finding it difficult to get the configuration right when deploying to Kubernetes, and it takes time to fix and redeploy each time.我发现部署到 Kubernetes 时很难正确配置,而且每次修复和重新部署都需要时间。 Also there's the issue of regression failures, when changes are made.当进行更改时,还有回归失败的问题。

First of all is there any way to write a smoke test that the application context will load?首先,有没有办法编写应用程序上下文将加载的冒烟测试? Similar to this:与此类似:

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

    @Test
    void contextLoads() {
    }

}

But rather than loading a test application.yml file, loading the config from the Spring Cloud Config Server, and testing different profiles?但不是加载测试 application.yml 文件,而是从 Spring 云配置服务器加载配置,然后测试不同的配置文件? eg.例如。 development staging, production, etc.开发阶段、生产等

Thanks to Spencer for the sample code!感谢 Spencer 提供的示例代码!

Adjusting for JUnit5, I had to write a custom extension to start the config server before the application context started up (@BeforeAll didn't seem to work).针对 JUnit5 进行调整,我必须编写一个自定义扩展来在应用程序上下文启动之前启动配置服务器(@BeforeAll 似乎不起作用)。 I ended up with the following code:我最终得到以下代码:

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
        }

    }

}

Note: this assumes you don't set default values for properties.注意:这假设您没有为属性设置默认值。 Alternatively you could assert the values of properties, similar to Spencer's sample code.或者,您可以断言属性的值,类似于 Spencer 的示例代码。

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

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