spring-boot - 测试 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 加载配置,然后测试不同的配置文件?例如。开发阶段、生产等
解决方案
感谢 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 的示例代码。
推荐阅读
- mysql - 我想在mysql中拆分结果你能帮我吗?
- python - 将 N 人分成 2 人一组
- typescript - 如何在打字稿中键入具有动态字段名称的树
- c++ - 从给定的向量中找到所有 4 个集合,使得它们的总和等于目标,并且不应该有任何重复的集合。(leetcode)(O(n ^ 3))
- sql - 如何为具有多个评分标准的评分系统正确设计数据库
- svg - SVG 内联编辑适用于 Chrome 而不是 FF?
- android - 关于数据绑定、实时数据和可绘制的问题
- r - 我们应该如何选择磁盘框架中的块大小?
- r - 在 Sagemaker 超时时运行 R
- python - 加快音频特征的查询(Spotify Web API)