Compartilhar via


Suporte do Spring Cloud Azure para Testcontainers

Este artigo descreve como integrar o Spring Cloud Azure ao Testcontainers para gravar testes de integração eficazes para seus aplicativos.

O Testcontainer é uma estrutura de software livre para fornecer instâncias descartáveis e leves de bancos de dados, agentes de mensagens, navegadores da Web ou praticamente qualquer coisa que possa ser executada em um contêiner do Docker. Ele se integra ao JUnit, permitindo que você escreva uma classe de teste que possa iniciar um contêiner antes de qualquer um dos testes ser executado. Testcontainer é especialmente útil para escrever testes de integração que conversam com um serviço de back-end real.

A biblioteca spring-cloud-azure-testcontainers agora dá suporte ao teste de integração para os seguintes serviços do Azure:

Conexões de serviço

Uma conexão de serviço é uma conexão com qualquer serviço remoto. A configuração automática do Spring Boot pode consumir os detalhes de uma conexão de serviço e usá-los para estabelecer uma conexão com um serviço remoto. Ao fazer isso, os detalhes da conexão têm precedência sobre quaisquer propriedades de configuração relacionadas à conexão.

Ao usar Testcontainers, você pode criar automaticamente detalhes de conexão para um serviço em execução em um contêiner anotando o campo de contêiner na classe de teste.

xxxContainerConnectionDetailsFactory as classes são registradas com spring.factories. Essas fábricas criam um bean ConnectionDetails com base em uma subclasse Container específica ou no nome da imagem do Docker.

A tabela a seguir fornece informações sobre as classes de fábrica de detalhes de conexão com suporte no JAR spring-cloud-azure-testcontainers:

Classe de fábrica de detalhes da conexão Bean de detalhes da conexão
CosmosContainerConnectionDetailsFactory AzureCosmosConnectionDetails
StorageBlobContainerConnectionDetailsFactory AzureStorageBlobConnectionDetails
StorageQueueContainerConnectionDetailsFactory AzureStorageQueueConnectionDetails
EventHubsContainerConnectionDetailsFactory AzureEventHubsConnectionDetails
ServiceBusContainerConnectionDetailsFactory AzureServiceBusConnectionDetails

Configurar dependências

A configuração a seguir configura as dependências necessárias:

  <properties>
    <version.spring.cloud.azure>7.1.0</version.spring.cloud.azure>
  </properties>

  <dependencyManagement>
    <dependencies>
      <dependency>
        <groupId>com.azure.spring</groupId>
        <artifactId>spring-cloud-azure-dependencies</artifactId>
        <version>${version.spring.cloud.azure}</version>
        <type>pom</type>
        <scope>import</scope>
      </dependency>
    </dependencies>
  </dependencyManagement>

  <dependencies>
    <dependency>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-starter-test</artifactId>
      <scope>test</scope>
    </dependency>
    <dependency>
      <groupId>org.testcontainers</groupId>
      <artifactId>testcontainers-junit-jupiter</artifactId>
      <scope>test</scope>
    </dependency>
    <dependency>
      <groupId>com.azure.spring</groupId>
      <artifactId>spring-cloud-azure-testcontainers</artifactId>
      <scope>test</scope>
    </dependency>
    <dependency>
      <groupId>com.azure.spring</groupId>
      <artifactId>spring-cloud-azure-starter-cosmos</artifactId>
      <scope>test</scope>
    </dependency>
  </dependencies>

Usar Testcontainers

O exemplo de código a seguir demonstra o uso básico de Testcontainers:

@SpringBootTest(classes = CosmosTestcontainersTest.class)
@Testcontainers
@ExtendWith(SpringExtension.class)
@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"))
                .waitingFor(Wait.forHttps("/_explorer/emulator.pem").forStatusCode(200).allowInsecure())
                .withStartupTimeout(Duration.ofMinutes(3));

    @BeforeAll
    public static void setup() throws IOException, CertificateException, KeyStoreException, NoSuchAlgorithmException {
        Path keyStoreFile = new File(tempFolder, "azure-cosmos-emulator.keystore").toPath();
        KeyStore keyStore = cosmos.buildNewKeyStore();
        try (var out = Files.newOutputStream(keyStoreFile.toFile().toPath())) {
            keyStore.store(out, cosmos.getEmulatorKey().toCharArray());
        }

        System.setProperty("javax.net.ssl.trustStore", keyStoreFile.toString());
        System.setProperty("javax.net.ssl.trustStorePassword", cosmos.getEmulatorKey());
        System.setProperty("javax.net.ssl.trustStoreType", "PKCS12");
    }

    @Test
    public void test() {
        CosmosDatabaseResponse databaseResponse = client.createDatabaseIfNotExists("Azure");
        assertThat(databaseResponse.getStatusCode()).isEqualTo(201);
        CosmosContainerResponse containerResponse = client
            .getDatabase("Azure")
            .createContainerIfNotExists("ServiceContainer", "/name");
        assertThat(containerResponse.getStatusCode()).isEqualTo(201);
    }

}

Para usar CosmosDBEmulatorContainer, você precisa preparar um KeyStore para TLS/SSL. Para obter mais informações, consulte Módulo do Azure do Cosmos DB na documentação de Testcontainers. Com @ServiceConnection, essa configuração permite que os feijões relacionados ao Cosmos DB no aplicativo se comuniquem com o Cosmos DB em execução dentro do contêiner do Docker gerenciado por Testcontainers. Essa configuração define automaticamente um AzureCosmosConnectionDetails bean, que a configuração automática do Cosmos DB usa para substituir as propriedades de configuração relacionadas à conexão.

Amostras

Para obter mais informações, consulte os exemplos spring-cloud-azure-testcontainers.