다음을 통해 공유


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

종속성 설정

다음 구성은 필요한 종속성을 설정합니다.

<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의 기본 사용을 보여 줍니다.

@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 리포지토리를 참조하세요.