{"id":407,"date":"2017-07-05T15:00:20","date_gmt":"2017-07-05T13:00:20","guid":{"rendered":"http:\/\/antek.atthost24.pl\/?p=407"},"modified":"2017-07-04T22:29:49","modified_gmt":"2017-07-04T20:29:49","slug":"jak-dobre-sa-twoje-testy-czyli-kilka-slow-o-testowaniu-mutacyjnym","status":"publish","type":"post","link":"https:\/\/blog.lantkowiak.pl\/index.php\/2017\/07\/05\/jak-dobre-sa-twoje-testy-czyli-kilka-slow-o-testowaniu-mutacyjnym\/","title":{"rendered":"Jak dobre s\u0105 Twoje testy? Czyli kilka s\u0142\u00f3w o testowaniu mutacyjnym."},"content":{"rendered":"<p>Za\u0142\u00f3\u017cmy, \u017ce mamy pewn\u0105 aplikacje, o kt\u00f3r\u0105 bardzo si\u0119 troszczymy i robimy wszystko, \u017ceby zapewni\u0107 jak najlepsz\u0105 jako\u015b\u0107 kodu tej\u017ce aplikacji. Pokrycie kodu testami jednostkowymi jest jednym ze sposob\u00f3w, kt\u00f3rego mo\u017cemy u\u017cy\u0107, aby 'zabezpieczy\u0107&#8217; nasz kod przed b\u0142\u0119dami. Dwoimy si\u0119 i troimy, a\u017c w ko\u0144cu udaj\u0119 nam si\u0119 pokry\u0107 nasz kod w 100% i teraz mamy pewno\u015b\u0107, \u017ce \u017caden bug nie wkrad\u0142 si\u0119 do naszej aplikacji! Ale czy na pewno?<\/p>\n<h3>Stw\u00f3rzmy aplikacje, o kt\u00f3r\u0105 zadbamy!<\/h3>\n<p>Zacznijmy od 'zewn\u0119trznego&#8217; serwisu, kt\u00f3ry b\u0119dziemy wstrzykiwa\u0107 do naszej klasy.<\/p>\n<pre class=\"lang:java decode:true \">public interface ExternalService {\r\n    int methodOne();\r\n    int methodTwo();\r\n}<\/pre>\n<p>Teraz stw\u00f3rzmy g\u0142\u00f3wn\u0105 klas\u0119 naszej aplikacji:<\/p>\n<pre class=\"lang:java decode:true \">public class WellTestedClass {\r\n    private final ExternalService externalService;\r\n\r\n    public WellTestedClass(final ExternalService externalService) {\r\n        this.externalService = externalService;\r\n    }\r\n\r\n    public int wellTestedMethod() {\r\n        final int n1 = this.externalService.methodOne();\r\n        final int n2 = this.externalService.methodTwo();\r\n\r\n        if (n1 &gt; n2) {\r\n            return n1 - n2;\r\n        }\r\n        return n1 + n2;\r\n    }\r\n}<\/pre>\n<p>Jak widzimy, nie ma tutaj \u017cadnego 'Rocket Science&#8217; \ud83d\ude42 Pobieramy z zewn\u0119trznego serwisu dwie liczby, a nast\u0119pnie je por\u00f3wnujemy. Je\u017celi pierwsza z nich jest wi\u0119ksza to odejmujemy od niej drug\u0105 liczb\u0119 i otrzyman\u0105 liczb\u0119 zwracamy jako wynik. W przeciwnym przypadku jako rezultat zwracamy sum\u0119 dw\u00f3ch pobranych liczb.<\/p>\n<h4>Pora przetestowa\u0107 nasz\u0105 aplikacje!<\/h4>\n<p>Stw\u00f3rzmy najpierw pomocnicz\u0105 klas\u0119, kt\u00f3ra b\u0119dzie implementowa\u0107 interfejs naszego zewn\u0119trznego serwisu.<\/p>\n<pre class=\"lang:default decode:true \">class ExternalServiceStub implements ExternalService {\r\n    private final int n1;\r\n    private final int n2;\r\n\r\n    ExternalServiceStub(final int n1, final int n2) {\r\n        this.n1 = n1;\r\n        this.n2 = n2;\r\n    }\r\n\r\n    @Override\r\n    public int methodOne() {\r\n        return n1;\r\n    }\r\n\r\n    @Override\r\n    public int methodTwo() {\r\n        return n2;\r\n    }\r\n}<\/pre>\n<p>I teraz pierwsza metoda testowa:<\/p>\n<pre class=\"lang:java decode:true \">@Test\r\npublic void wellTestedMethod1() throws Exception {\r\n    \/\/ given\r\n    final WellTestedClass wellTestedClass = new WellTestedClass(new ExternalServiceStub(4, 3));\r\n\r\n    \/\/ when\r\n    final int result = wellTestedClass.wellTestedMethod();\r\n\r\n    \/\/ then\r\n    assertThat(result).isEqualTo(4 - 3);\r\n}<\/pre>\n<p>W powy\u017cszej metodzie testowej sprawdzili\u015bmy pierwszy przypadek, czyli sytuacje gdzie pierwsza pobrana liczba z zewn\u0119trznego serwisu jest wi\u0119ksza od kolejnej.<\/p>\n<p>Teraz pora na drugi przypadek:<\/p>\n<pre class=\"lang:java decode:true \">@Test\r\npublic void wellTestedMethod2() throws Exception {\r\n    \/\/ given\r\n    final WellTestedClass wellTestedClass = new WellTestedClass(new ExternalServiceStub(3, 4));\r\n\r\n    \/\/ when\r\n    final int result = wellTestedClass.wellTestedMethod();\r\n\r\n    \/\/ then\r\n    assertThat(result).isEqualTo(3 + 4);\r\n}<\/pre>\n<p>Tutaj pokryli\u015bmy drugi przypadek, czyli sytuacje gdy druga liczba jest wi\u0119ksza od pierwszej.<\/p>\n<p>Wygl\u0105da na to, \u017ce pokryli\u015bmy wszystkie 'branche&#8217; i nasz kod jest w pe\u0142ni przetestowany, ale sk\u0105d mamy wiedzie\u0107 jak dobre s\u0105 nasze testy jednostkowe?<\/p>\n<h3>Testy mutacyjne<\/h3>\n<p>Tutaj w pomoc\u0105 przychodz\u0105 nam testy mutacyjne. Czym zatem s\u0105 owe testy? Jest to technika polegaj\u0105ca na wprowadzaniu ma\u0142ych i losowych zmian w kodzie naszej aplikacji. Zmiany te powinny zosta\u0107 wykryte przez nasze testy jednostkowe. Je\u017celi, kt\u00f3ra\u015b ze zmian nie zosta\u0142a wykryta oznacza to, \u017ce nasze testy mog\u0105 nie by\u0107 tak dobre jak nam si\u0119 wydawa\u0142o \ud83d\ude09<\/p>\n<h4>Jakie zmiany?<\/h4>\n<p>Poni\u017cej znajduj\u0119 si\u0119 lista z przyk\u0142adowymi zmianami, kt\u00f3re mog\u0105 zosta\u0107 wprowadzone w naszym kodzie.<\/p>\n<ul>\n<li>Zmiana granicy w warunkach, np. <em>&gt;<\/em> zostanie zmienione na <em>&gt;=<\/em>, <em>&gt;=<\/em> na <em>&gt;<\/em>, itd.<\/li>\n<li>Negacja warunk\u00f3w, np. <em>==<\/em> zostanie zmienione na <em>!=<\/em>, <em>&lt;=<\/em> na <em>&gt;<\/em>, itd.<\/li>\n<li>Usuni\u0119cie warunk\u00f3w i zast\u0105pienie ich sta\u0142\u0105 warto\u015bci\u0105, np. <em>a &gt; b<\/em> zostanie zmienione na <em>true<\/em><\/li>\n<li>Zmiana operacji matematycznych, np. dodawanie zostanie zamienione na odejmowanie, a mno\u017cenie na dzielenie<\/li>\n<li>Zmiana warto\u015bci zmiennych na warto\u015bci defaultowe lub sta\u0142e, np. <em>int<\/em> zostanie ustawiony na <em>0<\/em> lub inn\u0105 losow\u0105 warto\u015b\u0107<\/li>\n<li>Zwr\u00f3cenie <em>null<\/em> zamiast obiektu<\/li>\n<li>Pomini\u0119cie wywo\u0142ania metody typu void<\/li>\n<\/ul>\n<p>W\u0142a\u015bnie zapoznali\u015bmy si\u0119 z przyk\u0142adowymi modyfikacja, kt\u00f3re mog\u0105 zosta\u0107 wprowadzone do naszej aplikacji podczas test\u00f3w mutacyjnych. Nasze testy jednostkowe powinny by\u0107 napisane w taki spos\u00f3b, aby zmiany te spowodowa\u0142y to, \u017ce nasze testy nie przejd\u0105.<\/p>\n<h3>Testy mutacyjne w praktyce<\/h3>\n<p>Wr\u00f3\u0107my teraz do naszego kodu, kt\u00f3ry napisali\u015bmy na pocz\u0105tku i spr\u00f3bujmy przeprowadzi\u0107 testy mutacyjne. Z pomoc\u0105 przyjdzie nam biblioteka\u00a0<a href=\"http:\/\/pitest.org\/\">PIT<\/a>!<\/p>\n<h4>Konfiguracja<\/h4>\n<p>Konfiguracja i uruchomienie PIT s\u0105 banalnie proste! Pierwsze co musimy zrobi\u0107 to doda\u0107 plugin do naszego poma:<\/p>\n<pre class=\"lang:xhtml decode:true \">&lt;plugin&gt;\r\n    &lt;groupId&gt;org.pitest&lt;\/groupId&gt;\r\n    &lt;artifactId&gt;pitest-maven&lt;\/artifactId&gt;\r\n    &lt;version&gt;1.2.0&lt;\/version&gt;\r\n&lt;\/plugin&gt;<\/pre>\n<p>Domy\u015blnie wszystkie klasy z naszej aplikacji zostan\u0105 poddane testom mutacyjnym. Je\u017celi chcemy to zmieni\u0107 to mo\u017cemy skonfigurowa\u0107 pakiety klas\/test\u00f3w, kt\u00f3re b\u0119d\u0105 wzi\u0119te pod uwag\u0119.<\/p>\n<pre class=\"lang:default decode:true \">&lt;plugin&gt;\r\n    &lt;groupId&gt;org.pitest&lt;\/groupId&gt;\r\n    &lt;artifactId&gt;pitest-maven&lt;\/artifactId&gt;\r\n    &lt;version&gt;1.2.0&lt;\/version&gt;\r\n    &lt;configuration&gt;\r\n        &lt;targetClasses&gt;\r\n            &lt;param&gt;pl.lantkowiak.*&lt;\/param&gt;\r\n        &lt;\/targetClasses&gt;\r\n        &lt;targetTests&gt;\r\n            &lt;param&gt;pl.lantkowiak.*&lt;\/param&gt;\r\n        &lt;\/targetTests&gt;\r\n    &lt;\/configuration&gt;\r\n&lt;\/plugin&gt;<\/pre>\n<h4>Uruchomienie<\/h4>\n<p>Aby przeprowadzi\u0107 testy mutacyjne wystarczy wywo\u0142a\u0107 nast\u0119puj\u0105ce polecenie:<\/p>\n<pre class=\"lang:default decode:true \">mvn org.pitest:pitest-maven:mutationCoverage<\/pre>\n<p>Gdy operacja zako\u0144czy si\u0119 sukcesem zostanie wygenerowany raport z wynikami. Znajduje si\u0119 on pod nast\u0119puj\u0105c\u0105 \u015bcie\u017ck\u0105:\u00a0target\/pit-reports\/yyyyMMddHHmm.<\/p>\n<h4>Zmutujmy nasz\u0105 aplikacje!<\/h4>\n<p>Pora wr\u00f3ci\u0107 do naszej aplikacji i wykona\u0107 na niej testy mutacyjne \ud83d\ude42<\/p>\n<p>Po zako\u0144czeniu test\u00f3w otrzymamy wygenerowany raport.<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-full wp-image-412\" src=\"http:\/\/antek.atthost24.pl\/wp-content\/uploads\/2017\/07\/pit1.png\" alt=\"\" width=\"728\" height=\"330\" srcset=\"https:\/\/blog.lantkowiak.pl\/wp-content\/uploads\/2017\/07\/pit1.png 728w, https:\/\/blog.lantkowiak.pl\/wp-content\/uploads\/2017\/07\/pit1-300x136.png 300w\" sizes=\"auto, (max-width: 728px) 100vw, 728px\" \/><\/p>\n<p>Mo\u017cemy z niego wyczyta\u0107, \u017ce nasz kod jest w pe\u0142ni pokryty przez nasze testy jednostkowe (Line Coverage). Mo\u017cemy r\u00f3wnie\u017c zobaczy\u0107 troch\u0119 czerwonego koloru przy pokryciu mutacyjnych test\u00f3w, a jak mo\u017cemy si\u0119 domy\u015bla\u0107 czerwony kolor nie oznacza nic dobrego \ud83d\ude09<\/p>\n<p>Po wklikaniu si\u0119 troch\u0119 g\u0142\u0119biej b\u0119dziemy mogli zobaczy\u0107 poni\u017cszy ekran.<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-full wp-image-413\" src=\"http:\/\/antek.atthost24.pl\/wp-content\/uploads\/2017\/07\/pit2.png\" alt=\"\" width=\"717\" height=\"882\" srcset=\"https:\/\/blog.lantkowiak.pl\/wp-content\/uploads\/2017\/07\/pit2.png 717w, https:\/\/blog.lantkowiak.pl\/wp-content\/uploads\/2017\/07\/pit2-244x300.png 244w\" sizes=\"auto, (max-width: 717px) 100vw, 717px\" \/><\/p>\n<p>Mo\u017cemy na nim zobaczy\u0107, kt\u00f3ra linia naszego programu nie jest wystarczaj\u0105co dobrze przetestowana, a poni\u017cej list\u0119 mutacji, kt\u00f3re zosta\u0142y przeprowadzone w poszczeg\u00f3lnych liniach kodu. Na zielono s\u0105 zaznaczone mutacje, kt\u00f3re zosta\u0142y wykryte przez testy, natomiast na czerwono mutacje, kt\u00f3re prze\u017cy\u0142y i nasze testy ich nie wychwyci\u0142y.<\/p>\n<p>W naszym przypadku nie zosta\u0142a wychwycona zmiana warunku w if&#8217;ie z <em>&gt;<\/em> na <em>&gt;=<\/em>. Czyli w tym przypadku zosta\u0142 wykryty warunek brzegowy, kt\u00f3ry nie zosta\u0142 sprawdzony w testach.<\/p>\n<p>Poprawy w takim razie nasz drugi test tak, aby pokry\u0142 warunek brzegowy.<\/p>\n<pre class=\"lang:java decode:true\">@Test\r\npublic void wellTestedMethod2() throws Exception {\r\n    \/\/ given\r\n    final WellTestedClass wellTestedClass = new WellTestedClass(new ExternalServiceStub(3, 3));\r\n\r\n    \/\/ when\r\n    final int result = wellTestedClass.wellTestedMethod();\r\n\r\n    \/\/ then\r\n    assertThat(result).isEqualTo(3 + 3);\r\n}<\/pre>\n<p>Po tej modyfikacji \u017cadne mutacje nam nie straszne i nasze testy mutacyjne przejd\u0105 na zielono \ud83d\ude42<\/p>\n<h3>Podsumowanie<\/h3>\n<p>Dzisiaj zapoznali\u015bmy si\u0119 z podstawami test\u00f3w mutacyjnych. Testy te mog\u0105 nam pom\u00f3c w sprawdzeniu jak dobre s\u0105 nasze testy jednostkowe. Sama koncepcja test\u00f3w mutacyjnych nie jest niczym nowym, ale dopiero stosunkowo od niedawna jest u\u017cywana w praktyce, poniewa\u017c testy mutacyjne s\u0105 dosy\u0107 kosztowne i wymagaj\u0105 sporej czasu procesora, \u017ceby przeprowadzi\u0107 wszystkie kombinacje mutacji i dopiero od niedawna nasze komputery s\u0105 na tyle szybkie, \u017ceby robi\u0107 to w rozs\u0105dnym czasie \ud83d\ude42<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Za\u0142\u00f3\u017cmy, \u017ce mamy pewn\u0105 aplikacje, o kt\u00f3r\u0105 bardzo si\u0119 troszczymy i robimy wszystko, \u017ceby zapewni\u0107 jak najlepsz\u0105 jako\u015b\u0107 kodu tej\u017ce aplikacji. Pokrycie kodu testami jednostkowymi jest jednym ze&#8230;<\/p>\n","protected":false},"author":1,"featured_media":410,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[7,25],"tags":[8,26,29,28,27],"class_list":["post-407","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-java","category-testowanie","tag-java","tag-mutation-testing","tag-pit","tag-testowanie","tag-testowanie-mutacyjne"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v21.4 - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>Jak dobre s\u0105 Twoje testy? Czyli kilka s\u0142\u00f3w o testowaniu mutacyjnym. - Lukasz Antkowiak&#039;s blog<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/blog.lantkowiak.pl\/index.php\/2017\/07\/05\/jak-dobre-sa-twoje-testy-czyli-kilka-slow-o-testowaniu-mutacyjnym\/\" \/>\n<meta property=\"og:locale\" content=\"pl_PL\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Jak dobre s\u0105 Twoje testy? Czyli kilka s\u0142\u00f3w o testowaniu mutacyjnym. - Lukasz Antkowiak&#039;s blog\" \/>\n<meta property=\"og:description\" content=\"Za\u0142\u00f3\u017cmy, \u017ce mamy pewn\u0105 aplikacje, o kt\u00f3r\u0105 bardzo si\u0119 troszczymy i robimy wszystko, \u017ceby zapewni\u0107 jak najlepsz\u0105 jako\u015b\u0107 kodu tej\u017ce aplikacji. Pokrycie kodu testami jednostkowymi jest jednym ze...\" \/>\n<meta property=\"og:url\" content=\"https:\/\/blog.lantkowiak.pl\/index.php\/2017\/07\/05\/jak-dobre-sa-twoje-testy-czyli-kilka-slow-o-testowaniu-mutacyjnym\/\" \/>\n<meta property=\"og:site_name\" content=\"Lukasz Antkowiak&#039;s blog\" \/>\n<meta property=\"article:published_time\" content=\"2017-07-05T13:00:20+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2017-07-04T20:29:49+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/blog.lantkowiak.pl\/wp-content\/uploads\/2017\/07\/mutation-1.jpg\" \/>\n\t<meta property=\"og:image:width\" content=\"700\" \/>\n\t<meta property=\"og:image:height\" content=\"394\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/jpeg\" \/>\n<meta name=\"author\" content=\"\u0141ukasz Antkowiak\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Napisane przez\" \/>\n\t<meta name=\"twitter:data1\" content=\"\u0141ukasz Antkowiak\" \/>\n\t<meta name=\"twitter:label2\" content=\"Szacowany czas czytania\" \/>\n\t<meta name=\"twitter:data2\" content=\"6 minut\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"WebPage\",\"@id\":\"https:\/\/blog.lantkowiak.pl\/index.php\/2017\/07\/05\/jak-dobre-sa-twoje-testy-czyli-kilka-slow-o-testowaniu-mutacyjnym\/\",\"url\":\"https:\/\/blog.lantkowiak.pl\/index.php\/2017\/07\/05\/jak-dobre-sa-twoje-testy-czyli-kilka-slow-o-testowaniu-mutacyjnym\/\",\"name\":\"Jak dobre s\u0105 Twoje testy? Czyli kilka s\u0142\u00f3w o testowaniu mutacyjnym. - Lukasz Antkowiak&#039;s blog\",\"isPartOf\":{\"@id\":\"https:\/\/blog.lantkowiak.pl\/#website\"},\"datePublished\":\"2017-07-05T13:00:20+00:00\",\"dateModified\":\"2017-07-04T20:29:49+00:00\",\"author\":{\"@id\":\"https:\/\/blog.lantkowiak.pl\/#\/schema\/person\/009bfc4db220c225786c59b1748ba1e6\"},\"breadcrumb\":{\"@id\":\"https:\/\/blog.lantkowiak.pl\/index.php\/2017\/07\/05\/jak-dobre-sa-twoje-testy-czyli-kilka-slow-o-testowaniu-mutacyjnym\/#breadcrumb\"},\"inLanguage\":\"pl-PL\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/blog.lantkowiak.pl\/index.php\/2017\/07\/05\/jak-dobre-sa-twoje-testy-czyli-kilka-slow-o-testowaniu-mutacyjnym\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/blog.lantkowiak.pl\/index.php\/2017\/07\/05\/jak-dobre-sa-twoje-testy-czyli-kilka-slow-o-testowaniu-mutacyjnym\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Strona g\u0142\u00f3wna\",\"item\":\"https:\/\/blog.lantkowiak.pl\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Jak dobre s\u0105 Twoje testy? Czyli kilka s\u0142\u00f3w o testowaniu mutacyjnym.\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/blog.lantkowiak.pl\/#website\",\"url\":\"https:\/\/blog.lantkowiak.pl\/\",\"name\":\"Lukasz Antkowiak&#039;s blog\",\"description\":\"\",\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/blog.lantkowiak.pl\/?s={search_term_string}\"},\"query-input\":\"required name=search_term_string\"}],\"inLanguage\":\"pl-PL\"},{\"@type\":\"Person\",\"@id\":\"https:\/\/blog.lantkowiak.pl\/#\/schema\/person\/009bfc4db220c225786c59b1748ba1e6\",\"name\":\"\u0141ukasz Antkowiak\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"pl-PL\",\"@id\":\"https:\/\/blog.lantkowiak.pl\/#\/schema\/person\/image\/\",\"url\":\"https:\/\/secure.gravatar.com\/avatar\/e18e2bfe319da9b5757cf7f7ae1bfecf?s=96&d=monsterid&r=g\",\"contentUrl\":\"https:\/\/secure.gravatar.com\/avatar\/e18e2bfe319da9b5757cf7f7ae1bfecf?s=96&d=monsterid&r=g\",\"caption\":\"\u0141ukasz Antkowiak\"},\"description\":\"dd\",\"url\":\"https:\/\/blog.lantkowiak.pl\/index.php\/author\/antek\/\"}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"Jak dobre s\u0105 Twoje testy? Czyli kilka s\u0142\u00f3w o testowaniu mutacyjnym. - Lukasz Antkowiak&#039;s blog","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/blog.lantkowiak.pl\/index.php\/2017\/07\/05\/jak-dobre-sa-twoje-testy-czyli-kilka-slow-o-testowaniu-mutacyjnym\/","og_locale":"pl_PL","og_type":"article","og_title":"Jak dobre s\u0105 Twoje testy? Czyli kilka s\u0142\u00f3w o testowaniu mutacyjnym. - Lukasz Antkowiak&#039;s blog","og_description":"Za\u0142\u00f3\u017cmy, \u017ce mamy pewn\u0105 aplikacje, o kt\u00f3r\u0105 bardzo si\u0119 troszczymy i robimy wszystko, \u017ceby zapewni\u0107 jak najlepsz\u0105 jako\u015b\u0107 kodu tej\u017ce aplikacji. Pokrycie kodu testami jednostkowymi jest jednym ze...","og_url":"https:\/\/blog.lantkowiak.pl\/index.php\/2017\/07\/05\/jak-dobre-sa-twoje-testy-czyli-kilka-slow-o-testowaniu-mutacyjnym\/","og_site_name":"Lukasz Antkowiak&#039;s blog","article_published_time":"2017-07-05T13:00:20+00:00","article_modified_time":"2017-07-04T20:29:49+00:00","og_image":[{"width":700,"height":394,"url":"https:\/\/blog.lantkowiak.pl\/wp-content\/uploads\/2017\/07\/mutation-1.jpg","type":"image\/jpeg"}],"author":"\u0141ukasz Antkowiak","twitter_card":"summary_large_image","twitter_misc":{"Napisane przez":"\u0141ukasz Antkowiak","Szacowany czas czytania":"6 minut"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"WebPage","@id":"https:\/\/blog.lantkowiak.pl\/index.php\/2017\/07\/05\/jak-dobre-sa-twoje-testy-czyli-kilka-slow-o-testowaniu-mutacyjnym\/","url":"https:\/\/blog.lantkowiak.pl\/index.php\/2017\/07\/05\/jak-dobre-sa-twoje-testy-czyli-kilka-slow-o-testowaniu-mutacyjnym\/","name":"Jak dobre s\u0105 Twoje testy? Czyli kilka s\u0142\u00f3w o testowaniu mutacyjnym. - Lukasz Antkowiak&#039;s blog","isPartOf":{"@id":"https:\/\/blog.lantkowiak.pl\/#website"},"datePublished":"2017-07-05T13:00:20+00:00","dateModified":"2017-07-04T20:29:49+00:00","author":{"@id":"https:\/\/blog.lantkowiak.pl\/#\/schema\/person\/009bfc4db220c225786c59b1748ba1e6"},"breadcrumb":{"@id":"https:\/\/blog.lantkowiak.pl\/index.php\/2017\/07\/05\/jak-dobre-sa-twoje-testy-czyli-kilka-slow-o-testowaniu-mutacyjnym\/#breadcrumb"},"inLanguage":"pl-PL","potentialAction":[{"@type":"ReadAction","target":["https:\/\/blog.lantkowiak.pl\/index.php\/2017\/07\/05\/jak-dobre-sa-twoje-testy-czyli-kilka-slow-o-testowaniu-mutacyjnym\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/blog.lantkowiak.pl\/index.php\/2017\/07\/05\/jak-dobre-sa-twoje-testy-czyli-kilka-slow-o-testowaniu-mutacyjnym\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Strona g\u0142\u00f3wna","item":"https:\/\/blog.lantkowiak.pl\/"},{"@type":"ListItem","position":2,"name":"Jak dobre s\u0105 Twoje testy? Czyli kilka s\u0142\u00f3w o testowaniu mutacyjnym."}]},{"@type":"WebSite","@id":"https:\/\/blog.lantkowiak.pl\/#website","url":"https:\/\/blog.lantkowiak.pl\/","name":"Lukasz Antkowiak&#039;s blog","description":"","potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/blog.lantkowiak.pl\/?s={search_term_string}"},"query-input":"required name=search_term_string"}],"inLanguage":"pl-PL"},{"@type":"Person","@id":"https:\/\/blog.lantkowiak.pl\/#\/schema\/person\/009bfc4db220c225786c59b1748ba1e6","name":"\u0141ukasz Antkowiak","image":{"@type":"ImageObject","inLanguage":"pl-PL","@id":"https:\/\/blog.lantkowiak.pl\/#\/schema\/person\/image\/","url":"https:\/\/secure.gravatar.com\/avatar\/e18e2bfe319da9b5757cf7f7ae1bfecf?s=96&d=monsterid&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/e18e2bfe319da9b5757cf7f7ae1bfecf?s=96&d=monsterid&r=g","caption":"\u0141ukasz Antkowiak"},"description":"dd","url":"https:\/\/blog.lantkowiak.pl\/index.php\/author\/antek\/"}]}},"_links":{"self":[{"href":"https:\/\/blog.lantkowiak.pl\/index.php\/wp-json\/wp\/v2\/posts\/407","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/blog.lantkowiak.pl\/index.php\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/blog.lantkowiak.pl\/index.php\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/blog.lantkowiak.pl\/index.php\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/blog.lantkowiak.pl\/index.php\/wp-json\/wp\/v2\/comments?post=407"}],"version-history":[{"count":4,"href":"https:\/\/blog.lantkowiak.pl\/index.php\/wp-json\/wp\/v2\/posts\/407\/revisions"}],"predecessor-version":[{"id":415,"href":"https:\/\/blog.lantkowiak.pl\/index.php\/wp-json\/wp\/v2\/posts\/407\/revisions\/415"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/blog.lantkowiak.pl\/index.php\/wp-json\/wp\/v2\/media\/410"}],"wp:attachment":[{"href":"https:\/\/blog.lantkowiak.pl\/index.php\/wp-json\/wp\/v2\/media?parent=407"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/blog.lantkowiak.pl\/index.php\/wp-json\/wp\/v2\/categories?post=407"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/blog.lantkowiak.pl\/index.php\/wp-json\/wp\/v2\/tags?post=407"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}