Sdílet prostřednictvím


Podpora Spring Cloud Azure pro testcontainery

Tento článek popisuje, jak integrovat Spring Cloud Azure s testcontainery k zápisu efektivních integračních testů pro vaše aplikace.

Testcontainer je opensourcová architektura pro poskytování odkládacích, jednoduchých instancí databází, zprostředkovatelů zpráv, webových prohlížečů nebo čehokoli, co může běžet v kontejneru Dockeru. Integruje se s JUnit a umožňuje psát testovací třídu, která může spustit kontejner před spuštěním jakéhokoli testu. Testcontainer je zvláště užitečný pro psaní integračních testů, které komunikuje se skutečnou back-endovou službou.

Knihovna spring-cloud-azure-testcontainers teď podporuje testování integrace pro následující služby Azure:

Připojení služeb

Připojení služby je připojení k jakékoli vzdálené službě. Automatická konfigurace Spring Bootu může využívat podrobnosti o připojení služby a používat je k navázání připojení ke vzdálené službě. Při tom mají podrobnosti o připojení přednost před všemi vlastnostmi konfigurace souvisejícími s připojením.

Při použití testcontainers můžete automaticky vytvořit podrobnosti připojení pro službu spuštěnou v kontejneru tak, že do pole kontejneru v testovací třídě označíte pole kontejneru.

xxxContainerConnectionDetailsFactory třídy jsou registrovány v spring.factories. Tyto továrny vytvoří ConnectionDetails bean na základě konkrétní podtřídy Container nebo názvu image Dockeru.

Následující tabulka obsahuje informace o třídách objektu pro vytváření podrobností připojení podporovaných v spring-cloud-azure-testcontainers JAR:

Třída objektu pro vytváření podrobností připojení Podrobnosti připojení bean
CosmosContainerConnectionDetailsFactory AzureCosmosConnectionDetails
StorageBlobContainerConnectionDetailsFactory AzureStorageBlobConnectionDetails
StorageQueueContainerConnectionDetailsFactory AzureStorageQueueConnectionDetails
EventHubsContainerConnectionDetailsFactory AzureEventHubsConnectionDetails
ServiceBusContainerConnectionDetailsFactory AzureServiceBusConnectionDetails

Nastavení závislostí

Následující konfigurace nastaví požadované závislosti:

  <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>

Použití testcontainerů

Následující příklad kódu ukazuje základní použití 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);
    }

}

Pokud chcete použít CosmosDBEmulatorContainer, musíte připravit KeyStore protokol TLS/SSL. Další informace najdete v modulu Azure Cosmos DB v dokumentaci k testcontainerům. Díky @ServiceConnectiontato konfigurace umožňuje službě Cosmos DB v aplikaci komunikovat se službou Cosmos DB spuštěnou uvnitř kontejneru Docker spravovaného službou Testcontainers. Toto nastavení automaticky definuje AzureCosmosConnectionDetails bean, který autokonfigurace Cosmos DB pak používá k přepsání všech vlastností konfigurace souvisejících s připojením.

Vzorky

Další informace najdete v příkladech spring-cloud-azure-testcontainers.