Megosztás a következőn keresztül:


Spring Cloud Azure-támogatás a Testcontainershez

Ez a cikk azt ismerteti, hogyan integrálhatja a Spring Cloud Azure-t Testcontainers az alkalmazások hatékony integrációs tesztjeinek megírásához.

A Testcontainer egy nyílt forráskódú keretrendszer, amely lehetővé teszi az adatbázisok, üzenetközvetítők, webböngészők, vagy akár bármi egyszerű, Docker-tárolóban futtatható egyszerű példányát. Integrálható a JUnittal, lehetővé téve egy tesztosztály írását, amely elindíthat egy tárolót a tesztek futtatása előtt. A Testcontainer különösen hasznos olyan integrációs tesztek írásához, amelyek valós háttérszolgáltatással kommunikálnak.

A spring-cloud-azure-testcontainers kódtár mostantól támogatja az integrációs tesztelést a következő Azure-szolgáltatásokhoz:

Szolgáltatáskapcsolatok

A szolgáltatáskapcsolat bármely távoli szolgáltatáshoz kapcsolódik. A Spring Boot automatikus konfigurációja felhasználhatja a szolgáltatáskapcsolat részleteit, és segítségével kapcsolatot létesíthet egy távoli szolgáltatással. Ennek során a kapcsolat részletei elsőbbséget élveznek a kapcsolattal kapcsolatos konfigurációs tulajdonságokkal szemben.

A Testcontainers használatakor automatikusan létrehozhat kapcsolatadatokat egy tárolóban futó szolgáltatáshoz a tesztosztály tároló mezőjének megjegyzésével.

xxxContainerConnectionDetailsFactory osztályokat regisztrál a spring.factoriesrendszer. Ezek a gyárak létrehoznak egy ConnectionDetails babot egy adott Container alosztály vagy a Docker-rendszerkép neve alapján.

Az alábbi táblázat a spring-cloud-azure-testcontainers JAR-ban támogatott kapcsolati adatok gyári osztályairól nyújt tájékoztatást:

Kapcsolat részletei gyári osztály Kapcsolat részletei bean
CosmosContainerConnectionDetailsFactory AzureCosmosConnectionDetails
StorageBlobContainerConnectionDetailsFactory AzureStorageBlobConnectionDetails
StorageQueueContainerConnectionDetailsFactory AzureStorageQueueConnectionDetails
EventHubsContainerConnectionDetailsFactory AzureEventHubsConnectionDetails
ServiceBusContainerConnectionDetailsFactory AzureServiceBusConnectionDetails

Függőségek beállítása

A következő konfiguráció állítja be a szükséges függőségeket:

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

Tesztkontainerek használata

Az alábbi példakód a Testcontainers alapszintű használatát mutatja be:

@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);
    }

}

A használatához CosmosDBEmulatorContainerelő kell készítenie egy KeyStore TLS/SSL protokollt. További információ: Cosmos DB Azure-modul a Testcontainers dokumentációjában. A @ServiceConnectionlehetővé teszi, hogy a Cosmos DB-hez kapcsolódó babok az alkalmazásban kommunikáljanak a Testcontainers által felügyelt Docker-tárolóban futó Cosmos DB-vel. Ez a beállítás automatikusan definiál egy AzureCosmosConnectionDetails babot, amelyet a Cosmos DB automatikus konfigurációja a kapcsolattal kapcsolatos konfigurációs tulajdonságok felülbírálásához használ.

Minták

További információkért tekintse meg a spring-cloud-azure-testcontainers példákat.