Docker testovacie kontajnery v testoch Java

1. Úvod

V tomto výučbe sa pozrieme na Javu Testovacie kontajnery knižnica. Umožňuje nám to používať nádoby Docker v rámci našich testov. Vo výsledku môžeme písať samostatné integračné testy, ktoré závisia od externých zdrojov.

V našich testoch môžeme použiť akýkoľvek zdroj, ktorý má obraz ukotvenia. Napríklad existujú obrázky pre databázy, webové prehľadávače, webové servery a fronty správ. Preto ich v rámci našich testov môžeme spustiť ako kontajnery.

2. Požiadavky

Testovacie kontajnery knižnicu je možné používať s Java 8 a novšími. Okrem toho je kompatibilný s rozhraním API JUnit Rules.

Najprv definujeme závislosť závislostí pre základné funkcie:

 org.testovacie nádoby testovacie nádoby 1.11.4 

K dispozícii sú tiež moduly pre špecializované kontajnery. V tejto príručke budeme používať PostgreSQL a Selén.

Pridajme príslušné závislosti:

 org.testcontainers postgresql 1.11.4 org.testcontainers selenium 1.11.4 

Najnovšie verzie nájdeme na serveri Maven Central.

Tiež potrebujeme, aby Docker prevádzkoval kontajnery. Pokyny na inštaláciu nájdete v dokumentácii Docker.

Uistite sa, že ste schopní spustiť Dockerove kontajnery vo svojom testovacom prostredí.

3. Použitie

Konfigurujme všeobecné pravidlo pre kontajner:

@ClassRule public static GenericContainer simpleWebServer = nový GenericContainer ("alpský: 3,2") .withExposedPorts (80) .withCommand ("/ bin / sh", "-c", "zatiaľ čo je to pravda; robiť echo" + "\" HTTP / 1.1 200 OK \ n \ nAhoj svet! \ "| Nc -l -p 80; hotovo");

Konštruujeme a GenericContainer testovacie pravidlo zadaním názvu obrázka ukotvenia. Potom ho nakonfigurujeme pomocou metód staviteľa:

  • Používame withExposedPorts vystaviť prístav z kontajnera
  • withCommand definuje príkaz kontajnera. Vykoná sa pri spustení kontajnera.

Pravidlo je anotované s @ClassRule. Vo výsledku spustí kontajner Docker pred spustením akéhokoľvek testu v tejto triede. Po vykonaní všetkých metód bude kontajner zničený.

Ak podáte žiadosť @ Pravidlo anotácia, GenericContainer pravidlo spustí nový kontajner pre každú testovaciu metódu. Akonáhle sa táto skúšobná metóda skončí, zastaví sa nádoba.

Na komunikáciu s procesom prebiehajúcim v kontajneri môžeme použiť IP adresu a port:

@Test public void givenSimpleWebServerContainer_whenGetReuqest_thenReturnsResponse () vyvolá výnimku {String address = "//" + simpleWebServer.getContainerIpAddress () + ":" + simpleWebServer.getMappedPort (80); Reťazcová odpoveď = simpleGetRequest (adresa); assertEquals (odpoveď, „Hello World!“); }

4. Režimy používania

Je ich niekoľko režimy používania skúšobných nádob. Videli sme príklad spustenia a GenericContainer.

Testovacie kontajnery Knižnica má tiež definície pravidiel so špecializovanou funkčnosťou. Sú určené pre kontajnery bežných databáz ako MySQL, PostgreSQL; a ďalší, napríklad weboví klienti.

Aj keď ich môžeme spustiť ako generické kontajnery, špecializácie poskytujú rozšírené metódy pohodlnosti.

4.1. Databázy

Predpokladajme, že na testovanie integrácie dátovej prístupovej vrstvy potrebujeme databázový server. Pomocou knižnice TestContainers môžeme prevádzkovať databázy v kontajneroch.

Napríklad vypálime kontajner PostgreSQL PostgreSQLContainer pravidlo. Potom sme schopní použiť pomocné metódy. Toto sú getJdbcUrl, getUsername, getPassword pre pripojenie k databáze:

@ Pravidlo verejné PostgreSQLContainer postgresContainer = nový PostgreSQLContainer (); @Test public void whenSelectQueryExecuted_thenResulstsReturned () vyvolá výnimku {String jdbcUrl = postgresContainer.getJdbcUrl (); Reťazec username = postgresContainer.getUsername (); Reťazcové heslo = postgresContainer.getPassword (); Pripojenie conn = DriverManager .getConnection (jdbcUrl, používateľské meno, heslo); ResultSet resultSet = conn.createStatement (). ExecuteQuery ("SELECT 1"); resultSet.next (); int vysledok = vysledok.getInt (1); assertEquals (1, výsledok); }

Je tiež možné spustiť PostgreSQL ako generický kontajner. Bolo by však zložitejšie nakonfigurovať pripojenie.

4.2. Webové ovládače

Ďalším užitočným scenárom je spustenie kontajnerov s webovými prehľadávačmi. BrowserWebDriverContainer pravidlo umožňuje spustenie Chrome a Firefox v docker-selén nádob. Potom ich spravujeme pomocou RemoteWebDriver.

To je veľmi užitočné na automatizáciu testov používateľského rozhrania / akceptácie webových aplikácií:

@Rule public BrowserWebDriverContainer chrome = nový BrowserWebDriverContainer () .withCapabilities (nové ChromeOptions ()); @Test public void whenNavigatedToPage_thenHeadingIsInThePage () {RemoteWebDriver driver = chrome.getWebDriver (); driver.get ("// example.com"); Nadpis reťazca = driver.findElement (By.xpath ("/ html / body / div / h1")) .getText (); assertEquals ("Príklad domény", nadpis); }

4.3. Docker Compose

Ak testy vyžadujú zložitejšie služby, môžeme ich špecifikovať v a ukotviť-zložiť spis:

simpleWebServer: image: alpine: 3.2 command: ["/ bin / sh", "-c", "while true; do echo 'HTTP / 1.1 200 OK \ n \ nHello World!' | nc -l -p 80; hotové "]

Potom použijeme DockerComposeContainer pravidlo. Toto pravidlo spustí a spustí služby tak, ako sú definované v súbore na napísanie správy.

Používame getServiceHost a getServicePost metódy na vytvorenie adresy pripojenia k službe:

@ClassRule public static DockerComposeContainer compose = nový DockerComposeContainer (nový súbor ("src / test / resources / test-compose.yml")) .withExposedService ("simpleWebServer_1", 80); @Test public void givenSimpleWebServerContainer_whenGetReuqest_thenReturnsResponse () vyvolá výnimku {String address = "//" + compose.getServiceHost ("simpleWebServer_1", 80) + ":" + compose.getServicePort ("simpleWebServer" Reťazcová odpoveď = simpleGetRequest (adresa); assertEquals (odpoveď, „Hello World“); }

5. Záver

Videli sme, ako môžeme využiť Testovacie kontajnery knižnica. Uľahčuje vývoj a spustenie integračných testov.

Použili sme GenericContainer pravidlo pre kontajnery daných docker obrázkov. Potom sme sa pozreli na PostgreSQLContainer, BrowserWebDriverContainer a DockerComposeContainer pravidlá. Poskytujú viac funkcií pre konkrétne prípady použitia.

Nakoniec ukážky kódu nájdete na GitHub.


$config[zx-auto] not found$config[zx-overlay] not found