{"id":856,"date":"2023-03-26T12:58:06","date_gmt":"2023-03-26T10:58:06","guid":{"rendered":"https:\/\/anna-mastalerczuk.profesjonalnyprogramista.pl\/?p=856"},"modified":"2023-03-26T12:59:02","modified_gmt":"2023-03-26T10:59:02","slug":"test-driven-development","status":"publish","type":"post","link":"https:\/\/anna-mastalerczuk.profesjonalnyprogramista.pl\/index.php\/2023\/03\/26\/test-driven-development\/","title":{"rendered":"Test Driven Development"},"content":{"rendered":"\n<p><strong>Test Driven Development<\/strong> to technika tworzenia oprogramowania, kt\u00f3ra odwraca domy\u015blny porz\u0105dek tworzenia kodu. Najpierw pisane s\u0105 testy, a dopiero p\u00f3\u017aniej implementowana jest nowa funkcjonalno\u015b\u0107. To podej\u015bcie polega na wielokrotnym powtarzaniu krok\u00f3w (tzw. cykl: red \u2013 green \u2013 refactor):<\/p>\n\n\n\n<ol class=\"wp-block-list\" type=\"1\">\n<li><span style=\"text-decoration: underline;\">RED<\/span>: pierwszym krokiem jest napisanie testu, kt\u00f3ry ma sprawdza\u0107 dodawan\u0105 funkcjonalno\u015b\u0107. Test nie powinien si\u0119 wykona\u0107 pozytywie, poniewa\u017c sama funkcjonalno\u015b\u0107 jeszcze nie jest zaimplementowana.<\/li>\n\n\n\n<li><span style=\"text-decoration: underline;\">GREEN<\/span>: implementacja danej funkcjonalno\u015bci, przez kt\u00f3rej brak test si\u0119 nie wykona\u0142. Dodajemy tylko tyle kodu, ile jest niezb\u0119dne do pozytywnego wykonania testu. Na tym etapie test powinien si\u0119 uda\u0107.<\/li>\n\n\n\n<li><span style=\"text-decoration: underline;\">REFACTOR<\/span>: refaktoryzacja napisanego kodu. Na tym etapie nie zmieniamy funkcjonalno\u015bci, jedynie \u201eoczyszamy\u201d kod, np. wydzielamy metod\u0119, usuwamy powielaj\u0105cy si\u0119 kod.<\/li>\n<\/ol>\n\n\n\n<p>Po zako\u0144czeniu cyklu mo\u017cna przej\u015b\u0107 do nast\u0119pnej iteracji i zacz\u0105\u0107 ca\u0142y cykl od pocz\u0105tku. Wa\u017cne, aby na bie\u017c\u0105co uruchamia\u0107 wszystkie testy, \u017ceby mie\u0107 kontrol\u0119 na tym, czy zmiany, kt\u00f3re utworzyli\u015bmy nie powoduj\u0105 nie przechodzenia pozosta\u0142ych test\u00f3w.<\/p>\n\n\n\n<p><span style=\"text-decoration: underline;\">Przyk\u0142ad:<\/span> Tworzymy ksi\u0105\u017ck\u0119 adresow\u0105, gdzie b\u0119d\u0105 zapisywane poszczeg\u00f3lne kontakty.<\/p>\n\n\n\n<p><strong>TEST 1. <\/strong>Utworzenie klasy testowej \u2013 ContactTest\u2013 kontakty do ksi\u0105\u017cki adresowej.<\/p>\n\n\n\n<p><span style=\"text-decoration: underline;\">RED<\/span> \u2013 utworzenie metody testowej shouldNewContactHasAProperDatas(). Sprawdzenie, czy utworzony kontakt posiada imi\u0119, kt\u00f3re zosta\u0142o podane. W tym momencie brak jest klasy Contact oraz metody getName().<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>class ContactRepositoryTest {\n\n    @Test\n    void shouldContactBeAddedToRepository(){\n        \/\/given\n        ContactRepository contactRepository = new ContactRepository();\n        Contact contact = new Contact(\"Anna\", \"Nowak\", \"777888999\");\n\n        \/\/when\n        contactRepository.addContact(contact);\n    }\n}\n<\/code><\/pre>\n\n\n\n<p><span style=\"text-decoration: underline;\">GREEN<\/span> &#8211; utworzenie klasy Contact, konstruktora, metody getName() oraz metody get() dla pozosta\u0142ych zmiennych. Test si\u0119 wykonuje poprawnie.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>public class Contact {\n\n    private String name;\n    private String surname;\n    private String telNumber;\n    public Contact(String name, String surname, String telNumber) {\n        this.name = name;\n        this.surname = surname;\n        this.telNumber = telNumber;\n    }\n\n    public String getName() {\n        return name;\n    }\n    \n    public String getSurname(){\n        return surname;\n    }\n    \n    public String getTelNumber(){\n        return telNumber;\n    }\n}\n<\/code><\/pre>\n\n\n\n<p><span style=\"text-decoration: underline;\">REFACTOR <\/span>\u2013 na tym etapie nie potrzeby refaktoryzacji.<\/p>\n\n\n\n<p><strong>TEST 2. <\/strong>Utworzenie klasy testowej ContactRepositoryTest \u2013 klasa ContactRepository ma za zadanie przechowywa\u0107 obiekty klasy Contact \u2013 tzw. ksi\u0105\u017cka adresowa.<\/p>\n\n\n\n<p><span style=\"text-decoration: underline;\"><em>ITERACJA 1:<\/em><\/span><\/p>\n\n\n\n<p><span style=\"text-decoration: underline;\">RED<\/span> \u2013 sprawdzanie b\u0119dzie, czy kontakty dodaj\u0105 si\u0119 do listy &#8211; shouldContactBeAddedToRepository(). Test si\u0119 nie wykonuje (brak klasy ContactRepositoryTest). Teraz brakuje klasy ContactRepository oraz metody addContact().<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>class ContactRepositoryTest {\n\n    @Test\n    void shouldContactBeAddedToRepository(){\n        \/\/given\n        ContactRepository contactRepository = new ContactRepository();\n        Contact contact = new Contact(\"Anna\", \"Nowak\", \"777888999\");\n\n        \/\/when\n        contactRepository.addContact(contact);\n    }\n}\n<\/code><\/pre>\n\n\n\n<p><span style=\"text-decoration: underline;\">GREEN<\/span> \u2013 aby kod przeszed\u0142 test, musi zosta\u0107 dodana klasa ContactRepository oraz metoda addContact() do klasy ContactRepository.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>public class ContactRepository {\n\n    public void addContact(Contact contact) {\n    }\n}\n<\/code><\/pre>\n\n\n\n<p><span style=\"text-decoration: underline;\">REFACTOR<\/span> \u2013 na tym etapie nie potrzeby refaktoryzacji.<\/p>\n\n\n\n<p><span style=\"text-decoration: underline;\"><em>ITERACJA 2:<\/em><\/span><\/p>\n\n\n\n<p><span style=\"text-decoration: underline;\">RED<\/span> \u2013 sprawdzenie asercji &#8211; czy kontakt zosta\u0142 dodany do listy. Test nie przechodzi &#8211; brakuje metody getAllContacts() oraz cia\u0142a metody addContact().<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>class ContactRepositoryTest {\n\n    @Test\n    void shouldContactBeAddedToRepository(){\n        \/\/given\n        ContactRepository contactRepository = new ContactRepository();\n        Contact contact = new Contact(\"Anna\", \"Nowak\", \"777888999\");\n\n        \/\/when\n        contactRepository.addContact(contact);\n        \n        \/\/then \n        assertThat(contactRepository.getAllContacts().get(0), is(contact));\n    }\n}\n<\/code><\/pre>\n\n\n\n<p><span style=\"text-decoration: underline;\">GREEN<\/span> \u2013 utworzenie metody getAllContacts() oraz dodanie cia\u0142a metody addContact(), \u017ceby asercja by\u0142a spe\u0142niona i test si\u0119 uda\u0142.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>public class ContactRepository {\n\n    private List&lt;Contact&gt; contacts = new ArrayList&lt;&gt;();\n    public void addContact(Contact contact) {\n\n    }\n\n    public List&lt;Contact&gt; getAllContacts() {\n        return contacts;\n    }\n}\n<\/code><\/pre>\n\n\n\n<p><span style=\"text-decoration: underline;\">REFACTOR<\/span> \u2013 w za\u0142o\u017ceniu to nie koniec testowania. Praktycznie do ka\u017cdego testu b\u0119dziemy potrzebowali instancji klasy ContactRepository, dlatego mo\u017cemy je zapisa\u0107 jako pole w klasie testowej.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>class ContactRepositoryTest {\n\n    ContactRepository contactRepository = new ContactRepository();\n    @Test\n    void shouldContactBeAddedToRepository(){\n        \/\/given\n        Contact contact = new Contact(\"Anna\", \"Nowak\", \"777888999\");\n\n        \/\/when\n        contactRepository.addContact(contact);\n\n        \/\/then\n        assertThat(contactRepository.getAllContacts().get(0), is(contact));\n    }\n}\n<\/code><\/pre>\n","protected":false},"excerpt":{"rendered":"<p>Test Driven Development to technika tworzenia oprogramowania, kt\u00f3ra odwraca domy\u015blny porz\u0105dek tworzenia kodu. Najpierw pisane s\u0105 testy, a dopiero p\u00f3\u017aniej implementowana jest nowa funkcjonalno\u015b\u0107. To podej\u015bcie polega na wielokrotnym powtarzaniu krok\u00f3w (tzw. cykl: red \u2013 green \u2013 refactor): Po zako\u0144czeniu cyklu mo\u017cna przej\u015b\u0107 do nast\u0119pnej iteracji i zacz\u0105\u0107 ca\u0142y cykl od pocz\u0105tku. Wa\u017cne, aby na &hellip;<\/p>\n<p class=\"read-more\"> <a class=\"\" href=\"https:\/\/anna-mastalerczuk.profesjonalnyprogramista.pl\/index.php\/2023\/03\/26\/test-driven-development\/\"> <span class=\"screen-reader-text\">Test Driven Development<\/span> Read More &raquo;<\/a><\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"site-sidebar-layout":"default","site-content-layout":"default","ast-global-header-display":"","ast-main-header-display":"","ast-hfb-above-header-display":"","ast-hfb-below-header-display":"","ast-hfb-mobile-header-display":"","site-post-title":"","ast-breadcrumbs-content":"","ast-featured-img":"","footer-sml-layout":"","theme-transparent-header-meta":"","adv-header-id-meta":"","stick-header-meta":"","header-above-stick-meta":"","header-main-stick-meta":"","header-below-stick-meta":"","footnotes":""},"categories":[15],"tags":[],"class_list":["post-856","post","type-post","status-publish","format-standard","hentry","category-testy-jednostkowe"],"_links":{"self":[{"href":"https:\/\/anna-mastalerczuk.profesjonalnyprogramista.pl\/index.php\/wp-json\/wp\/v2\/posts\/856","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/anna-mastalerczuk.profesjonalnyprogramista.pl\/index.php\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/anna-mastalerczuk.profesjonalnyprogramista.pl\/index.php\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/anna-mastalerczuk.profesjonalnyprogramista.pl\/index.php\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/anna-mastalerczuk.profesjonalnyprogramista.pl\/index.php\/wp-json\/wp\/v2\/comments?post=856"}],"version-history":[{"count":2,"href":"https:\/\/anna-mastalerczuk.profesjonalnyprogramista.pl\/index.php\/wp-json\/wp\/v2\/posts\/856\/revisions"}],"predecessor-version":[{"id":858,"href":"https:\/\/anna-mastalerczuk.profesjonalnyprogramista.pl\/index.php\/wp-json\/wp\/v2\/posts\/856\/revisions\/858"}],"wp:attachment":[{"href":"https:\/\/anna-mastalerczuk.profesjonalnyprogramista.pl\/index.php\/wp-json\/wp\/v2\/media?parent=856"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/anna-mastalerczuk.profesjonalnyprogramista.pl\/index.php\/wp-json\/wp\/v2\/categories?post=856"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/anna-mastalerczuk.profesjonalnyprogramista.pl\/index.php\/wp-json\/wp\/v2\/tags?post=856"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}