Testcontainers에 대한 Spring Cloud Azure 지원
이 문서는✅ 버전 5.19.0에 적용됩니다.
이 문서에서는 Spring Cloud Azure를 Testcontainers 통합하여 애플리케이션에 대한 효과적인 통합 테스트를 작성하는 방법을 설명합니다.
Testcontainers 데이터베이스, 메시지 브로커, 웹 브라우저 또는 Docker 컨테이너에서 실행할 수 있는 거의 모든 항목의 간단한 인스턴스를 제공하기 위한 오픈 소스 프레임워크입니다. JUnit과 통합되어 테스트를 실행하기 전에 컨테이너를 시작할 수 있는 테스트 클래스를 작성할 수 있습니다. Testcontainers는 실제 백 엔드 서비스와 통신하는 통합 테스트를 작성하는 데 특히 유용합니다.
이제 spring-cloud-azure-testcontainers
라이브러리는 다음 Azure 서비스에 대한 통합 테스트를 지원합니다.
- Azure Cosmos DB
- Azure Blob Storage
- Azure Queue Storage
서비스 연결
서비스 연결은 모든 원격 서비스에 대한 연결입니다. Spring Boot의 자동 구성은 서비스 연결의 세부 정보를 사용하고 이를 사용하여 원격 서비스에 대한 연결을 설정할 수 있습니다. 이렇게 하면 연결 세부 정보가 연결 관련 구성 속성보다 우선합니다.
Testcontainers를 사용하는 경우 테스트 클래스의 컨테이너 필드에 주석을 추가하여 컨테이너에서 실행되는 서비스에 대한 연결 세부 정보를 자동으로 만들 수 있습니다.
@ServiceConnection
주석은 spring.factories
등록된 xxxContainerConnectionDetailsFactory
클래스에서 처리됩니다. 이러한 팩터리에서는 특정 Container
서브클래스 또는 Docker 이미지 이름을 기반으로 ConnectionDetails
빈을 만듭니다.
다음 표에서는 spring-cloud-azure-testcontainers
JAR에서 지원되는 연결 세부 정보 팩터리 클래스에 대한 정보를 제공합니다.
연결 세부 정보 팩터리 클래스 | 연결 세부 정보 빈 |
---|---|
CosmosContainerConnectionDetailsFactory |
AzureCosmosConnectionDetails |
StorageBlobContainerConnectionDetailsFactory |
AzureStorageBlobConnectionDetails |
StorageQueueContainerConnectionDetailsFactory |
AzureStorageQueueConnectionDetails |
종속성 설정
다음 구성은 필요한 종속성을 설정합니다.
- Cosmos
-
Blob Storage
- Queue Storage
<dependency>
<groupId>org.testcontainers</groupId>
<artifactId>azure</artifactId>
</dependency>
<dependency>
<groupId>com.azure.spring</groupId>
<artifactId>spring-cloud-azure-testcontainers</artifactId>
</dependency>
<dependency>
<groupId>com.azure.spring</groupId>
<artifactId>spring-cloud-azure-starter-cosmos</artifactId>
</dependency>
Testcontainers 사용
다음 코드 예제에서는 Testcontainers의 기본 사용을 보여 줍니다.
- Cosmos
-
Blob Storage
- Queue Storage
@SpringBootTest
@Testcontainers
@ImportAutoConfiguration(classes = { AzureGlobalPropertiesAutoConfiguration.class, AzureCosmosAutoConfiguration.class})
public class CosmosTestcontainersTest {
@TempDir
private static File tempFolder;
@Autowired
private CosmosClient client;
@Container
@ServiceConnection
static CosmosDBEmulatorContainer cosmos = new CosmosDBEmulatorContainer(
DockerImageName.parse("mcr.microsoft.com/cosmosdb/linux/azure-cosmos-emulator:latest"));
@BeforeAll
static void setup() {
cosmos.start();
Path keyStoreFile = new File(tempFolder, "azure-cosmos-emulator.keystore").toPath();
KeyStore keyStore = cosmos.buildNewKeyStore();
try {
keyStore.store(Files.newOutputStream(keyStoreFile.toFile().toPath()), cosmos.getEmulatorKey().toCharArray());
} catch (Exception e) {
throw new RuntimeException(e);
}
System.setProperty("javax.net.ssl.trustStore", keyStoreFile.toString());
System.setProperty("javax.net.ssl.trustStorePassword", cosmos.getEmulatorKey());
System.setProperty("javax.net.ssl.trustStoreType", "PKCS12");
}
@Test
void test() {
// ...
}
}
CosmosDBEmulatorContainer
사용하려면 TLS/SSL에 대한 KeyStore
준비해야 합니다. 자세한 내용은 Testcontainers 설명서의 Cosmos DB Azure 모듈 참조하세요.
@ServiceConnection
이 구성을 사용하면 앱의 Cosmos DB 관련 빈이 Testcontainers 관리 Docker 컨테이너 내에서 실행되는 Cosmos DB와 통신할 수 있습니다. 이 작업은 AzureCosmosConnectionDetails
빈을 자동으로 정의한 다음, Cosmos DB 자동 구성에서 사용되며 연결 관련 구성 속성을 재정의하여 수행됩니다.
샘플
자세한 내용은 GitHub의 azure-spring-boot-samples 리포지토리를 참조하세요.