Docker teszt konténerek Java tesztekben

1. Bemutatkozás

Ebben az oktatóanyagban a Java-t fogjuk megvizsgálni TestContainers könyvtár. Ez lehetővé teszi számunkra, hogy tesztjeink során Docker konténereket használjunk. Ennek eredményeként önálló integrációs teszteket írhatunk, amelyek külső erőforrásoktól függenek.

Bármely erőforrást használhatunk tesztjeinkben, amelyek dokkoló képpel rendelkeznek. Például vannak képek adatbázisokhoz, webböngészőkhöz, webszerverekhez és üzenetsorokhoz. Ezért tesztjeinkként konténerként futtathatjuk őket.

2. Követelmények

TestContainers könyvtár használható Java 8 és újabb verziókkal. Ezenkívül kompatibilis a JUnit Rules API-val.

Először határozzuk meg az alapvető funkcionalitás maven-függőségét:

 org.testcontainers testcontainers 1.11.4 

Speciális konténerekhez is vannak modulok. Ebben az oktatóanyagban a következőket fogjuk használni PostgreSQL és Szelén.

Adjuk hozzá a releváns függőségeket:

 org.testcontainers postgresql 1.11.4 org.testcontainers szelén 1.11.4 

A legújabb verziókat a Maven Central oldalon találhatjuk.

A konténerek futtatásához szükségünk van a Docker-re is. A telepítési utasításokat a Docker dokumentációjában találja.

Győződjön meg arról, hogy képes-e futtatni a Docker-tárolókat a tesztkörnyezetében.

3. Használat

Konfiguráljunk egy általános tárolószabályt:

@ClassRule nyilvános statikus GenericContainer simpleWebServer = új GenericContainer ("alpine: 3.2") .withExposedPorts (80) .withCommand ("/ bin / sh", "-c", "igaz"; do echo "+" \ "HTTP / 1.1 200 OK \ n \ nHelló világ! \ "| Nc -l -p 80; kész");

Megépítjük a GenericContainer tesztszabály a dokkoló képnevének megadásával. Ezután az építő metódusokkal konfiguráljuk:

  • Használunk withExposedPorts hogy kitegyenek egy portot a konténerből
  • parancssal meghatározza a tároló parancsot. A tároló elindulásakor kerül végrehajtásra.

A szabályt a @ClassRule. Ennek eredményeként elindítja a Docker tárolót, mielőtt az adott osztály bármely tesztje lefutna. A konténer az összes módszer végrehajtása után megsemmisül.

Ha jelentkezik @Szabály kommentár, GenericContainer szabály új tárolót indít minden vizsgálati módszerhez. És leállítja a tartályt, amikor a vizsgálati módszer befejeződik.

IP-címet és portot használhatunk a tárolóban futó folyamattal való kommunikációhoz:

@Test public void givenSimpleWebServerContainer_whenGetReuqest_thenReturnsResponse () dobja a kivételt {String address = "//" + simpleWebServer.getContainerIpAddress () + ":" + simpleWebServer.getMappedPort (80); Karakterlánc-válasz = simpleGetRequest (cím); assertEquals (válasz: "Hello világ!"); }

4. Használati módok

Több is van használati módok vizsgálati tartályok. Láttunk egy példát az a futtatására GenericContainer.

TestContainers a könyvtárnak speciális funkciókkal rendelkező szabálydefiníciói is vannak. Olyan közös adatbázisok tárolóira szolgálnak, mint a MySQL, a PostgreSQL; és mások, mint a webes kliensek.

Bár általános tárolóként futtathatjuk őket, a szakterületek kiterjesztett kényelmi módszereket kínálnak.

4.1. Adatbázisok

Tegyük fel, hogy adatbázis-kiszolgálóra van szükségünk az adatelérési réteg integrációs tesztjeihez. A TestContainers könyvtár segítségével tárolókban futtathatunk adatbázisokat.

Például egy PostgreSQL tárolót indítunk PostgreSQLContainer szabály. Ezután képesek vagyunk segítő módszereket használni. Ezek getJdbcUrl, getUsername, getPassword adatbázis-kapcsolathoz:

@Rule public PostgreSQLContainer postgresContainer = new PostgreSQLContainer (); @Test public void whenSelectQueryExecuted_thenResulstsReturned () dobja a Kivételt {String jdbcUrl = postgresContainer.getJdbcUrl (); Karakterlánc felhasználónév = postgresContainer.getUsername (); Karakterlánc jelszó = postgresContainer.getPassword (); Connection conn = DriverManager .getConnection (jdbcUrl, felhasználónév, jelszó); ResultSet resultSet = conn.createStatement (). ExecuteQuery ("SELECT 1"); resultSet.next (); int eredmény = resultSet.getInt (1); assertEquals (1, eredmény); }

Lehetséges a PostgreSQL futtatása általános tárolóként is. De nehezebb lenne konfigurálni a kapcsolatot.

4.2. Web-illesztőprogramok

Egy másik hasznos forgatókönyv a konténerek futtatása webböngészőkkel. BrowserWebDriverContainer szabály lehetővé teszi a futást Króm és Firefox ban ben dokkoló-szelén konténerek. Aztán kezeljük őket RemoteWebDriver.

Ez nagyon hasznos a webes alkalmazások felhasználói felületének / elfogadásának teszteléséhez:

@Rule public BrowserWebDriverContainer chrome = new BrowserWebDriverContainer () .withCapability (új ChromeOptions ()); @Test public void whenNavigatedToPage_thenHeadingIsInThePage () {RemoteWebDriver illesztőprogram = chrome.getWebDriver (); driver.get ("// example.com"); Karaktersorozat = driver.findElement (By.xpath ("/ html / body / div / h1")) .getText (); assertEquals ("Példatartomány", fejléc); }

4.3. Docker Compose

Ha a tesztek bonyolultabb szolgáltatásokat igényelnek, akkor azokat megadhatjuk az a-ban dokkoló-ír fájl:

simpleWebServer: image: alpine: 3.2 parancs: ["/ bin / sh", "-c", "igaz"; visszhangozzon 'HTTP / 1.1 200 OK \ n \ nHelló világ!' | nc -l -p 80; kész "]

Akkor használjuk DockerComposeContainer szabály. Ez a szabály elindítja és futtatja a szolgáltatásokat az írási fájlban meghatározottak szerint.

Használunk getServiceHost és getServicePost módszerek a szolgáltatáshoz való kapcsolódási cím felépítésére:

@ClassRule public static DockerComposeContainer compose = new DockerComposeContainer (new File ("src / test / resources / test-compose.yml")) .withExposedService ("simpleWebServer_1", 80); @Test public void givenSimpleWebServerContainer_whenGetReuqest_thenReturnsResponse () dobja a Kivételt {String address = "//" + compose.getServiceHost ("simpleWebServer_1", 80) + ":" + compose.getServicePerv ("simpleWebS) Karakterlánc-válasz = simpleGetRequest (cím); assertEquals (válasz, "Hello World"); }

5. Következtetés

Láttuk, hogyan tudnánk használni TestContainers könyvtár. Megkönnyíti az integrációs tesztek fejlesztését és futtatását.

Használtuk GenericContainer szabály az adott dokkoló képek tárolóihoz. Aztán megnéztük PostgreSQLContainer, BrowserWebDriverContainer és DockerComposeContainer szabályok. Több funkcionalitást adnak a speciális felhasználási esetekhez.

Végül az itt található kódminták megtalálhatók a GitHubon.