{"id":49,"date":"2024-11-05T12:30:35","date_gmt":"2024-11-05T11:30:35","guid":{"rendered":"https:\/\/pich.pl\/?p=49"},"modified":"2024-11-05T12:30:36","modified_gmt":"2024-11-05T11:30:36","slug":"in-what-cases-unit-tests-will-speed-up-development-immediately","status":"publish","type":"post","link":"https:\/\/pich.pl\/pl\/2024\/11\/05\/in-what-cases-unit-tests-will-speed-up-development-immediately\/","title":{"rendered":"W jakich przypadkach testy jednostkowe natychmiast przyspiesz\u0105 dostarczenie rozwi\u0105zania"},"content":{"rendered":"<p class=\"wp-block-paragraph\">Podczas dyskusji o wp\u0142ywie test\u00f3w jednostkowych na bud\u017cety projekt\u00f3w, powszechnie uwa\u017ca si\u0119, \u017ce stanowi\u0105 one inwestycj\u0119 pocz\u0105tkow\u0105, kt\u00f3ra przynosi d\u0142ugoterminowe korzy\u015bci. Cho\u0107 osi\u0105gni\u0119cie kompleksowego pokrycia testami ca\u0142ego projektu lub konkretnych modu\u0142\u00f3w jest kluczowe dla realizacji tych korzy\u015bci, chcia\u0142bym przedstawi\u0107 scenariusze, w kt\u00f3rych testy jednostkowe mog\u0105 faktycznie przyspieszy\u0107 rozw\u00f3j, zamiast by\u0107 jedynie inwestycj\u0105.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Dlaczego przydatno\u015b\u0107 test\u00f3w jednostkowych jest niejednoznaczna w PHP<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Ekosystem PHP oferuje unikalne aspekty, je\u015bli chodzi o testy jednostkowe. Dzia\u0142amy w \u015brodowisku natychmiastowej widoczno\u015bci zmian \u2013 bez potrzeby budowania czy kompilacji. Rodzi to wa\u017cne pytania:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Przy budowie MVP - dlaczego inwestowa\u0107 w testy, gdy rentowno\u015b\u0107 produktu jest niepewna?<\/li>\n\n\n\n<li>Jak zr\u00f3wnowa\u017cy\u0107 testowanie z potrzebami klient\u00f3w dotycz\u0105cymi szybkiego wej\u015bcia na rynek?<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\">Czy powinni\u015bmy konsultowa\u0107 stosowanie test\u00f3w jednostkowych z biznesem?<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Odpowied\u017a nie jest prosta. Cho\u0107 nie ma potrzeby omawiania konkretnych technicznych implementacji z nietechnicznymi klientami, kt\u00f3rzy polegaj\u0105 na Twojej wiedzy eksperckiej, musimy zawsze dostosowywa\u0107 nasze podej\u015bcie do rozwoju do cel\u00f3w biznesowych. Czasami okoliczno\u015bci mog\u0105 wymaga\u0107 priorytetowego traktowania szybko\u015bci wej\u015bcia na rynek kosztem kompleksowego testowania, szczeg\u00f3lnie w wy\u015bcigu z konkurencj\u0105 lub przy walidacji koncepcji produktu. Chocia\u017c istnieje bogata literatura na temat zarz\u0105dzania d\u0142ugiem technicznym, kluczowe jest zapobieganie temu, by jego akumulacja sta\u0142a si\u0119 standardow\u0105 praktyk\u0105 dostarczania oprogramowania.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Jednak istniej\u0105 konkretne scenariusze, w kt\u00f3rych implementacja test\u00f3w jednostkowych mo\u017ce faktycznie przyspieszy\u0107 dostarczanie rozwi\u0105za\u0144 w por\u00f3wnaniu z ca\u0142kowitym ich pomini\u0119ciem.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Scenariusze testowania strategicznego<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\">Implementacja procesu checkout<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">We\u017amy pod uwag\u0119 checkout, kt\u00f3ry zazwyczaj obejmuje wiele stron i z\u0142o\u017conych interakcji u\u017cytkownika. Testowanie scenariuszy zar\u00f3wno dla zalogowanych, jak i niezalogowanych u\u017cytkownik\u00f3w w r\u00f3\u017cnych opcjach wysy\u0142ki oraz p\u0142atno\u015bci mo\u017ce poch\u0142on\u0105\u0107 znaczn\u0105 ilo\u015b\u0107 czasu programisty.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Przyjrzyjmy si\u0119 typowemu scenariuszowi: wysy\u0142aniu danych zam\u00f3wienia do systemu ERP. Payload musi zawiera\u0107 informacje o produkcie, dane u\u017cytkownika, szczeg\u00f3\u0142y wysy\u0142ki i informacje o p\u0142atno\u015bci. Rozwa\u017cmy te zmienne:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Trzy typy produkt\u00f3w: Wirtualny, Konfigurowalny i Prosty<\/li>\n\n\n\n<li>Dwie opcje dostawy bazuj\u0105ce na zawarto\u015bci koszyka (regularna wysy\u0142ka i dostawa elektroniczna)<\/li>\n\n\n\n<li>Dwa scenariusze - zalogowany u\u017cytkownik i go\u015b\u0107<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">To tworzy co najmniej sze\u015b\u0107 r\u00f3\u017cnych scenariuszy do weryfikacji funkcjonalno\u015bci kodu w r\u00f3\u017cnych kombinacjach produkt\u00f3w, opcji dostawy i stan\u00f3w uwierzytelnienia \u2013 nie licz\u0105c r\u00f3\u017cnych metod p\u0142atno\u015bci. Testy jednostkowe pozwalaj\u0105 na walidacj\u0119 niezawodno\u015bci kodu bez konieczno\u015bci wielokrotnego r\u0119cznego przechodzenia przez ca\u0142y proces checkout.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Praca z serwisami zewn\u0119trznymi<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Poprzedni przyk\u0142ad ERP rozci\u0105ga si\u0119 na ka\u017cd\u0105 integracj\u0119 wymagaj\u0105c\u0105 z\u0142o\u017conych zapyta\u0144 API lub obs\u0142ugi webhook\u00f3w. Podczas pracy z systemami zewn\u0119trznymi pojawia si\u0119 kilka czasoch\u0142onnych wyzwa\u0144:<\/p>\n\n\n\n<h4 class=\"wp-block-heading\">Niekompletne dane w systemach zewn\u0119trznych<\/h4>\n\n\n\n<p class=\"wp-block-paragraph\">Cz\u0119sto musisz rozpocz\u0105\u0107 integracj\u0119 przy minimalnej konfiguracji systemu zewn\u0119trznego. Dzia\u0142aj\u0105 tylko dost\u0119py i masz szcz\u0119\u015bcie, je\u015bli jest skonfigurowanych kilka element\u00f3w w systemie zewn\u0119trznym. Mo\u017cesz u\u017cy\u0107 PHPUnit do przygotowania swojego systemu do obs\u0142ugi wszystkich potencjalnych typ\u00f3w produkt\u00f3w \/ typ\u00f3w p\u0142atno\u015bci \/ typ\u00f3w klient\u00f3w itp. To wi\u0119cej ni\u017c pewne, \u017ce niekt\u00f3re z Twoich za\u0142o\u017ce\u0144 nie b\u0119d\u0105 trafne, ale b\u0119dziesz mie\u0107 wi\u0119kszo\u015b\u0107 kodu gotow\u0105 i pokryt\u0105 testami jednostkowymi, co pozwoli na elastyczne dostosowanie si\u0119 do nowych danych, gdy pojawi\u0105 si\u0119 podczas cyklu dostarczenia oprogramowania.<\/p>\n\n\n\n<h4 class=\"wp-block-heading\">Przygotowanie danych do ka\u017cdego testu<\/h4>\n\n\n\n<p class=\"wp-block-paragraph\">Integracje zewn\u0119trzne cz\u0119sto wymagaj\u0105 koordynacji z zespo\u0142ami klienta lub stronami trzecimi w zakresie przygotowania przypadk\u00f3w testowych. Testy jednostkowe pozwalaj\u0105 zmaksymalizowa\u0107 ka\u017cd\u0105 iteracj\u0119 testow\u0105 poprzez pokrycie przypadk\u00f3w brzegowych bez czekania na \u015brodowiska test\u00f3w integracyjnych.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">W tym scenariuszu przypadki testowe pozwol\u0105 Ci wycisn\u0105\u0107 wi\u0119cej z ka\u017cdej rundy poprzez dodanie przypadk\u00f3w brzegowych w testach jednostkowych i mo\u017cliwo\u015b\u0107 wielokrotnego wykonania zestawu test\u00f3w bez potrzeby czekania na test integracyjny, dzi\u0119ki czemu mo\u017cesz osi\u0105gn\u0105\u0107 wi\u0119cej w jednej iteracji. <\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Praca z algorytmami opartymi na czasie<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Systemy cz\u0119sto wymagaj\u0105 dzia\u0142a\u0144 zale\u017cnych od czasu, takich jak powiadomienia o porzuconym koszyku czy pro\u015bby o opini\u0119 po zakupie. Zazwyczaj zale\u017c\u0105 one od r\u00f3\u017cnych warunk\u00f3w, jak status uwierzytelnienia u\u017cytkownika, zgody marketingowe czy atrybuty kampanii marketingowej. Aby wszystko przetestowa\u0107, programi\u015bci najcz\u0119\u015bciej przygotowuj\u0105 skrypty SQL do mapowania i modyfikacji p\u00f3l created_at, updated_at i wielu innych w bazie danych w celu dostosowania systemu do r\u0119cznego testowania aplikacji. G\u0142\u00f3wnym problemem tego rozwi\u0105zania jest to, \u017ce rzadko jest ono aktualizowane zgodnie z wymaganiami i ka\u017cdy programista ma w\u0142asny zestaw takich zapyta\u0144 SQL. <\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Testy jednostkowe s\u0105 nieocenionym narz\u0119dziem wspieraj\u0105cym w szybszym wykonaniu zadania z dodatkowym udokumentowanym zachowaniem systemu kontrolowanym w tym samym repozytorium, w kt\u00f3rym istnieje kod. B\u0119dziesz musia\u0142 zaprojektowa\u0107 rozwi\u0105zanie, aby by\u0142o czyste i testowalne, ale nie b\u0119dzie to kosztowa\u0107 Ci\u0119 znacznie wi\u0119cej ni\u017c \"zwyk\u0142e\" programowanie. <\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Strukturyzuj sw\u00f3j kod, aby oddzieli\u0107 logik\u0119 biznesow\u0105 od frameworka i \u015brodowiska <\/li>\n\n\n\n<li>Projektuj punkty wej\u015bcia u\u017cywaj\u0105c obiekt\u00f3w z datami i flagami, kt\u00f3re okre\u015blaj\u0105 zachowanie systemu <\/li>\n\n\n\n<li>Stosuj zasady SOLID \u2013 oddzielaj obs\u0142ug\u0119 wiadomo\u015bci od logiki decyzyjnej <\/li>\n\n\n\n<li>Skup si\u0119 na testowaniu logiki biznesowej zamiast system\u00f3w wykonywania kolejek<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">Kod opracowany zgodnie z tymi zasadami umo\u017cliwia kompleksowe testowanie logiki biznesowej poprzez wstrzykiwane scenariusze testowe. Testy manualne mog\u0105 wtedy skupi\u0107 si\u0119 na walidacji og\u00f3lnego przep\u0142ywu danych i funkcjonalno\u015bci systemu wiadomo\u015bci, podczas gdy przypadki brzegowe pozostaj\u0105 pokryte testami jednostkowymi.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Podsumowanie<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Testowanie jednostkowe wykracza poza osi\u0105ganie wysokich wska\u017anik\u00f3w pokrycia czy umo\u017cliwianie praktyk CI\/CD. Gdy stosowane strategicznie, staje si\u0119 pot\u0119\u017cnym narz\u0119dziem do przyspieszania rozwoju przy jednoczesnym utrzymaniu jako\u015bci. Upewnij si\u0119, \u017ce Twoje projekty maj\u0105 mo\u017cliwo\u015bci testowania jednostkowego i w\u0142a\u015bciw\u0105 integracj\u0119 z pipeline'em od samego pocz\u0105tku \u2013 ta podstawa pozwoli Ci zwi\u0119kszy\u0107 szybko\u015b\u0107 rozwoju przy jednoczesnej poprawie jako\u015bci kodu.<\/p>","protected":false},"excerpt":{"rendered":"<p>When discussing the impact of unit tests on project budgets, the conventional wisdom suggests they represent an upfront investment that yields long-term returns. While achieving comprehensive test coverage across an entire project or specific modules is crucial for realizing these benefits, I&#8217;d like to explore scenarios where unit tests can actually accelerate development rather than [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":117,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"slim_seo":{"description":"Discover how strategic unit testing in PHP can accelerate development beyond just code quality. Learn practical scenarios where tests speed up delivery while maintaining reliability.","title":"In what cases Unit Tests will speed up development immediately - Krzysztof Pich"},"footnotes":""},"categories":[16],"tags":[],"class_list":["post-49","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-programming"],"_links":{"self":[{"href":"https:\/\/pich.pl\/pl\/wp-json\/wp\/v2\/posts\/49","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/pich.pl\/pl\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/pich.pl\/pl\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/pich.pl\/pl\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/pich.pl\/pl\/wp-json\/wp\/v2\/comments?post=49"}],"version-history":[{"count":8,"href":"https:\/\/pich.pl\/pl\/wp-json\/wp\/v2\/posts\/49\/revisions"}],"predecessor-version":[{"id":120,"href":"https:\/\/pich.pl\/pl\/wp-json\/wp\/v2\/posts\/49\/revisions\/120"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/pich.pl\/pl\/wp-json\/wp\/v2\/media\/117"}],"wp:attachment":[{"href":"https:\/\/pich.pl\/pl\/wp-json\/wp\/v2\/media?parent=49"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/pich.pl\/pl\/wp-json\/wp\/v2\/categories?post=49"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/pich.pl\/pl\/wp-json\/wp\/v2\/tags?post=49"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}