Существуют ли какие-либо рекомендации по тестированию 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 и тестировать разные профили? например. постановка разработки, производство и т. д.
Спасибо 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
}
}
}
Примечание. Это предполагает, что вы не устанавливаете значения по умолчанию для свойств. В качестве альтернативы вы можете утверждать значения свойств, как в примере кода Спенсера.
Посмотрите, что мы делаем для интеграционного теста github.com/spring-cloud/spring-cloud-config/blob/master/…