{"id":998,"date":"2020-10-02T20:22:47","date_gmt":"2020-10-02T20:22:47","guid":{"rendered":"https:\/\/www.juniorjavadeveloper.pl\/?p=998"},"modified":"2023-11-26T18:20:50","modified_gmt":"2023-11-26T18:20:50","slug":"po-co-w-ogole-testowac-kod-aplikacji-mbank-robi-to-na-produkcji","status":"publish","type":"post","link":"https:\/\/www.juniorjavadeveloper.pl\/en\/2020\/10\/02\/po-co-w-ogole-testowac-kod-aplikacji-mbank-robi-to-na-produkcji\/","title":{"rendered":"Why test your application code at all? mBank does it in production! A practical example of JUnit test"},"content":{"rendered":"<p class=\"has-large-font-size wp-block-paragraph\">In this article, I will describe why testing application code is so important, describe how to create different types of tests, and show an example of a JUnit test for Java. I always say, if you want to sleep soundly, write application code tests. By tests I mean various types of tests, e.g. unit tests, integration tests, automatic and manual tests. There are several techniques for writing tests.<\/p>\n\n\n    <style>\r\n        .wpj-jtoc.--jtoc-theme-basic-light.--jtoc-has-custom-styles {\r\n            --jtoc-numeration-suffix: \". \";\n--jtoc-numeration-color: #adadad;\n        }\r\n\r\n            <\/style>\r\n\r\n\r\n\r\n<div id=\"wpj-jtoc\" class=\"wpj-jtoc wpj-jtoc--main --jtoc-the-content --jtoc-theme-basic-light --jtoc-title-align-left --jtoc-toggle-icon --jtoc-toggle-position-right --jtoc-toggle-1 --jtoc-has-numeration --jtoc-has-custom-styles --jtoc-is-unfolded\" >\r\n\r\n    \r\n    <!-- TOC -->\r\n    <div class=\"wpj-jtoc--toc\">\r\n                                <div class=\"wpj-jtoc--header\">\r\n                <div class=\"wpj-jtoc--header-main\">\r\n                                        <div class=\"wpj-jtoc--title\">\r\n                        <span class=\"wpj-jtoc--title-label\">Table of Contents<\/span>\r\n                    <\/div>\r\n                                                                <div class=\"wpj-jtoc--toggle-wrap\">\r\n                                                                                                                    <div class=\"wpj-jtoc--toggle-box\">\r\n                                    <div class=\"wpj-jtoc--toggle\"><\/div>\r\n                                <\/div>\r\n                                                    <\/div>\r\n                                    <\/div>\r\n            <\/div>\r\n                            <div class=\"wpj-jtoc--body\">\r\n                        <nav class=\"wpj-jtoc--nav\">\r\n                <ol class=\"wpj-jtoc--items\"><li class=\"wpj-jtoc--item --jtoc-h2\">\r\n        <div class=\"wpj-jtoc--item-content\" data-depth=\"2\">\r\n                <a href=\"#wstep\" title=\"Preface\" data-numeration=\"1\">Preface<\/a>\r\n                    <\/div> <\/li><li class=\"wpj-jtoc--item --jtoc-h2\">\r\n        <div class=\"wpj-jtoc--item-content\" data-depth=\"2\">\r\n                <a href=\"#techniki-pisania-testow\" title=\"Techniques for writing tests\" data-numeration=\"2\">Techniques for writing tests<\/a>\r\n                    <\/div> <ol class=\"wpj-jtoc--items\"><li class=\"wpj-jtoc--item --jtoc-h3\">\r\n        <div class=\"wpj-jtoc--item-content\" data-depth=\"3\">\r\n                <a href=\"#tdd-test-driven-development\" title=\"TDD \u2013 Test Driven Development\" data-numeration=\"2.1\">TDD \u2013 Test Driven Development<\/a>\r\n                    <\/div> <\/li><li class=\"wpj-jtoc--item --jtoc-h3\">\r\n        <div class=\"wpj-jtoc--item-content\" data-depth=\"3\">\r\n                <a href=\"#technika-dopisywania-testow\" title=\"\u201cTechnika\u201d dopisywania test\u00f3w\" data-numeration=\"2.2\">\u201cTechnika\u201d dopisywania test\u00f3w<\/a>\r\n                    <\/div> <\/li><\/ol><\/li><li class=\"wpj-jtoc--item --jtoc-h2\">\r\n        <div class=\"wpj-jtoc--item-content\" data-depth=\"2\">\r\n                <a href=\"#po-co-pisac-testy\" title=\"Why write tests?\" data-numeration=\"3\">Why write tests?<\/a>\r\n                    <\/div> <\/li><li class=\"wpj-jtoc--item --jtoc-h2\">\r\n        <div class=\"wpj-jtoc--item-content\" data-depth=\"2\">\r\n                <a href=\"#kto-pisze-testy\" title=\"Who writes the tests?\" data-numeration=\"4\">Who writes the tests?<\/a>\r\n                    <\/div> <ol class=\"wpj-jtoc--items\"><li class=\"wpj-jtoc--item --jtoc-h3\">\r\n        <div class=\"wpj-jtoc--item-content\" data-depth=\"3\">\r\n                <a href=\"#programista\" title=\"Programmer\" data-numeration=\"4.1\">Programmer<\/a>\r\n                    <\/div> <\/li><li class=\"wpj-jtoc--item --jtoc-h3\">\r\n        <div class=\"wpj-jtoc--item-content\" data-depth=\"3\">\r\n                <a href=\"#tester\" title=\"Tester\" data-numeration=\"4.2\">Tester<\/a>\r\n                    <\/div> <\/li><\/ol><\/li><li class=\"wpj-jtoc--item --jtoc-h2\">\r\n        <div class=\"wpj-jtoc--item-content\" data-depth=\"2\">\r\n                <a href=\"#kategorie-testow\" title=\"Test categories\" data-numeration=\"5\">Test categories<\/a>\r\n                    <\/div> <ol class=\"wpj-jtoc--items\"><li class=\"wpj-jtoc--item --jtoc-h3\">\r\n        <div class=\"wpj-jtoc--item-content\" data-depth=\"3\">\r\n                <a href=\"#testy-manualne\" title=\"Manual tests\" data-numeration=\"5.1\">Manual tests<\/a>\r\n                    <\/div> <\/li><li class=\"wpj-jtoc--item --jtoc-h3\">\r\n        <div class=\"wpj-jtoc--item-content\" data-depth=\"3\">\r\n                <a href=\"#testy-automatyczne\" title=\"Automatic tests\" data-numeration=\"5.2\">Automatic tests<\/a>\r\n                    <\/div> <\/li><\/ol><\/li><li class=\"wpj-jtoc--item --jtoc-h2\">\r\n        <div class=\"wpj-jtoc--item-content\" data-depth=\"2\">\r\n                <a href=\"#junit-test-praktyczny-przyklad\" title=\"JUnit test \u2013 practical example\" data-numeration=\"6\">JUnit test \u2013 practical example<\/a>\r\n                    <\/div> <ol class=\"wpj-jtoc--items\"><li class=\"wpj-jtoc--item --jtoc-h3\">\r\n        <div class=\"wpj-jtoc--item-content\" data-depth=\"3\">\r\n                <a href=\"#test-jednostkowy-co-testowac\" title=\"Unit test \u2013 what to test?\" data-numeration=\"6.1\">Unit test \u2013 what to test?<\/a>\r\n                    <\/div> <\/li><li class=\"wpj-jtoc--item --jtoc-h3\">\r\n        <div class=\"wpj-jtoc--item-content\" data-depth=\"3\">\r\n                <a href=\"#test-jednostkowy-jak-testowac\" title=\"Unit test \u2013 how to test?\" data-numeration=\"6.2\">Unit test \u2013 how to test?<\/a>\r\n                    <\/div> <\/li><li class=\"wpj-jtoc--item --jtoc-h3\">\r\n        <div class=\"wpj-jtoc--item-content\" data-depth=\"3\">\r\n                <a href=\"#test-integracyjny\" title=\"Integration test\" data-numeration=\"6.3\">Integration test<\/a>\r\n                    <\/div> <\/li><\/ol><\/li><li class=\"wpj-jtoc--item --jtoc-h2\">\r\n        <div class=\"wpj-jtoc--item-content\" data-depth=\"2\">\r\n                <a href=\"#piramida-testow\" title=\"Test pyramid\" data-numeration=\"7\">Test pyramid<\/a>\r\n                    <\/div> <\/li><\/ol>            <\/nav>\r\n                    <\/div>\r\n    <\/div>\r\n<\/div>\r\n\n\n\n<h2 class=\"wp-block-heading joli-heading jtoc-heading\" id=\"wstep\">Preface<\/h2>\n\n\n\n<p class=\"has-large-font-size wp-block-paragraph translation-block\">People are divided into those who write the tests and those who will write them. We all know what the production application tests performed by mBank looked like - <a href=\"https:\/\/niebezpiecznik.pl\/post\/mbank-testowal-na-produkcji-i-wylozyl-sobie-cala-infrastrukture\/\" target=\"_blank \" rel=\"noreferrer noopener\">niebezpiecznik.pl<\/a> (5\/8\/2020) \u2013 we don't do that, we want to avoid it.<\/p>\n\n\n\n<h2 class=\"wp-block-heading joli-heading jtoc-heading\" id=\"techniki-pisania-testow\">Techniques for writing tests<\/h2>\n\n\n\n<p class=\"has-large-font-size wp-block-paragraph\">At the beginning I mentioned different types of tests, I will discuss them in more detail later. Various test writing techniques can be added to the test types.<\/p>\n\n\n\n<h3 class=\"wp-block-heading joli-heading jtoc-heading\" id=\"tdd-test-driven-development\">TDD &ndash; Test Driven Development<\/h3>\n\n\n\n<p class=\"has-large-font-size wp-block-paragraph\">Najpopularniejsz&#261; technik&#261; pisania test&oacute;w jest <a href=\"https:\/\/en.wikipedia.org\/wiki\/Test-driven_development\" target=\"_blank\" rel=\"noreferrer noopener\">Test Driven Developmnet &ndash; TDD<\/a>. Technika TDD zak&#322;ada w pierwszej kolejno&#347;ci pisanie test&oacute;w, a nast&#281;pnie pisanie w&#322;a&#347;ciwej klasy, kt&oacute;r&#261; testujemy. Dzi&#281;ki temu wymuszamy pisanie test&oacute;w do tworzonego kodu. TDD wyrabia dobry nawyk dzi&#281;ki, kt&oacute;remu nasz kod &#378;r&oacute;d&#322;owy &ldquo;od razu&rdquo; posiada testy. Polecam ksi&#261;&#380;k&#281; <a href=\"https:\/\/helion.pl\/view\/20365c\/tddszv_ebook.htm\" data-type=\"link\" data-id=\"https:\/\/helion.pl\/view\/20365c\/tddszv_ebook.htm\" target=\"_blank\" rel=\"noreferrer noopener\">TDD. Sztuka tworzenia dobrego kodu<\/a>.<\/p>\n\n\n\n<h3 class=\"wp-block-heading joli-heading jtoc-heading\" id=\"technika-dopisywania-testow\">&ldquo;Technika&rdquo; dopisywania test&oacute;w<\/h3>\n\n\n\n<p class=\"has-large-font-size wp-block-paragraph\">Kolejn&#261; &ldquo;technik&#261;&rdquo; pisania test&oacute;w jest dodawanie test&oacute;w do ju&#380; istniej&#261;cego kodu &#378;r&oacute;d&#322;owego w trakcie refaktoryzacji lub z powodu braku test&oacute;w. Nie jest, to idealne rozwi&#261;zanie, ale tworzenie test&oacute;w nawet dla istniej&#261;cego kodu jest lepszym rozwi&#261;zaniem ni&#380; brak test&oacute;w. Proces refaktoryzacji wspartej TDD jest opisany w &ldquo;Rozdzia&#322; 31. Refaktoryzacja&rdquo; w ksi&#261;&#380;ce <a href=\"https:\/\/helion.pl\/view\/20365c\/tddszv_ebook.htm\" data-type=\"link\" data-id=\"https:\/\/helion.pl\/view\/20365c\/tddszv_ebook.htm\" target=\"_blank\" rel=\"noreferrer noopener\">TDD. Sztuka tworzenia dobrego kodu<\/a>.<\/p>\n\n\n\n<h2 class=\"wp-block-heading joli-heading jtoc-heading\" id=\"po-co-pisac-testy\">Why write tests?<\/h2>\n\n\n\n<p class=\"has-large-font-size wp-block-paragraph\">Let me start by saying that the lack of tests may indicate that we do not understand the source code being created, because good tests require knowledge of the code we are testing. If we understand the code we are testing, it means we will be able to modify it. I often tell my students that if you want to sleep soundly, write unit tests. My colleague will think ten times before modifying our code, because the tests may stop working and will have to be corrected. <\/p>\n\n\n\n<p class=\"has-large-font-size wp-block-paragraph translation-block\">The only constant thing in code is code variability. Tests allow you to modify existing code without worrying that your change will break something in the code. If this is the case, the tests will show such an error and we will be able to detect and correct such an error already at the stage of code creation, not in production. We will avoid the situation with our favorite mBank \u2013 <a href=\"https:\/\/niebezpiecznik.pl\/post\/powazna-wpadka-mbanku-klienci-mieli-wglad-w-cudze-rachunki\/\" target=\"_blank\" rel=\"noreferrer noopener\">niebezpiecznik.pl<\/a> (5\/8\/2020).<\/p>\n\n\n\n<h2 class=\"wp-block-heading joli-heading jtoc-heading\" id=\"kto-pisze-testy\">Who writes the tests?<\/h2>\n\n\n\n<p class=\"has-large-font-size wp-block-paragraph\">W procesie tworzenia test&oacute;w nale&#380;y wyr&oacute;&#380;ni&#263; programist&oacute;w oraz tester&oacute;w. Dlaczego nie wystarcz&#261; testy pisane przez programist&oacute;w? Powod&oacute;w jest kilka, pierwszym z nich jest to, &#380;e programista testuj&#261;c sw&oacute;j kod wie jakie warunki i miejsca omija&#263; w testowanym kodzie, no i oczywi&#347;cie, kto b&#281;dzie znajdowa&#322; b&#322;&#281;dy w swoim idealnym kodzie? Testerzy cz&#281;sto tworz&#261; testy dla os&oacute;b nietechnicznych, kt&oacute;re chc&#261; zweryfikowa&#263; jak dzia&#322;a zamawiane oprogramowanie. Dodatkowo tester &ldquo;dostaje wynagrodzenie&rdquo; za znalezienie jak najwi&#281;kszej liczby b&#322;&#281;d&oacute;w.<\/p>\n\n\n\n<h3 class=\"wp-block-heading joli-heading jtoc-heading\" id=\"programista\">Programmer<\/h3>\n\n\n\n<p class=\"has-large-font-size wp-block-paragraph\">Testy napisane przez programist&oacute;w weryfikuj&#261; poprawno&#347;&#263; dzia&#322;ania tworzonego kodu z perspektywy j&#281;zyka programowania, jak r&oacute;wnie&#380; logiki biznesowej aplikacji, np. wykonanie przelewu bankowego jest logik&#261; biznesow&#261; aplikacji. <\/p>\n\n\n\n<p class=\"has-large-font-size wp-block-paragraph\">Programi&#347;ci w wi&#281;kszo&#347;ci przypadk&oacute;w tworz&#261; testy automatyczne. Dla ka&#380;dego testu nale&#380;y zdefiniowa&#263; dane wej&#347;ciowe oraz oczekiwany wynik, aby zdefiniowa&#263; takie dane oraz wynik musimy wiedzie&#263; jaka jest logika naszej aplikacji. Innymi s&#322;owy, tworz&#261;c poprawne testy pokazujemy, &#380;e wiemy jak dzia&#322;a testowana przez nas aplikacja.<\/p>\n\n\n\n<h3 class=\"wp-block-heading joli-heading jtoc-heading\" id=\"tester\">Tester<\/h3>\n\n\n\n<p class=\"has-large-font-size wp-block-paragraph\">Tworz&#261; testy, aby g&#322;&oacute;wnie zweryfikowa&#263; logik&#281; biznesow&#261; aplikacji oraz testuj&#261; tzw. warunki brzegowe, np. czy mo&#380;na wykona&#263; przelew na ujemn&#261; kwot&#281; i\/lub dat&#281; z przesz&#322;o&#347;ci? Testerzy tworz&#261; zar&oacute;wno testy automatyczne jak r&oacute;wnie&#380; manualne.<\/p>\n\n\n\n<h2 class=\"wp-block-heading joli-heading jtoc-heading\" id=\"kategorie-testow\">Kategorie test&oacute;w<\/h2>\n\n\n\n<h3 class=\"wp-block-heading joli-heading jtoc-heading\" id=\"testy-manualne\"><strong>Manual tests<\/strong><\/h3>\n\n\n\n<p class=\"has-large-font-size wp-block-paragraph\">Polegaj&#261; np. na klikaniu w stron&#281; internetow&#261; banku w celu wykonania przelewu. Je&#380;eli tester znajdzie b&#322;&#261;d podczas wykonywania przelewu zg&#322;osi go &ndash; za pomoc&#261; systemu do zg&#322;aszania b&#322;&#281;d&oacute;w, np. <a href=\"https:\/\/pl.wikipedia.org\/wiki\/JIRA\" target=\"_blank\" rel=\"noreferrer noopener\">JIRA<\/a> &ndash; programi&#347;cie, kt&oacute;ry b&#281;dzie musia&#322; taki b&#322;&#261;d poprawi&#263; w p&oacute;&#378;niejszym czasie, nie koniecznie od razu. Idealn&#261; sytuacj&#261; jest, w kt&oacute;rej tester posiada <a href=\"https:\/\/pl.wikipedia.org\/wiki\/Historyjka_u%C5%BCytkownika\" target=\"_blank\" rel=\"noreferrer noopener\">scenariusze testowe<\/a>, kt&oacute;re, to krok po kroku opisuj&#261;, co nale&#380;y zrobi&#263;, aby wykona&#263; przelew bankowy. Na tej podstawie mo&#380;na odtworzy&#263; sytuacj&#281;, kt&oacute;ra wywo&#322;a&#322;a b&#322;&#261;d, w przeciwnym wypadku b&#322;&#261;d mo&#380;e nie zosta&#263; nigdy odtworzony i naprawiony.<\/p>\n\n\n\n<h3 class=\"wp-block-heading joli-heading jtoc-heading\" id=\"testy-automatyczne\"><strong>Automatic tests<\/strong><\/h3>\n\n\n\n<p class=\"has-large-font-size wp-block-paragraph\">Wymagaj&#261; u&#380;ycia narz&#281;dzia, za pomoc&#261; kt&oacute;rego mo&#380;na zaprogramowa&#263;, zautomatyzowa&#263; sekwencj&#281; czynno&#347;ci, kt&oacute;re doprowadz&#261; np. do wykonania przelewu bankowego. Wi&#281;kszo&#347;&#263; test&oacute;w automatycznych tworzonych przez tester&oacute;w jest testami integracyjnymi. <\/p>\n\n\n\n<p class=\"has-large-font-size wp-block-paragraph\">Do test&oacute;w automatycznych testerzy mog&#261; u&#380;ywa&#263; takie narz&#281;dzia jak <a rel=\"noreferrer noopener\" href=\"https:\/\/en.wikipedia.org\/wiki\/Selenium_(software)\" target=\"_blank\">Selenium<\/a> (testy www), <a rel=\"noreferrer noopener\" href=\"https:\/\/www.postman.com\/automated-testing\/\" target=\"_blank\">Postman<\/a> (testy REST API) lub <a rel=\"noreferrer noopener\" href=\"https:\/\/en.wikipedia.org\/wiki\/Apache_JMeter\" target=\"_blank\">JMeter<\/a> (testy wydajno&#347;ciowe). Kroki niezb&#281;dne do wykonania testu powinny by&#263; spisane w <a href=\"https:\/\/pl.wikipedia.org\/wiki\/Historyjka_u%C5%BCytkownika\" target=\"_blank\" rel=\"noreferrer noopener\">scenariuszu testowym<\/a>. Za pomoc&#261; ww. narz&#281;dzi tester nagrywa, koduje test automatyczny, kt&oacute;ry nast&#281;pnie jest odtwarzany dowoln&#261; ilo&#347;&#263; razy w dowolnym momencie na wcze&#347;niej zdefiniowanym zbiorze danych.<\/p>\n\n\n\n<p class=\"has-large-font-size wp-block-paragraph\">Z za&#322;o&#380;enia testy tworzone przez programist&oacute;w s&#261; testami automatycznymi. Do tworzenia takich test&oacute;w programi&#347;ci u&#380;ywaj&#261; framework&rsquo;&oacute;w do testowania kodu &#378;r&oacute;d&#322;owego, czyli klas j&#281;zyka Java. Najpopularniejszym obecnie framework&rsquo;iem jest <a rel=\"noreferrer noopener\" href=\"https:\/\/en.wikipedia.org\/wiki\/JUnit\" target=\"_blank\">JUnit<\/a>. Jak &#322;atwo korzysta si&#281; z JUnit w IntelliJ napisa&#322;em wcze&#347;niej w tym artykule. Testy automatyczne tworzone przez programist&#281; mo&#380;emy podzieli&#263; na testy integracyjne i jednostkowe.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\">\n\n\n\n<p class=\"has-large-font-size wp-block-paragraph\">Zanim om&oacute;wi&#281; testy kodu &#378;r&oacute;d&#322;owego z perspektywy programisty zach&#281;cam do zapoznania si&#281; z informacjami o klasach w j&#281;zyku Java, <a rel=\"noreferrer noopener\" href=\"https:\/\/www.juniorjavadeveloper.pl\/en\/2020\/03\/07\/pierwsza-klasa-kod-java-intellij-krok-po-kroku\/\" target=\"_blank\">Pierwsza klasa &ndash; kod Java, IntelliJ, krok po kroku<\/a> oraz informacjami o metodach w j&#281;zyku Java, <a rel=\"noreferrer noopener\" href=\"https:\/\/www.juniorjavadeveloper.pl\/en\/2020\/03\/21\/dzialania-w-pierwszej-klasie-kod-java-intellij-krok-po-kroku\/\" target=\"_blank\">Dzia&#322;ania w pierwszej klasie &ndash; kod Java, IntelliJ, krok po kroku<\/a>. Testy kodu &#378;r&oacute;d&#322;owego pisane przez programist&#281; testuj&#261; metody w klasach.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\">\n\n\n\n<h2 class=\"wp-block-heading joli-heading jtoc-heading\" id=\"junit-test-praktyczny-przyklad\">JUnit test &ndash; praktyczny przyk&#322;ad<\/h2>\n\n\n\n<p class=\"has-large-font-size wp-block-paragraph\">&#346;rodowiska programistyczne takie, jak IntelliJ domy&#347;lnie wspieraj&#261; tworzenie test&oacute;w dla naszego kodu. Wystarczy ustawi&#263; kursor na wybranej nazwie klasy i wcisn&#261;&#263; ALT+Enter, wy&#347;wietli nam si&#281; opcja &ldquo;Create Test&rdquo; i\/lub wcisn&#261;&#263; ALT+Insert w dowolnym miejscu w kodzie klasy i wybra&#263; opcj&#281; &ldquo;Test&hellip;&rdquo;. Nast&#281;pnie b&#281;dziemy mogli wybra&#263; bibliotek&#281; do test&oacute;w (na chwil&#281; obecn&#261; domy&#347;lny jest JUnit5) oraz metod&#281;, kt&oacute;r&#261; chcemy przetestowa&#263;, b&#281;dzie ona dost&#281;pna do wyboru na li&#347;cie.<\/p>\n\n\n\n<style id=\"bwg-style-0\">      #bwg_container1_0 #bwg_container2_0 .image_browser_images_conteiner_0 * {        -moz-box-sizing: border-box;        box-sizing: border-box;      }      #bwg_container1_0 #bwg_container2_0 .image_browser_images_conteiner_0{\t\tbackground-color: rgba(245, 245, 245, 0.90);\t\ttext-align: center;\t\twidth: 100%;\t\tborder-style: none;\t\tborder-width: 2px;\t\tborder-color: #F7F7F7;\t\tpadding: 4px;\t\tborder-radius: 0;\t\tposition:relative;      }      #bwg_container1_0 #bwg_container2_0 .image_browser_images_0 {\t\tdisplay: inline-block;\t\t-moz-box-sizing: border-box;\t\tbox-sizing: border-box;\t\tfont-size: 0;\t\ttext-align: center;\t\tmax-width: 100%;\t\twidth: 100%;      }      #bwg_container1_0 #bwg_container2_0 .image_browser_image_buttons_conteiner_0 {\t\ttext-align: center;      }      #bwg_container1_0 #bwg_container2_0 .image_browser_image_buttons_0 {\t\tdisplay: inline-block;\t\twidth:100%;      }      #bwg_container1_0 #bwg_container2_0 .bwg_image_browser_image_0 {        background-color: rgba(235, 235, 235, 0.80);\t\ttext-align: center;\t\tdisplay: inline-block;\t\tvertical-align: middle;\t\tmargin: 2px auto;\t\tpadding: 4px;\t\tborder-radius: 0;\t\tborder: 1px none #F5F5F5;\t\tbox-shadow: ;\t\tmax-width: 800px;\t\twidth: 100%;\t\t\/*z-index: 100;*\/\t\tposition: relative;      }      #bwg_container1_0 #bwg_container2_0 .bwg_image_alt_0{\t\tdisplay: table;\t\twidth: 100%;\t\tfont-size: 15px;\t\tfont-family: Ubuntu;\t\tcolor: #000000;\t\ttext-align:center;\t\tpadding-left: 8px;        word-break: break-word;      }      #bwg_container1_0 #bwg_container2_0 .bwg_image_browser_img_0 {        padding: 0 !important;\t\tmax-width: 100% !important;\t\theight: inherit !important;\t\twidth: 100%;      }      @media only screen and (max-width : 320px) {\t\t#bwg_container1_0 #bwg_container2_0 .displaying-num_0 {\t\t  display: none;\t\t}\t\t#bwg_container1_0 #bwg_container2_0 .bwg_image_alt_0 {\t\t  font-size: 10px !important;\t\t}\t\t#bwg_container1_0 #bwg_container2_0 .bwg_watermark_text_0,\t\t#bwg_container1_0 #bwg_container2_0 .bwg_watermark_text_0:hover {\t\t  font-size: 10px !important;\t\t  text-decoration: none;\t\t  margin: 4px;\t\t  font-family: segoe ui;\t\t  color: #FFFFFF !important;\t\t  opacity: 0.30;\t\t  text-decoration: none;\t\t  position: relative;\t\t  z-index: 10141;\t\t}\t\t#bwg_container1_0 #bwg_container2_0 .bwg_image_browser_image_description_0 {\t\t  color: #000000;\t\t  display: table;\t\t  width: 100%;\t\t  text-align: left;\t\t  font-size: 8px !important;\t\t  font-family: Ubuntu;\t\t  padding: 8px 8px 8px 8px;\t\t  \/*word-break: break-all;*\/\t\t  border-style: none;\t\t  background-color: #EBEBEB;\t\t  border-radius: 0;\t\t  border-width: 1px;\t\t}\t\t#bwg_container1_0 #bwg_container2_0 .tablenav-pages_0 a {\t\t  font-size: 10px !important;\t\t}      }      #bwg_container1_0 #bwg_container2_0 .bwg_image_browser_image_desp_0 {\t\t\t\tdisplay: table;\t\t\t\tclear: both;\t\t\t\ttext-align: center;        padding: 0px 5px 0px 5px;\t\t\t\twidth: 100%;      }      #bwg_container1_0 #bwg_container2_0 .bwg_image_browser_image_description_0 {        color: #000000;\t\tdisplay: table;\t\twidth: 100%;\t\ttext-align: left;\t\tfont-size: 15px;\t\tfont-family: Ubuntu;\t\tpadding: 8px 8px 8px 8px;\t\tword-break: break-word;\t\tborder-style: none;\t\tbackground-color: #EBEBEB;\t\tborder-radius: 0;\t\tborder-width: 1px;      }      #bwg_container1_0 #bwg_container2_0 .bwg_image_browser_image_alt_0 {      \tdisplay:table;        clear: both;        text-align: center;        padding: 8px;        width: 100%;      }      \/*watermark*\/      #bwg_container1_0 #bwg_container2_0 .bwg_watermark_text_0,      #bwg_container1_0 #bwg_container2_0 .bwg_watermark_text_0:hover {        text-decoration: none;        margin: 4px;        font-size: 20px;        font-family: segoe ui;        color: #FFFFFF !important;        opacity: 0.30;        position: relative;        z-index: 10141;      }      #bwg_container1_0 #bwg_container2_0 .bwg_image_browser_image_contain_0{        position: absolute;        text-align: center;        vertical-align: middle;        width: 100%;        height: 100%;        cursor: pointer;      }      #bwg_container1_0 #bwg_container2_0 .bwg_image_browser_watermark_contain_0{        display: table;        vertical-align: middle;        width: 100%;        height: 100%;      }\t       #bwg_container1_0 #bwg_container2_0 .bwg_image_browser_watermark_cont_0{        display: table-cell;        text-align: ;        position: relative;        vertical-align: ;      }      #bwg_container1_0 #bwg_container2_0 .bwg_image_browser_watermark_0{\t\tdisplay: inline-block;\t\toverflow: hidden;\t\tposition: relative;\t\tvertical-align: middle;\t\tz-index: 10140;\t\twidth: 90px;\t\tmax-width: 11.25%;\t\tmargin: 10px 10px 10px 10px ;      }      #bwg_container1_0 #bwg_container2_0 .bwg_image_browser_watermark_text_0{        display: inline-block;\t\toverflow: hidden;\t\tposition: relative;\t\tvertical-align: middle;\t\tz-index: 10140;\t\tmargin: 10px 10px 10px 10px;      }      #bwg_container1_0 #bwg_container2_0 .bwg_image_browser_watermark_img_0{        max-width: 100%;        opacity: 0.30;        position: relative;        z-index: 10141;      }      #bwg_container1_0 #bwg_container2_0 .bwg_none_selectable {        -webkit-touch-callout: none;        -webkit-user-select: none;        -khtml-user-select: none;        -moz-user-select: none;        -ms-user-select: none;        user-select: none;       ecoration: none;    }    #bwg_container1_0 #bwg_container2_0 .bwg_gal_title_0 {      background-color: rgba(0, 0, 0, 0);      color: #323A45;      display: block;      font-family: Ubuntu;      font-size: 16px;      font-weight: bold;      padding: 2px;      text-shadow: 0px 0px 0px #888888;      text-align: center;    }    <\/style>    <div id=\"bwg_container1_0\" class=\"bwg_container bwg_thumbnail bwg_image_browser\" data-right-click-protection=\"0\" data-bwg=\"0\" data-scroll=\"0\" data-gallery-type=\"image_browser\" data-gallery-view-type=\"image_browser\" data-current-url=\"\/en\/wp-json\/wp\/v2\/posts\/998\" data-lightbox-url=\"https:\/\/www.juniorjavadeveloper.pl\/wp-admin\/admin-ajax.php?action=GalleryBox&amp;current_view=0&amp;gallery_id=7&amp;tag=0&amp;theme_id=1&amp;shortcode_id=14&amp;sort_by=order&amp;order_by=asc&amp;current_url=%2Fen%2Fwp-json%2Fwp%2Fv2%2Fposts%2F998\" data-gallery-id=\"7\" data-popup-width=\"800\" data-popup-height=\"500\" data-is-album=\"gallery\" data-buttons-position=\"bottom\">      <div id=\"bwg_container2_0\">             <div id=\"ajax_loading_0\" class=\"bwg_loading_div_1\">      <div class=\"bwg_loading_div_2\">        <div class=\"bwg_loading_div_3\">          <div id=\"loading_div_0\" class=\"bwg_spider_ajax_loading\">          <\/div>        <\/div>      <\/div>    <\/div>            <form id=\"gal_front_form_0\" class=\"bwg-hidden\" method=\"post\" action=\"#\" data-current=\"0\" data-shortcode-id=\"14\" data-gallery-type=\"image_browser\" data-gallery-id=\"7\" data-tag=\"0\" data-album-id=\"0\" data-theme-id=\"1\" data-ajax-url=\"https:\/\/www.juniorjavadeveloper.pl\/wp-admin\/admin-ajax.php?action=bwg_frontend_data\" data-trp-original-action=\"#\">          <div id=\"bwg_container3_0\" class=\"bwg-background bwg-background-0\">            \t  <div id=\"bwg_image_browser_0\" class=\"image_browser_images_conteiner_0 bwg-image_browser-images-wrapper bwg-container\" data-params=\"{&quot;is_pro&quot;:false,&quot;image_right_click&quot;:0,&quot;gallery_id&quot;:&quot;7&quot;}\" data-bwg=\"0\" data-lightbox-url=\"https:\/\/www.juniorjavadeveloper.pl\/wp-admin\/admin-ajax.php?action=GalleryBox&amp;current_view=0&amp;gallery_id=7&amp;tag=0&amp;theme_id=1&amp;shortcode_id=14&amp;sort_by=order&amp;order_by=asc&amp;current_url=%2Fen%2Fwp-json%2Fwp%2Fv2%2Fposts%2F998\">      <div class=\"image_browser_images_0\">                  <div class=\"image_browser_image_buttons_conteiner_0\">            <div class=\"image_browser_image_buttons_0\">                              <div class=\"bwg_image_browser_image_alt_0\">                  <div class=\"bwg_image_alt_0\" id=\"alt53\">                    Tworzenie testu - IntelliJ                  <\/div>                <\/div>                              <div class=\"bwg_image_browser_image_0\">                                  <a style=\"position:relative;\" class=\"bwg-a bwg_lightbox\" data-image-id=\"53\" data-elementor-open-lightbox=\"no\">                    <img decoding=\"async\" class=\"skip-lazy bwg-item0 bwg_image_browser_img bwg_image_browser_img_0\" src=\"https:\/\/www.juniorjavadeveloper.pl\/wp-content\/uploads\/photo-gallery\/Tworzenie-testu-IntelliJ_00.png?bwg=1601476400\" data-src=\"https:\/\/www.juniorjavadeveloper.pl\/wp-content\/uploads\/photo-gallery\/Tworzenie-testu-IntelliJ_00.png?bwg=1601476400\" alt=\"Tworzenie testu - IntelliJ\" title=\"Tworzenie testu - IntelliJ\">                  <\/a>                                <\/div>                              <div class=\"bwg_image_browser_image_desp_0\">                  <div class=\"bwg_image_browser_image_description_0\" id=\"alt53\">                    Tworzenie testu - IntelliJ                  <\/div>                <\/div>                            <\/div>          <\/div>                <\/div>    <\/div>    <style>      \/*pagination styles*\/      #bwg_container1_0 #bwg_container2_0 .tablenav-pages_0 {\t\t\t\ttext-align: center;\t\t\t\tfont-size: 12px;\t\t\t\tfont-family: Ubuntu;\t\t\t\tfont-weight: bold;\t\t\t\tcolor: #666666;\t\t\t\tmargin: 6px 0 4px;\t\t\t\tdisplay: block;      }      @media only screen and (max-width : 320px) {      #bwg_container1_0 #bwg_container2_0 .displaying-num_0 {     \t display: none;      }      }      #bwg_container1_0 #bwg_container2_0 .displaying-num_0 {\t\t\t\tfont-size: 12px;\t\t\t\tfont-family: Ubuntu;\t\t\t\tfont-weight: bold;\t\t\t\tcolor: #666666;\t\t\t\tmargin-right: 10px;\t\t\t\tvertical-align: middle;      }      #bwg_container1_0 #bwg_container2_0 .paging-input_0 {\t\t\t\tfont-size: 12px;\t\t\t\tfont-family: Ubuntu;\t\t\t\tfont-weight: bold;\t\t\t\tcolor: #666666;\t\t\t\tvertical-align: middle;      }      #bwg_container1_0 #bwg_container2_0 .tablenav-pages_0 a.disabled,      #bwg_container1_0 #bwg_container2_0 .tablenav-pages_0 a.disabled:hover,      #bwg_container1_0 #bwg_container2_0 .tablenav-pages_0 a.disabled:focus,\t\t\t#bwg_container1_0 #bwg_container2_0 .tablenav-pages_0 input.bwg_current_page {\t\t\t\tcursor: default;\t\t\t\tcolor: rgba(102, 102, 102, 0.5);      }      #bwg_container1_0 #bwg_container2_0 .tablenav-pages_0 a,      #bwg_container1_0 #bwg_container2_0 .tablenav-pages_0 input.bwg_current_page {\t\t\t\tcursor: pointer;\t\t\t\ttext-align: center;\t\t\t\tfont-size: 12px;\t\t\t\tfont-family: Ubuntu;\t\t\t\tfont-weight: bold;\t\t\t\tcolor: #666666;\t\t\t\ttext-decoration: none;\t\t\t\tpadding: 3px 6px;\t\t\t\tmargin: 0;\t\t\t\tborder-radius: 0;\t\t\t\tborder-style: solid;\t\t\t\tborder-width: 1px;\t\t\t\tborder-color: #E3E3E3;\t\t\t\t\t\t\t\tbackground-color: rgba(255, 255, 255, 1.00);\t\t\t\tbox-shadow: 0;\t\t\t\ttransition: all 0.3s ease 0s;-webkit-transition: all 0.3s ease 0s;      }            #bwg_container1_0 #bwg_container2_0 .tablenav-pages_0 a.next-page:hover,      #bwg_container1_0 #bwg_container2_0 .tablenav-pages_0 a.prev-page:hover {        color: #000000;      }      #bwg_container1_0 #bwg_container2_0 .tablenav-pages_0 .first-page,      #bwg_container1_0 #bwg_container2_0 .tablenav-pages_0 .last-page {        padding: 0% 7%;      }      #bwg_container1_0 #bwg_container2_0 .tablenav-pages_0 .next-page {        margin: 0% 4% 0% 0%;      }      #bwg_container1_0 #bwg_container2_0 .tablenav-pages_0 .prev-page {        margin: 0% 0% 0% 4%;      }      #bwg_container1_0 #bwg_container2_0 .tablenav-pages_0 a {        font-size: 15px !important;        padding: 0% 7% !important;        border-style: none !important;        border-width: 1px;        border-color: #E3E3E3;        background-color: #FFFFFF;        opacity: 1.00;        transition: all 0.3s ease 0s;-webkit-transition: all 0.3s ease 0s;      }      .bwg_image_browser#bwg_container1_0 #bwg_container2_0 .tablenav-pages_0 a {         padding: 0% 11% !important;      }\t\t\t#bwg_container1_0 #bwg_container2_0 .tablenav-pages_0 {        background-color: rgba(245, 245, 245, 0.90);        margin-top: 0;      }      .bwg_image_browser  .pagination-links_0 {        white-space: nowrap;      }      @media screen and (max-width: 465px) {        .bwg_image_browser#bwg_container1_0 #bwg_container2_0 .tablenav-pages_0 a {          padding: 0% 5% !important;          font-size: 13px;        }      }      <\/style>      <span class=\"bwg_nav_cont_0\">              <div class=\"tablenav-pages_0\">                      <span class=\"pagination-links_0 pagination-links\" data-pages-count=\"3\">              <span class=\"pagination-links_col1\">              <a class=\"bwg-a first-page disabled\" title=\"Go to the first page\">&laquo;<\/a>              <a class=\"bwg-a prev-page disabled\" title=\"Go to the previous page\">&lsaquo;<\/a>              <\/span>\t\t\t\t\t\t\t<span class=\"pagination-links_col2\">\t\t\t\t\t\t\t\t\t<input type=\"number\" class=\"bwg_current_page\" name=\"bwg_current_page\" value=\"1\" data-url-info=\"page_number_0\" onkeypress=\"return bwg_change_page_0(event, this)\" min=\"1\" oninput=\"validity.valid||(value='')\">\t\t\t\t\t\t\t\t\t\tof\t\t\t\t\t\t\t\t\t\t<span class=\"total-pages_0\">\t\t\t\t\t\t\t\t\t\t\t3\t\t\t\t\t\t\t\t\t\t<\/span>\t\t\t\t\t\t\t<\/span>              <span class=\"pagination-links_col3\">                <a class=\"bwg-a next-page-0\" title=\"Go to the next page\" href=\"\/en\/wp-json\/wp\/v2\/posts\/998?page_number_0=2\">&rsaquo;<\/a>                <a class=\"bwg-a last-page-0\" title=\"Go to the last page\" href=\"\/en\/wp-json\/wp\/v2\/posts\/998?page_number_0=3\">&raquo;<\/a>              <\/span>\t\t\t\t\t\t<\/span>\t\t\t\t\t\t        <\/div>                <input type=\"hidden\" id=\"page_number_0\" name=\"page_number_0\" value=\"1\">      <script type=\"text\/javascript\">        if( jQuery('.bwg_nav_cont_0').length > 1 ) {          jQuery('.bwg_nav_cont_0').first().remove()        }        function spider_page_0(cur, x, y, load_more) {          if (typeof load_more == \"undefined\") {            var load_more = false;          }          if (jQuery(cur).hasClass('disabled')) {            return false;          }          var items_county_0 = 3;          switch (y) {            case 1:              if (x >= items_county_0) {                document.getElementById('page_number_0').value = items_county_0;              }              else {                document.getElementById('page_number_0').value = x + 1;              }              break;            case 2:              document.getElementById('page_number_0').value = items_county_0;              break;            case -1:              if (x == 1) {                document.getElementById('page_number_0').value = 1;              }              else {                document.getElementById('page_number_0').value = x - 1;              }              break;            case -2:              document.getElementById('page_number_0').value = 1;              break;\t\t\t\t\t\tcase 0:              document.getElementById('page_number_0').value = x;              break;            default:              document.getElementById('page_number_0').value = 1;          }          bwg_ajax('gal_front_form_0', '0', 'bwg_image_browser_0', '0', '', 'gallery', 0, '', '', load_more, '', 1);        }                    jQuery('.first-page disabled').on('click', function () {              spider_page_0(this, 1, -2, 'numeric');              return false;            });            jQuery('.prev-page disabled').on('click', function () {              spider_page_0(this, 1, -1, 'numeric');              return false;            });            jQuery('.next-page-0').on('click', function () {              spider_page_0(this, 1, 1, 'numeric');              return false;            });            jQuery('.last-page-0').on('click', function () {              spider_page_0(this, 1, 2, 'numeric');              return false;            });        \t\t\t\t\/* Change page on input enter. *\/        function bwg_change_page_0( e, that ) {          if (  e.key == 'Enter' ) {            var to_page = parseInt(jQuery(that).val());            var pages_count = jQuery(that).parents(\".pagination-links\").data(\"pages-count\");            var current_url_param = jQuery(that).attr('data-url-info');            if (to_page > pages_count) {              to_page = 1;            }\t \t\t\t\t\t\t\t\t\t\t\t\tspider_page_0(this, to_page, 0, 'numeric');\t\t\t\t\t\t\treturn false;\t\t\t\t\t\t          }          return true;        }        jQuery('.bwg_load_btn_0').on('click', function () {            spider_page_0(this, 1, 1, true);            return false;        });      <\/script>      <\/span>                <\/div>        <input type=\"hidden\" name=\"trp-form-language\" value=\"en\"\/><\/form>        <style>          #bwg_container1_0 #bwg_container2_0 #spider_popup_overlay_0 {          background-color: #EEEEEE;          opacity: 0.60;          }          <\/style>        <div id=\"bwg_spider_popup_loading_0\" class=\"bwg_spider_popup_loading\"><\/div>        <div id=\"spider_popup_overlay_0\" class=\"spider_popup_overlay\" onclick=\"spider_destroypopup(1000)\"><\/div>        <input type=\"hidden\" id=\"bwg_random_seed_0\" value=\"241224754\">                <\/div>    <\/div>    <script>      if (document.readyState === 'complete') {        if( typeof bwg_main_ready == 'function' ) {          if ( jQuery(\"#bwg_container1_0\").height() ) {            bwg_main_ready(jQuery(\"#bwg_container1_0\"));          }        }      } else {        document.addEventListener('DOMContentLoaded', function() {          if( typeof bwg_main_ready == 'function' ) {            if ( jQuery(\"#bwg_container1_0\").height() ) {             bwg_main_ready(jQuery(\"#bwg_container1_0\"));            }          }        });      }    <\/script>    \n\n\n\n<h3 class=\"wp-block-heading joli-heading jtoc-heading\" id=\"test-jednostkowy-co-testowac\">Test jednostkowy &ndash; co testowa&#263;?<\/h3>\n\n\n\n<p class=\"has-large-font-size wp-block-paragraph\">Programista pisz&#261;c <strong>testy jednostkowe<\/strong>, testuje poprawno&#347;&#263; dzia&#322;ania metod w klasie, g&#322;&oacute;wnie metod publicznych. W jaki spos&oacute;b testuje si&#281; poprawno&#347;&#263; dzia&#322;ania metody? W j&#281;zyku Java metoda mo&#380;e przyjmowa&#263; parametry, zwraca&#263; wynik i\/lub rzuca&#263; wyj&#261;tek i w&#322;a&#347;nie te elementy s&#261; testowane przez programist&#281;. Testowanie dzia&#322;ania metody linijka po linijce nie mia&#322;o by wi&#281;kszego sensu.<\/p>\n\n\n\n<h3 class=\"wp-block-heading joli-heading jtoc-heading\" id=\"test-jednostkowy-jak-testowac\">Test jednostkowy &ndash; jak testowa&#263;?<\/h3>\n\n\n\n<p class=\"has-large-font-size wp-block-paragraph\">Maj&#261;c powy&#380;sz&#261; wiedz&#281; programista definiuje dane wej&#347;ciowe do metody oraz sprawdza warto&#347;&#263; zwracan&#261; z metody. Dobr&#261; praktyk&#261; jest podzielenie testu na <strong>sekcje given, when, then<\/strong> &ndash; nazwy s&#261; samo opisuj&#261;ce si&#281;. W tych sekcjach programista umieszcza logik&#281; testu jednostkowego.<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li class=\"has-large-font-size\">W sekcji <strong>given<\/strong> powinna by&#263; klasa, kt&oacute;r&#261; testujemy oraz warto&#347;ci dla parametr&oacute;w testowanej metody &ndash; dane wej&#347;ciowe &ndash; w tym przypadku  <strong>BankService<\/strong> oraz <strong>BankAccount<\/strong>.<\/li>\n\n\n\n<li class=\"has-large-font-size\">W sekcji <strong>when<\/strong> powinna zosta&#263; wywo&#322;ana metoda, kt&oacute;r&#261; testujemy <strong>transfer()<\/strong>, przekazujemy do niej warto&#347;ci dla parametr&oacute;w (<strong>fromBankAccount<\/strong> oraz <strong>toBankAccount<\/strong>), a nast&#281;pnie przypisujemy warto&#347;&#263; zwracan&#261; <strong>transferred<\/strong>.<\/li>\n\n\n\n<li class=\"has-large-font-size\">W sekcji <strong>then<\/strong> sprawdzamy warto&#347;&#263; zwracan&#261; z metody <strong>transfer()<\/strong> za pomoc&#261; mechanizmu assercji z framework&rsquo;a JUnit &ndash; w tym przypadku <strong>assertFalse()<\/strong>.<\/li>\n<\/ul>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-large\"><a href=\"https:\/\/www.juniorjavadeveloper.pl\/wp-content\/uploads\/2020\/10\/Tworzenie-testu-IntelliJ_04.png\" target=\"_blank\" rel=\"noopener noreferrer\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"760\" src=\"https:\/\/www.juniorjavadeveloper.pl\/wp-content\/uploads\/2020\/10\/Tworzenie-testu-IntelliJ_04-1024x760.png\" alt=\"Po co w og&oacute;le testowa&#263; kod aplikacji? - Test jednostkowy JUnit\" class=\"wp-image-1090\" srcset=\"https:\/\/www.juniorjavadeveloper.pl\/wp-content\/uploads\/2020\/10\/Tworzenie-testu-IntelliJ_04-1024x760.png 1024w, https:\/\/www.juniorjavadeveloper.pl\/wp-content\/uploads\/2020\/10\/Tworzenie-testu-IntelliJ_04-300x223.png 300w, https:\/\/www.juniorjavadeveloper.pl\/wp-content\/uploads\/2020\/10\/Tworzenie-testu-IntelliJ_04-768x570.png 768w, https:\/\/www.juniorjavadeveloper.pl\/wp-content\/uploads\/2020\/10\/Tworzenie-testu-IntelliJ_04-1213x900.png 1213w, https:\/\/www.juniorjavadeveloper.pl\/wp-content\/uploads\/2020\/10\/Tworzenie-testu-IntelliJ_04-1000x742.png 1000w, https:\/\/www.juniorjavadeveloper.pl\/wp-content\/uploads\/2020\/10\/Tworzenie-testu-IntelliJ_04-800x593.png 800w, https:\/\/www.juniorjavadeveloper.pl\/wp-content\/uploads\/2020\/10\/Tworzenie-testu-IntelliJ_04-600x445.png 600w, https:\/\/www.juniorjavadeveloper.pl\/wp-content\/uploads\/2020\/10\/Tworzenie-testu-IntelliJ_04-400x297.png 400w, https:\/\/www.juniorjavadeveloper.pl\/wp-content\/uploads\/2020\/10\/Tworzenie-testu-IntelliJ_04.png 1235w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\"><\/a><figcaption class=\"wp-element-caption\">Po co w ogole testowac kod aplikacji? &ndash; Test jednostkowy JUnit<\/figcaption><\/figure>\n\n<\/div>\n\n\n<h3 class=\"wp-block-heading joli-heading jtoc-heading\" id=\"test-integracyjny\">Integration test<\/h3>\n\n\n\n<p class=\"has-large-font-size wp-block-paragraph\"><strong>Testy integracyjne<\/strong> programista pisze dla wielu wsp&oacute;&#322;pracuj&#261;cych ze sob&#261; klas i ich metod, grupuje r&oacute;&#380;ne funkcje kodu w celu przetestowania tzw. pe&#322;nej &#347;cie&#380;ki dla danego <a rel=\"noreferrer noopener\" href=\"https:\/\/pl.wikipedia.org\/wiki\/Przypadek_u%C5%BCycia\" target=\"_blank\">przypadku u&#380;ycia<\/a>, kt&oacute;ry mo&#380;e by&#263; opisany w <a rel=\"noreferrer noopener\" href=\"https:\/\/pl.wikipedia.org\/wiki\/Historyjka_u%C5%BCytkownika\" target=\"_blank\">scenariuszu testowym<\/a>. W du&#380;ym uproszczeniu mo&#380;na powiedzie&#263;, &#380;e w sekcji <strong>given<\/strong> b&#281;dzie wi&#281;cej obiekt&oacute;w (<strong>CurrencyConverterService<\/strong> i <strong>BankService<\/strong>), a w sekcji <strong>when<\/strong> b&#281;dzie wi&#281;cej wywo&#322;a&#324; metod (<strong>balance()<\/strong> i <strong>convert()<\/strong>), kt&oacute;rych wyniki b&#281;d&#261; wzajemnie przekazywane (<strong>BigDecimal balance<\/strong> i <strong>BigDecimal balanceInEuro<\/strong>).<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"716\" src=\"https:\/\/www.juniorjavadeveloper.pl\/wp-content\/uploads\/2020\/10\/Tworzenie-testu-IntelliJ_05-1024x716.png\" alt=\"Po co w og&oacute;le testowa&#263; kod aplikacji? - Test integracyjny JUnit\" class=\"wp-image-1093\" srcset=\"https:\/\/www.juniorjavadeveloper.pl\/wp-content\/uploads\/2020\/10\/Tworzenie-testu-IntelliJ_05-1024x716.png 1024w, https:\/\/www.juniorjavadeveloper.pl\/wp-content\/uploads\/2020\/10\/Tworzenie-testu-IntelliJ_05-300x210.png 300w, https:\/\/www.juniorjavadeveloper.pl\/wp-content\/uploads\/2020\/10\/Tworzenie-testu-IntelliJ_05-768x537.png 768w, https:\/\/www.juniorjavadeveloper.pl\/wp-content\/uploads\/2020\/10\/Tworzenie-testu-IntelliJ_05-1287x900.png 1287w, https:\/\/www.juniorjavadeveloper.pl\/wp-content\/uploads\/2020\/10\/Tworzenie-testu-IntelliJ_05-1000x699.png 1000w, https:\/\/www.juniorjavadeveloper.pl\/wp-content\/uploads\/2020\/10\/Tworzenie-testu-IntelliJ_05-800x560.png 800w, https:\/\/www.juniorjavadeveloper.pl\/wp-content\/uploads\/2020\/10\/Tworzenie-testu-IntelliJ_05-600x420.png 600w, https:\/\/www.juniorjavadeveloper.pl\/wp-content\/uploads\/2020\/10\/Tworzenie-testu-IntelliJ_05-400x280.png 400w, https:\/\/www.juniorjavadeveloper.pl\/wp-content\/uploads\/2020\/10\/Tworzenie-testu-IntelliJ_05.png 1311w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\"><figcaption class=\"wp-element-caption\">Po co w ogole testowac kod aplikacji? &ndash; Test integracyjny JUnit<\/figcaption><\/figure>\n\n\n\n\n<h2 class=\"wp-block-heading joli-heading jtoc-heading\" id=\"piramida-testow\">Piramida test&oacute;w<\/h2>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"295\" height=\"171\" src=\"https:\/\/www.juniorjavadeveloper.pl\/wp-content\/uploads\/2020\/10\/Matrin-Fowler-The-Practical-Test-Pyramid.png\" alt=\"Matrin Fowler - The Practical Test Pyramid\" class=\"wp-image-3717\" srcset=\"https:\/\/www.juniorjavadeveloper.pl\/wp-content\/uploads\/2020\/10\/Matrin-Fowler-The-Practical-Test-Pyramid.png 295w, https:\/\/www.juniorjavadeveloper.pl\/wp-content\/uploads\/2020\/10\/Matrin-Fowler-The-Practical-Test-Pyramid-18x10.png 18w\" sizes=\"auto, (max-width: 295px) 100vw, 295px\"><figcaption class=\"wp-element-caption\">Matrin Fowler &ndash; The Practical Test Pyramid<\/figcaption><\/figure>\n\n<\/div>\n\n\n<p class=\"has-large-font-size wp-block-paragraph\">Na koniec umieszcz&#281; link do artyku&#322;u o piramidzie test&oacute;w z praktycznym przyk&#322;adem oraz obszernym wyt&#322;umaczeniem roli i znaczenia test&oacute;w &ndash; <a href=\"https:\/\/martinfowler.com\/articles\/practical-test-pyramid.html\">https:\/\/martinfowler.com\/articles\/practical-test-pyramid.html<\/a>.<\/p>\n\n\n\n<figure class=\"wp-block-embed aligncenter is-type-wp-embed is-provider-poradnik-dla-przysz-ych-junior-java-developer-039-w wp-block-embed-poradnik-dla-przysz-ych-junior-java-developer-039-w\"><div class=\"wp-block-embed__wrapper\">\n<blockquote class=\"wp-embedded-content\" data-secret=\"rytdnTYWqn\"><a href=\"https:\/\/www.juniorjavadeveloper.pl\/en\/kontakt\/\">Contact<\/a><\/blockquote><iframe loading=\"lazy\" class=\"wp-embedded-content\" sandbox=\"allow-scripts\" security=\"restricted\" style=\"position: absolute; visibility: hidden;\" title=\"&bdquo;Kontakt&rdquo; &mdash; Poradnik dla przysz&#322;ych Junior Java Developer&amp;apos;&oacute;w\" src=\"https:\/\/www.juniorjavadeveloper.pl\/kontakt\/embed\/#?secret=Yubc2G3xjk#?secret=rytdnTYWqn\" data-secret=\"rytdnTYWqn\" width=\"600\" height=\"338\" frameborder=\"0\" marginwidth=\"0\" marginheight=\"0\" scrolling=\"no\"><\/iframe>\n<\/div><\/figure>\n\n\n\n<figure class=\"wp-block-embed aligncenter is-type-wp-embed is-provider-poradnik-dla-przysz-ych-junior-java-developer-039-w wp-block-embed-poradnik-dla-przysz-ych-junior-java-developer-039-w\"><div class=\"wp-block-embed__wrapper\">\n<blockquote class=\"wp-embedded-content\" data-secret=\"gfF5c7XHu6\"><a href=\"https:\/\/www.juniorjavadeveloper.pl\/en\/mentoring-rezerwuj-termin\/\">Mentoring - book an appointment<\/a><\/blockquote><iframe loading=\"lazy\" class=\"wp-embedded-content\" sandbox=\"allow-scripts\" security=\"restricted\" style=\"position: absolute; visibility: hidden;\" title=\"&bdquo;Mentoring &ndash; rezerwuj termin&rdquo; &mdash; Poradnik dla przysz&#322;ych Junior Java Developer&amp;apos;&oacute;w\" src=\"https:\/\/www.juniorjavadeveloper.pl\/mentoring-rezerwuj-termin\/embed\/#?secret=iSIVtP0SUT#?secret=gfF5c7XHu6\" data-secret=\"gfF5c7XHu6\" width=\"600\" height=\"338\" frameborder=\"0\" marginwidth=\"0\" marginheight=\"0\" scrolling=\"no\"><\/iframe>\n<\/div><\/figure>","protected":false},"excerpt":{"rendered":"<p>W tym artykule opisz\u0119 dlaczego testowanie kodu aplikacji jest tak wa\u017cne, opisz\u0119 jak tworzy\u0107 r\u00f3\u017cne rodzaje test\u00f3w oraz poka\u017c\u0119 przyk\u0142ad JUnit test dla Javy. Zawsze powtarzam, je\u017celi chcesz spa\u0107 spokojnie, to pisz testy kodu aplikacji. Pod poj\u0119ciem testy rozumiem r\u00f3\u017cne rodzaje test\u00f3w np.: testy jednostkowe, testy integracyjne, testy automatyczne oraz manualne. Mo\u017cna wry\u00f3\u017cni\u0107 kilka technik [&hellip;]<\/p>","protected":false},"author":1,"featured_media":1080,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_ppp_document_settings_meta":"","footnotes":"","jetpack_publicize_message":"","jetpack_is_tweetstorm":false,"jetpack_publicize_feature_enabled":true,"jetpack_social_post_already_shared":false,"jetpack_social_options":{"image_generator_settings":{"template":"highway","enabled":false}}},"categories":[2,7],"tags":[],"class_list":["post-998","post","type-post","status-publish","format-standard","has-post-thumbnail","category-poczatkujacy","category-poradnik"],"jetpack_publicize_connections":[],"jetpack_featured_media_url":"https:\/\/www.juniorjavadeveloper.pl\/wp-content\/uploads\/2020\/10\/po-co-w-ogole-testowac-kod_naglowek.jpg","jetpack_sharing_enabled":true,"jetpack_likes_enabled":true,"_links":{"self":[{"href":"https:\/\/www.juniorjavadeveloper.pl\/en\/wp-json\/wp\/v2\/posts\/998","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.juniorjavadeveloper.pl\/en\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.juniorjavadeveloper.pl\/en\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.juniorjavadeveloper.pl\/en\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.juniorjavadeveloper.pl\/en\/wp-json\/wp\/v2\/comments?post=998"}],"version-history":[{"count":43,"href":"https:\/\/www.juniorjavadeveloper.pl\/en\/wp-json\/wp\/v2\/posts\/998\/revisions"}],"predecessor-version":[{"id":3764,"href":"https:\/\/www.juniorjavadeveloper.pl\/en\/wp-json\/wp\/v2\/posts\/998\/revisions\/3764"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.juniorjavadeveloper.pl\/en\/wp-json\/wp\/v2\/media\/1080"}],"wp:attachment":[{"href":"https:\/\/www.juniorjavadeveloper.pl\/en\/wp-json\/wp\/v2\/media?parent=998"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.juniorjavadeveloper.pl\/en\/wp-json\/wp\/v2\/categories?post=998"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.juniorjavadeveloper.pl\/en\/wp-json\/wp\/v2\/tags?post=998"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}