Docker testni spremnici u Java testovima

1. Uvod

U ovom ćemo tutorijalu pogledati Javu TestContainers knjižnica. Omogućuje nam upotrebu Dockerovih spremnika u okviru naših testova. Kao rezultat, možemo napisati samostalne integracijske testove koji ovise o vanjskim resursima.

U našim testovima možemo koristiti bilo koji resurs koji ima sliku dockera. Na primjer, postoje slike za baze podataka, web preglednike, web poslužitelje i redove poruka. Stoga ih možemo pokretati kao spremnike u okviru naših testova.

2. Zahtjevi

TestContainers knjižnica se može koristiti s Javom 8 i novijom. Osim toga, kompatibilan je s API-jem JUnit Rules.

Prvo, definirajmo ovisnost maven za osnovnu funkcionalnost:

 org.testcontainers testcontainers 1.11.4 

Postoje i moduli za specijalizirane kontejnere. U ovom ćemo uputstvu koristiti PostgreSQL i Selen.

Dodajmo relevantne ovisnosti:

 org.testcontainers postgresql 1.11.4 org.testcontainers selen 1.11.4 

Najnovije verzije možemo pronaći na Maven Central.

Također, Docker nam treba za pokretanje kontejnera. Upute za instalaciju potražite u dokumentaciji Dockera.

Obavezno pokrenite Docker spremnike u testnom okruženju.

3. Upotreba

Konfigurirajmo generičko pravilo spremnika:

@ClassRule javni statički GenericContainer simpleWebServer = novi GenericContainer ("alpine: 3.2") .withExposedPorts (80) .withCommand ("/ bin / sh", "-c", "while true; do echo" + "\" HTTP / 1.1 200 OK \ n \ nPozdrav svijetu! \ "| Nc -l -p 80; gotovo");

Konstruiramo a GenericContainer test pravilo određivanjem naziva slike dockera. Zatim ga konfiguriramo s metodama graditelja:

  • Koristimo withExposedPorts izložiti priključak iz spremnika
  • withCommand definira naredbu spremnika. Izvršit će se kad spremnik započne.

Pravilo je označeno s @ClassRule. Kao rezultat, pokrenut će Docker spremnik prije nego što se pokrene bilo koji test u toj klasi. Spremnik će biti uništen nakon izvršavanja svih metoda.

Ako se prijavite @Pravilo napomena, GenericContainer pravilo će pokrenuti novi spremnik za svaku ispitnu metodu. I zaustavit će spremnik kad ta metoda ispitivanja završi.

IP adresu i port možemo koristiti za komunikaciju s procesom koji se izvodi u spremniku:

@Test javna praznina givenSimpleWebServerContainer_whenGetReuqest_thenReturnsResponse () baca iznimku {String address = "//" + simpleWebServer.getContainerIpAddress () + ":" + simpleWebServer.getMappedPort (80); Nizni odgovor = simpleGetRequest (adresa); assertEquals (odgovor, "Pozdrav svijetu!"); }

4. Načini korištenja

Ima ih nekoliko načini korištenja ispitnih spremnika. Vidjeli smo primjer vođenja a GenericContainer.

TestContainers knjižnica također ima definicije pravila sa specijaliziranom funkcionalnošću. Oni su za spremnike uobičajenih baza podataka kao što su MySQL, PostgreSQL; a drugi poput web klijenata.

Iako ih možemo pokretati kao generičke spremnike, specijalizacije pružaju proširene metode praktičnosti.

4.1. Baze podataka

Pretpostavimo da nam je potreban poslužitelj baze podataka za testove integracije sloja pristupa podacima. Baze podataka možemo pokretati u spremnicima uz pomoć biblioteke TestContainers.

Na primjer, pokrećemo spremnik PostgreSQL pomoću PostgreSQLContainer Pravilo. Tada smo u mogućnosti koristiti pomoćne metode. Ovi su getJdbcUrl, getUsername, getPassword za povezivanje s bazom podataka:

@Rule javni PostgreSQLContainer postgresContainer = novi PostgreSQLContainer (); @Test public void whenSelectQueryExecuted_thenResulstsReturned () baca iznimku {String jdbcUrl = postgresContainer.getJdbcUrl (); String korisničko ime = postgresContainer.getUsername (); Lozinka niza = postgresContainer.getPassword (); Veza conn = DriverManager .getConnection (jdbcUrl, korisničko ime, lozinka); ResultSet resultSet = conn.createStatement (). ExecuteQuery ("SELECT 1"); resultSet.next (); int rezultat = rezultatSet.getInt (1); assertEquals (1, rezultat); }

Također je moguće pokrenuti PostgreSQL kao generički spremnik. No, bilo bi teže konfigurirati vezu.

4.2. Web upravljački programi

Sljedeći je koristan scenarij pokretanje spremnika s web preglednicima. BrowserWebDriverContainer pravilo omogućuje trčanje Krom i Firefox u docker-selen kontejneri. Zatim, mi s njima upravljamo RemoteWebDriver.

Ovo je vrlo korisno za automatizaciju testova korisničkog sučelja / prihvaćanja za web aplikacije:

@Rule javni BrowserWebDriverContainer chrome = novi BrowserWebDriverContainer () .withCapabilities (novi ChromeOptions ()); @Test public void whenNavigatedToPage_thenHeadingIsInThePage () {RemoteWebDriver driver = chrome.getWebDriver (); driver.get ("// example.com"); Niz naslova = driver.findElement (By.xpath ("/ html / body / div / h1")) .getText (); assertEquals ("Primjer domene", naslov); }

4.3. Docker Compose

Ako testovi zahtijevaju složenije usluge, možemo ih navesti u a docker-compose datoteka:

simpleWebServer: image: alpine: 3.2 naredba: ["/ bin / sh", "-c", "dok je istina; odjeknite 'HTTP / 1.1 200 OK \ n \ nPozdrav svijetu!' | nc -l -p 80; gotovo "]

Zatim, koristimo DockerComposeContainer Pravilo. Ovo će pravilo pokretati i pokretati usluge kako je definirano u datoteci za sastavljanje.

Koristimo getServiceHost i getServicePost metode za izgradnju adrese veze sa uslugom:

@ClassRule javni statički DockerComposeContainer compose = novi DockerComposeContainer (nova datoteka ("src / test / resources / test-compose.yml")) .withExposedService ("simpleWebServer_1", 80); @Test javna praznina givenSimpleWebServerContainer_whenGetReuqest_thenReturnsResponse () baca iznimku {String address = "//" + compose.getServiceHost ("simpleWebServer_1", 80) + ":" + compose.getServicePort ("simpleWebServer_1" Nizni odgovor = simpleGetRequest (adresa); assertEquals (odgovor, "Pozdrav svijetu"); }

5. Zaključak

Vidjeli smo kako možemo koristiti TestContainers knjižnica. Olakšava razvoj i pokretanje integracijskih testova.

Koristili smo GenericContainer pravilo za spremnike danih slika dockera. Zatim, pogledali smo PostgreSQLContainer, BrowserWebDriverContainer i DockerComposeContainer pravila. Daju više funkcionalnosti za određene slučajeve upotrebe.

Konačno, ovdje se mogu naći uzorci koda na GitHubu.