{"id":596,"date":"2024-10-22T16:08:29","date_gmt":"2024-10-22T16:08:29","guid":{"rendered":"https:\/\/iseebugs.pl\/?p=596"},"modified":"2024-10-22T18:48:40","modified_gmt":"2024-10-22T18:48:40","slug":"maven-rodzaje-testow","status":"publish","type":"post","link":"https:\/\/iseebugs.pl\/index.php\/2024\/10\/22\/maven-rodzaje-testow\/","title":{"rendered":"Maven &#8211; przejmij w\u0142adz\u0119 nad testami!"},"content":{"rendered":"\n<p>Korzystaj\u0105c z Maven&#8217;a do zarz\u0105dzania projektem najcz\u0119\u015bciej do uruchamiania test\u00f3w korzystamy z komendy <code>mvn test<\/code>. Czy ta komenda na pewno uruchomi je wszystkie i czy mo\u017cemy je uruchamia\u0107 jako\u015b inaczej?<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Stan zastany<\/h2>\n\n\n\n<p>Testy mo\u017cemy podzieli\u0107 na 3 g\u0142\u00f3wne grupy testowe tj. E2E, Integracyjne oraz Jednostkowe. Jednak nas jako programist\u00f3w interesuje r\u00f3wnie\u017c czy uruchamiaj\u0105c dany test uruchamiamy ca\u0142y kontekst u\u017cywanego przez nas frameworka (np. Spring Boota) czy nie, co si\u0119 bezpo\u015brednio przek\u0142ada na czas trwania test\u00f3w.<\/p>\n\n\n\n<p>Najcz\u0119\u015bciej przeze mnie spotykanym stanem na istniej\u0105cym projekcie jest taki gdzie wszystkie klasy testowe maj\u0105 w nazwie s\u0142owo Test np. SomeClassTest.java itp. A testy s\u0105 uruchamiane poprzez komend\u0119 <code>mvn test<\/code>. <\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Testy jednostkowe<\/h2>\n\n\n\n<p>Komenda &#8222;mvn test&#8221; uruchamia faz\u0119 <code>test<\/code> cyklu \u017cycia projektu za kt\u00f3r\u0105 odpowiada <code>plugin Surefire<\/code>. W tej fazie s\u0105 uruchamiane wszystkie testy jednostkowe. Maven nie rozr\u00f3\u017cnia test\u00f3w jednostkowych na podstawie tego czy jest uruchamiany kontekst frameworka czy nie podczas test\u00f3w. <\/p>\n\n\n\n<p>Maven rozr\u00f3\u017cnia klasy testowe po ich nazwach:<\/p>\n\n\n\n<ul>\n<li>jednostkowe &#8211; posiadaj\u0105 w swojej nazwie s\u0142owo &#8222;Test&#8221;<\/li>\n\n\n\n<li>integracyjne &#8211; posiadaj\u0105 w swojej nazwie znaki &#8222;IT&#8221; <\/li>\n<\/ul>\n\n\n\n<p>Wi\u0119c je\u017celi nazwiemy swoj\u0105 klas\u0119 np. <code>MyClassIntegrationTest.java<\/code> to zostanie ona zakwalifikowany przez Maven&#8217;a do test\u00f3w jednostkowych pomimo, \u017ce mo\u017ce by\u0107 to test integracyjny uruchamianym wraz z kontekstem frameworka. <\/p>\n\n\n\n<p>Czasami si\u0119 zdarza, \u017ce tego chcemy np. w sytuacji kiedy chcemy przetestowa\u0107 kluczowe dla naszego modu\u0142u operacje na prawdziwej bazie danych a nie na bazie inMemory. <\/p>\n\n\n\n<p>Ta faza projektu nie uruchamia test\u00f3w integracyjnych.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Testy integracyjne<\/h2>\n\n\n\n<p>Ale jak w takim razie uruchomi\u0107 testy integracyjne? R\u0119czne wywo\u0142ywanie test\u00f3w integracyjnych nie wydaje si\u0119 zbyt rozs\u0105dnym rozwi\u0105zaniem. <\/p>\n\n\n\n<p>Aby uruchomi\u0107 testy integracyjne musimy skonfigurowa\u0107 <code>Failsafe plugin<\/code> kt\u00f3ry s\u0142u\u017cy do uruchamiania mi\u0119dzy innymi test\u00f3w integracyjnych. Aby w\u0142\u0105czy\u0107 plugin do projektu musimy minimalnie skonfigurawa\u0107 nasz plik pom.xml.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>&lt;plugin&gt;\n\t&lt;groupId&gt;org.apache.maven.plugins&lt;\/groupId&gt;\n\t&lt;artifactId&gt;maven-failsafe-plugin&lt;\/artifactId&gt;\n\t&lt;version&gt;3.1.2&lt;\/version&gt;\n\t&lt;executions&gt;\n\t\t&lt;execution&gt;\n\t\t\t&lt;goals&gt;\n\t\t\t\t&lt;goal&gt;integration-test&lt;\/goal&gt;\n\t\t\t\t&lt;goal&gt;verify&lt;\/goal&gt;\n\t\t\t&lt;\/goals&gt;\n\t\t&lt;\/execution&gt;\n\t&lt;\/executions&gt;\n&lt;\/plugin&gt;<\/code><\/pre>\n\n\n\n<p>Powy\u017cszy kod dodaje plugin failsafe do faz: integration-test oraz verify. Jest to minimalna konfiguracja i nale\u017cy doda\u0107 plugin do obu faz cyklu \u017cycia. Oczy wi\u015bcie mo\u017cna pomin\u0105\u0107 dodanie go do jednego ale wtedy:<\/p>\n\n\n\n<ul>\n<li><strong>Mo\u017cna zrezygnowa\u0107 z <code>integration-test<\/code><\/strong>, ale to oznacza, \u017ce testy integracyjne nie zostan\u0105 uruchomione. W takim przypadku <code>failsafe<\/code> nie b\u0119dzie mia\u0142 \u017cadnych test\u00f3w do zweryfikowania w fazie <code>verify<\/code>, wi\u0119c ten etap stanie si\u0119 zb\u0119dny.<\/li>\n\n\n\n<li><strong>Mo\u017cna zrezygnowa\u0107 z <code>verify<\/code><\/strong>, ale nie jest to zalecane, poniewa\u017c po uruchomieniu test\u00f3w integracyjnych w fazie <code>integration-test<\/code>, wyniki tych test\u00f3w powinny by\u0107 zweryfikowane. Je\u015bli nie ma fazy <code>verify<\/code>, b\u0142\u0119dy w testach integracyjnych mog\u0105 by\u0107 przeoczone.<\/li>\n<\/ul>\n\n\n\n<p>Mo\u017cemy dostosowa\u0107 do naszych potrzeb pliki jakie b\u0119d\u0119 uruchamiane podczas wykonywania fazy test\u00f3w integracyjnych. <\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>&lt;configuration&gt;\n\t&lt;includes&gt;\n\t\t&lt;include&gt;**\/*IT.java&lt;\/include&gt;\n\t\t&lt;include&gt;**\/*E2E.java&lt;\/include&gt;\n\t&lt;\/includes&gt;\n&lt;\/configuration&gt;<\/code><\/pre>\n\n\n\n<p>Dodaj\u0105c powy\u017cszy kod w konfiguracji pom.xml doprecyzowujemy z jakimi przyrostkami b\u0119d\u0105 brane pliki pod uwag\u0119 przez maven-failsafe-plugin. Powy\u017cszy kod b\u0119dzie uruchamia\u0142 testy integracyjne oraz End to End.<\/p>\n\n\n\n<p>Aby uruchomi\u0107 wszystkie testy integracyjne nale\u017cy skorzysta\u0107 z komendy:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>mvn failsafe:integration-test<\/code><\/pre>\n\n\n\n<p>Pe\u0142en kod konfiguracji mavana jest nast\u0119puj\u0105cy:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>&lt;plugin&gt;\n\t&lt;groupId&gt;org.apache.maven.plugins&lt;\/groupId&gt;\n\t&lt;artifactId&gt;maven-failsafe-plugin&lt;\/artifactId&gt;\n\t&lt;version&gt;3.1.2&lt;\/version&gt;\n\t&lt;executions&gt;\n\t\t&lt;execution&gt;\n\t\t\t&lt;goals&gt;\n\t\t\t\t&lt;goal&gt;integration-test&lt;\/goal&gt;\n\t\t\t\t&lt;goal&gt;verify&lt;\/goal&gt;\n\t\t\t&lt;\/goals&gt;\n\t\t&lt;\/execution&gt;\n\t\t&lt;configuration&gt;\n\t\t\t&lt;includes&gt;\n\t\t\t\t&lt;include&gt;**\/*IT.java&lt;\/include&gt;\n\t\t\t\t&lt;include&gt;**\/*E2E.java&lt;\/include&gt;\n\t\t\t&lt;\/includes&gt;\n\t\t&lt;\/configuration&gt;\n\t&lt;\/executions&gt;\n&lt;\/plugin&gt;<\/code><\/pre>\n\n\n\n<h2 class=\"wp-block-heading\">Maven verify<\/h2>\n\n\n\n<p>Cz\u0119sto chcemy uruchomi\u0107 wszystkie testy na raz np. przed wykonaniem merge&#8217;a. Do tego najlepiej nadaje si\u0119 faza verify. Uruchamiaj\u0105c poni\u017csz\u0105 komend\u0119 uruchomiamy wszystkie testy jakie mamy w programie zar\u00f3wno jednostkowe jak i integracyjne (je\u017celi skonfigurowali\u015bmy pom.xml).<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>mvn verify<\/code><\/pre>\n\n\n\n<p>Mamy ju\u017c skonfigurowanego pom&#8217;a oraz wiem jak wywo\u0142ywa\u0107 testy jednostkowe i integracyjne w poszczeg\u00f3lnych konfiguracjach. Ale mo\u017cemy zada\u0107 sobie jeszcze jedno pytanie: &#8222;Jak w takim razie uruchomi\u0107 tylko testy integracyjne lub tylko end to end, skoro mvn failsafe:integration-test uruchamia wszystkie zdefiniowne w pom&#8217;ie?&#8221;. Aby uruchomi\u0107 tylko jeden rodzaj test\u00f3w (np. E2E) skorzystamy z parametru -Dit.test-*E2E.java. Mo\u017cemy poszczeg\u00f3lne testy wywo\u0142a\u0107 albo z posiomu integration-test albo verigy w zale\u017cno\u015bci czego oczekujemy.<\/p>\n\n\n\n<p><strong><code>mvn failsafe:integration-test -Dit.test=*E2E.java<\/code><\/strong>: Gdy chcesz szybko uruchomi\u0107 tylko testy E2E bez potrzeby pe\u0142nej weryfikacji i raportowania.<\/p>\n\n\n\n<p><strong><code>mvn verify -Dit.test=*E2E.java<\/code><\/strong>: Gdy chcesz pe\u0142ny cykl weryfikacyjny, obejmuj\u0105cy uruchomienie test\u00f3w E2E oraz pe\u0142n\u0105 weryfikacj\u0119 wynik\u00f3w test\u00f3w i ich raportowanie.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Podsumowanie<\/h2>\n\n\n\n<p>Spojrzeli\u015bmy na testy z punktu widzenia Maven. Dowiedzieli\u015bmy si\u0119 jak uruchamia\u0107 poszczeg\u00f3lne rodzaje test\u00f3w, oraz jak konfigurowa\u0107 pom.xml i nazywa\u0107 testy aby by\u0142y uruchamiane w tych fazach projektu w kt\u00f3rych my chcemy aby by\u0142y uruchamiane.<\/p>\n\n\n\n<p>Uruchamianie test\u00f3w:<\/p>\n\n\n\n<ul>\n<li>Jednostkowych\n<ul>\n<li><code>mvn test<\/code><\/li>\n<\/ul>\n<\/li>\n\n\n\n<li>Integracyjnych\n<ul>\n<li><code>mvn failsafe:integration-test<\/code><\/li>\n<\/ul>\n<\/li>\n\n\n\n<li>Wszystkich\n<ul>\n<li><code>mvn verify<\/code><\/li>\n<\/ul>\n<\/li>\n\n\n\n<li>Wybranej grupy test\u00f3w\n<ul>\n<li><code>mvn failsafe:integration-test -Dit.test=*E2E.java<\/code><\/li>\n\n\n\n<li><code>mvn verify -Dit.test=*E2E.java<\/code><\/li>\n<\/ul>\n<\/li>\n<\/ul>\n\n\n<style>.kb-image596_82aaa3-3b .kb-image-has-overlay:after{opacity:0.3;}.kb-image596_82aaa3-3b img.kb-img, .kb-image596_82aaa3-3b .kb-img img{border-top-left-radius:45px;border-top-right-radius:45px;border-bottom-right-radius:45px;border-bottom-left-radius:45px;box-shadow:3px 3px 3px 3px #000000;}<\/style>\n<figure class=\"wp-block-kadence-image kb-image596_82aaa3-3b size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"585\" src=\"https:\/\/iseebugs.pl\/wp-content\/uploads\/2024\/10\/tests-1024x585.webp\" alt=\"Testy\" class=\"kb-img wp-image-599\" srcset=\"https:\/\/iseebugs.pl\/wp-content\/uploads\/2024\/10\/tests-1024x585.webp 1024w, https:\/\/iseebugs.pl\/wp-content\/uploads\/2024\/10\/tests-300x171.webp 300w, https:\/\/iseebugs.pl\/wp-content\/uploads\/2024\/10\/tests-768x439.webp 768w, https:\/\/iseebugs.pl\/wp-content\/uploads\/2024\/10\/tests-1536x878.webp 1536w, https:\/\/iseebugs.pl\/wp-content\/uploads\/2024\/10\/tests.webp 1792w\" sizes=\"(max-width: 1024px) 100vw, 1024px\" \/><figcaption>Testy<\/figcaption><\/figure>\n","protected":false},"excerpt":{"rendered":"<p>Korzystaj\u0105c z Maven&#8217;a do zarz\u0105dzania projektem najcz\u0119\u015bciej do uruchamiania test\u00f3w korzystamy z komendy mvn test. Czy ta komenda na pewno uruchomi je wszystkie i czy mo\u017cemy je uruchamia\u0107 jako\u015b inaczej?<\/p>\n","protected":false},"author":1,"featured_media":599,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_kadence_starter_templates_imported_post":false,"footnotes":""},"categories":[51],"tags":[50,48,47,49],"_links":{"self":[{"href":"https:\/\/iseebugs.pl\/index.php\/wp-json\/wp\/v2\/posts\/596"}],"collection":[{"href":"https:\/\/iseebugs.pl\/index.php\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/iseebugs.pl\/index.php\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/iseebugs.pl\/index.php\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/iseebugs.pl\/index.php\/wp-json\/wp\/v2\/comments?post=596"}],"version-history":[{"count":5,"href":"https:\/\/iseebugs.pl\/index.php\/wp-json\/wp\/v2\/posts\/596\/revisions"}],"predecessor-version":[{"id":603,"href":"https:\/\/iseebugs.pl\/index.php\/wp-json\/wp\/v2\/posts\/596\/revisions\/603"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/iseebugs.pl\/index.php\/wp-json\/wp\/v2\/media\/599"}],"wp:attachment":[{"href":"https:\/\/iseebugs.pl\/index.php\/wp-json\/wp\/v2\/media?parent=596"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/iseebugs.pl\/index.php\/wp-json\/wp\/v2\/categories?post=596"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/iseebugs.pl\/index.php\/wp-json\/wp\/v2\/tags?post=596"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}