{"id":28263,"date":"2024-07-03T05:00:00","date_gmt":"2024-07-03T03:00:00","guid":{"rendered":"https:\/\/sii.pl\/blog\/?p=28263"},"modified":"2024-07-08T12:10:28","modified_gmt":"2024-07-08T10:10:28","slug":"cypress-testy-komponentow","status":"publish","type":"post","link":"https:\/\/sii.pl\/blog\/cypress-testy-komponentow\/","title":{"rendered":"Cypress \u2013 testy komponent\u00f3w"},"content":{"rendered":"\n<p>Testy komponent\u00f3w to do\u015b\u0107 nowe poj\u0119cie \u2013 zosta\u0142y wprowadzone w Cypress w wersji 10.0.0. w czerwcu 2022. Z implementacj\u0105 test\u00f3w komponent\u00f3w mieli\u015bmy do czynienia ju\u017c wcze\u015bniej, jednak nie na takim poziomie, na jakim jest ona realizowana obecnie.<\/p>\n\n\n\n<p>W artykule opisz\u0119, czym s\u0105 tytu\u0142owe testy komponent\u00f3w, przedstawi\u0119 ich przyk\u0142adow\u0105 przesz\u0142\u0105 oraz, korzystaj\u0105c z Cypressa, obecn\u0105 implementacj\u0119. Dodatkowo om\u00f3wi\u0119 wady i zalety tych rozwi\u0105za\u0144.<\/p>\n\n\n\n<p>Je\u017celi jeste\u015bcie zainteresowani tematyk\u0105 Cypressa, serdecznie zapraszam do zapoznania si\u0119 z moim poprzednim artyku\u0142em: <a href=\"https:\/\/sii.pl\/blog\/testy-automatyczne-cypress-czeka-az-wprowadzenie-do-waitow\/\">Testy automatyczne: Cypress czeka a\u017c\u2026 \u2013 wprowadzenie do wait\u00f3w<\/a> oraz z artyku\u0142em mojego kolegi Micha\u0142a: <a href=\"https:\/\/sii.pl\/blog\/cypress-dlaczego-warto-zainteresowac-sie-tym-frameworkiem\/\">Cypress \u2013 dlaczego warto zainteresowa\u0107 si\u0119 tym frameworkiem?<\/a><\/p>\n\n\n\n<h2 class=\"wp-block-heading\"><strong>Testy komponent\u00f3w \u2013 czym s\u0105?<\/strong><\/h2>\n\n\n\n<p>Testy komponent\u00f3w w obszarze testowania front-end odnosz\u0105 si\u0119 do praktyki sprawdzania pojedynczych komponent\u00f3w lub jednostek aplikacji internetowej w izolacji. G\u0142\u00f3wnym celem jest zapewnienie, \u017ce ka\u017cdy komponent zadzia\u0142a zgodnie z oczekiwaniami, ju\u017c we wczesnej fazie rozwoju.<\/p>\n\n\n\n<p>Komponenty w tym kontek\u015bcie to zazwyczaj mniejsze, niezale\u017cne fragmenty interfejsu u\u017cytkownika, takie jak:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>przyciski,<\/li>\n\n\n\n<li>formularze,<\/li>\n\n\n\n<li>niestandardowe elementy interfejsu.<\/li>\n<\/ul>\n\n\n\n<p>Przyk\u0142adowo \u2013 popularny \u201edate-picker\u201d idealnie wpisuje si\u0119 w t\u0119 definicj\u0119 i stanowi doskona\u0142y przedmiot sprawdzenia test\u00f3w na \u201ew\u0142asnej klawiaturze\u201d.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\"><strong>Korzy\u015bci wynikaj\u0105ce z test\u00f3w<\/strong><\/h2>\n\n\n\n<p>Testy te przynosz\u0105 szereg korzy\u015bci, a ich kr\u00f3tka charakterystyka jest nast\u0119puj\u0105ca:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Testy w izolacji<\/strong> \u2013 oznacza to, \u017ce nie potrzebujemy rzeczywistego dzia\u0142aj\u0105cego oprogramowania, serwisu, strony internetowej ani serwera, aby przeprowadzi\u0107 test. Dzi\u0119ki temu zyskujemy zar\u00f3wno na czasie, jak i na stabilno\u015bci tych test\u00f3w.<\/li>\n\n\n\n<li><strong>Ma\u0142e i szybkie testy<\/strong> \u2013 przeprowadzamy testy komponent\u00f3w prawie tak samo, jak testy jednostkowe. To pozwala nam w szybki spos\u00f3b wykry\u0107 ewentualne nieprawid\u0142owo\u015bci, co skutkuje wczesn\u0105 i stosunkowo niedrog\u0105 napraw\u0105.<\/li>\n\n\n\n<li><strong>\u0141atwy i czytelny kod<\/strong> \u2013 przy u\u017cyciu tej praktyki wprowadzamy \u0142atwo\u015b\u0107 utrzymania kodu i zwi\u0119kszamy jego przejrzysto\u015b\u0107. Aplikacja jest podzielona na mniejsze cz\u0119\u015bci, kt\u00f3re s\u0105 nast\u0119pnie testowane przez te w\u0142a\u015bnie komponentowe testy.<\/li>\n\n\n\n<li><strong>Automatyzacja i integracja<\/strong> \u2013 testy te mo\u017cna z \u0142atwo\u015bci\u0105 zautomatyzowa\u0107 i w\u0142\u0105czy\u0107 w narz\u0119dzia do ci\u0105g\u0142ej integracji. Mamy mo\u017cliwo\u015b\u0107 uruchamia\u0107 je lokalnie na kontenerze Docker, co jest szczeg\u00f3lnie przydatne, gdy dopiero rozpoczynamy swoj\u0105 przygod\u0119 z testami automatycznymi.<\/li>\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\"><strong>Ale po co nam w\u0142a\u015bciwie testy komponent\u00f3w?<\/strong><\/h2>\n\n\n\n<p>Aby odpowiedzie\u0107 na to pytanie, zapoznamy si\u0119 <strong>z potrzeb\u0105 oraz istot\u0105 test\u00f3w automatycznych<\/strong>.<\/p>\n\n\n\n<p>Test automatyczny to cz\u0119\u015b\u0107 procesu, w kt\u00f3rym sprawdzamy scenariusze testowe za pomoc\u0105 narz\u0119dzi do automatyzacji lub skrypt\u00f3w. Wa\u017cne jest jednak pami\u0119tanie o podstawach testowania, poniewa\u017c s\u0105 one kluczowe przy tworzeniu przypadk\u00f3w testowych.<\/p>\n\n\n\n<p>W moim przekonaniu, dobry test automatyczny powinien sk\u0142ada\u0107 si\u0119 z trzech element\u00f3w:<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li>danych testowych,<\/li>\n\n\n\n<li>krok\u00f3w,<\/li>\n\n\n\n<li>jednej asercji.<\/li>\n<\/ol>\n\n\n\n<p>Stawiaj\u0105c to ostatnie jako istotne kryterium, poruszam do\u015b\u0107 <strong>kontrowersyjny temat<\/strong>. Test, kt\u00f3ry sprawdza wiele rzeczy \u2013 moim zdaniem \u2013 jest niezbyt wiarygodny, trudny w utrzymaniu i weryfikacji.<\/p>\n\n\n\n<p><strong>Przyjrzyjmy si\u0119 sytuacji<\/strong>, gdzie chcemy napisa\u0107 test, kt\u00f3ry wysy\u0142a formularz rejestracji u\u017cytkownika. Wype\u0142niamy wszystkie pola i klikamy przycisk \u201ewy\u015blij\u201d za pomoc\u0105 cy.contains(&#8222;wy\u015blij&#8221;). Pojawia si\u0119 jednak pytanie \u2013 co si\u0119 stanie, je\u015bli nasz przycisk ma inny tekst, na przyk\u0142ad z powodu problem\u00f3w z wy\u015bwietlaniem polskich znak\u00f3w? Otrzymujemy wynik negatywny w te\u015bcie, kt\u00f3ry tworzy u\u017cytkownika, pomimo \u017ce ci\u0105g znak\u00f3w (popularnie nazywany stringiem), po kt\u00f3rym szukamy przycisku, jest inny.<\/p>\n\n\n\n<p><strong>Co mo\u017cemy zrobi\u0107 w tej sytuacji?<\/strong> Napisa\u0107 lepszy test! Mo\u017cemy u\u017cy\u0107 metody cy.get() i poda\u0107 tutaj nasz unikalny identyfikator (cy-data lokator). Ten spos\u00f3b eliminuje konieczno\u015b\u0107 wyszukiwania element\u00f3w po konkretnym ci\u0105gu znak\u00f3w i odnosi si\u0119 do lokatora. Jednak\u017ce, zdarza si\u0119, \u017ce korzystamy z metody cy.contains(), poniewa\u017c jest to bardziej wygodne i efektywne, ni\u017c w przypadku u\u017cycia metody cy.get().<\/p>\n\n\n\n<p>Co jednak, <strong>je\u015bli mieliby\u015bmy test komponentu<\/strong>, kt\u00f3ry generuje ten element z oczekiwanym ci\u0105giem znak\u00f3w, sprawdzaj\u0105c jednocze\u015bnie jego tekst, zachowanie i style CSS?<\/p>\n\n\n\n<p>Nasze narz\u0119dzie do ci\u0105g\u0142ej integracji nie pozwoli\u0142oby na uruchomienie kolejnych test\u00f3w bez naprawy tego, co daje wynik negatywny. Dzi\u0119ki wczesnemu wykryciu b\u0142\u0119du, mo\u017cemy szybko i tanio go naprawi\u0107. Dodatkowo, dzi\u0119ki temu <strong>unikniemy fa\u0142szywie negatywnych wynik\u00f3w<\/strong> w pozosta\u0142ych testach, gdzie to w\u0142a\u015bnie komponent jest winny, a nie logika samego kodu.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\"><strong>Testy komponent\u00f3w a piramida test\u00f3w<\/strong><\/h2>\n\n\n\n<p>Piramida test\u00f3w jest to \u201ewzorzec projektowy\u201d, kt\u00f3ry przedstawia nam kolejno\u015b\u0107 test\u00f3w oraz ich ilo\u015bci. Zgodnie z og\u00f3lnie przyj\u0119t\u0105 norm\u0105, dzieli si\u0119 ona na trzy poziomy. S\u0105 one u\u0142o\u017cone jeden na drugim, w kolejno\u015bci wzgl\u0119dem kosztu stworzenia\/utrzymania, czy te\u017c samego czasu wykonania.<\/p>\n\n\n\n<figure class=\"wp-block-image aligncenter size-full\"><a href=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2024\/06\/image1-3.png\"><img decoding=\"async\" width=\"373\" height=\"288\" src=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2024\/06\/image1-3.png\" alt=\"Piramida test\u00f3w przedstawiaj\u0105ca 3 g\u0142\u00f3wne poziomy test\u00f3w\" class=\"wp-image-28264\" srcset=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2024\/06\/image1-3.png 373w, https:\/\/sii.pl\/blog\/wp-content\/uploads\/2024\/06\/image1-3-300x232.png 300w\" sizes=\"(max-width: 373px) 100vw, 373px\" \/><\/a><figcaption class=\"wp-element-caption\">Ryc. 1 Piramida test\u00f3w przedstawiaj\u0105ca 3 g\u0142\u00f3wne poziomy test\u00f3w<\/figcaption><\/figure>\n\n\n\n<h3 class=\"wp-block-heading\"><strong>Unit testy<\/strong><\/h3>\n\n\n\n<p>Unit testy czyli testy jednostkowe \u2013 w wi\u0119kszo\u015bci przypadk\u00f3w pisane przez developer\u00f3w. Maj\u0105 one za zadanie sprawdzi\u0107 metod\u0119\/funkcj\u0119\/modu\u0142 na poziomie jednostkowym. Powinny mie\u0107 jak najwi\u0119ksze, realne pokrycie kodu.<\/p>\n\n\n\n<p>Przedstawia si\u0119 je jako podstaw\u0119\/fundament piramidy test\u00f3w, poniewa\u017c s\u0105:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>niezale\u017cne od zewn\u0119trznych serwis\u00f3w,<\/li>\n\n\n\n<li>niezwykle szybkie do napisania i wykonania,<\/li>\n\n\n\n<li>tanie w utrzymaniu i tworzeniu,<\/li>\n<\/ul>\n\n\n\n<p>Ponadto, mog\u0105 te\u017c by\u0107 traktowane jako swojego rodzaju dokumentacja projektowa.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\"><strong>Testy integracyjne<\/strong><\/h3>\n\n\n\n<p>Na kolejnym poziomie znajduj\u0105 si\u0119 testy integracyjne, w kt\u00f3rych sk\u0142ad wchodz\u0105 testy:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>systemowe,<\/li>\n\n\n\n<li>integracyjne.<\/li>\n<\/ul>\n\n\n\n<p>Sprawdzaj\u0105 one, czy poszczeg\u00f3lne modu\u0142y ze sob\u0105 rozmawiaj\u0105 \u2013 zar\u00f3wno z danymi testowymi, jak i realnymi. Pisane i wykonywane s\u0105 g\u0142\u00f3wnie przez tester\u00f3w, ale to te\u017c zale\u017cy od ustale\u0144 w danym zespole oraz od podej\u015bcia projektowego. Mog\u0105 by\u0107 uzale\u017cnione od zewn\u0119trznych serwis\u00f3w, w zale\u017cno\u015bci od skomplikowania, jednak s\u0105 zdecydowanie ta\u0144sze oraz szybsze od test\u00f3w E2E.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\"><strong>Testy End-to-End<\/strong><\/h3>\n\n\n\n<p>Testy E2E sprawdzaj\u0105 \u015bcie\u017cki biznesowe, zaczynaj\u0105c od stworzenia u\u017cytkownika, poprzez zakup przedmiotu w sklepie internetowym. Jednak posiadaj\u0105 nast\u0119puj\u0105ce wady:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>s\u0105 niestabilne,<\/li>\n\n\n\n<li>s\u0105 bardzo drogie w tworzeniu i utrzymaniu,<\/li>\n\n\n\n<li>pokrywaj\u0105 znikom\u0105 cz\u0119\u015b\u0107 kodu,<\/li>\n\n\n\n<li>czas wykonania tych test\u00f3w jest du\u017co d\u0142u\u017cszy ni\u017c test\u00f3w jednostkowych, czy te\u017c integracyjnych.<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\"><strong>A gdzie s\u0105 testy komponent\u00f3w w piramidzie test\u00f3w?<\/strong><\/h3>\n\n\n\n<p>Po tym, co przeczytali\u015bcie o samych testach komponent\u00f3w, jak i piramidzie test\u00f3w, mo\u017cecie wydedukowa\u0107, \u017ce testy komponent\u00f3w znajduj\u0105 si\u0119 pomi\u0119dzy warstw\u0105 jednostkow\u0105 a integracyjn\u0105.&nbsp;I dok\u0142adnie w tym miejscu ja je umieszczam.<\/p>\n\n\n\n<figure class=\"wp-block-image aligncenter size-full\"><a href=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2024\/06\/image2-1.png\"><img decoding=\"async\" width=\"365\" height=\"294\" src=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2024\/06\/image2-1.png\" alt=\"Piramida test\u00f3w z umiejscowieniem test\u00f3w komponent\u00f3w\" class=\"wp-image-28266\" srcset=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2024\/06\/image2-1.png 365w, https:\/\/sii.pl\/blog\/wp-content\/uploads\/2024\/06\/image2-1-300x242.png 300w\" sizes=\"(max-width: 365px) 100vw, 365px\" \/><\/a><figcaption class=\"wp-element-caption\">Ryc. 2 Piramida test\u00f3w z umiejscowieniem test\u00f3w komponent\u00f3w<\/figcaption><\/figure>\n\n\n\n<h2 class=\"wp-block-heading\"><strong>Kto powinien pisa\u0107\/tworzy\u0107 testy komponent\u00f3w?<\/strong><\/h2>\n\n\n\n<p>Powstaje pytanie o to, kto powinien tworzy\u0107 testy komponent\u00f3w. Sytuacja jest podobna, jak w przypadku test\u00f3w jednostkowych. \u0179r\u00f3d\u0142a internetowe twierdz\u0105, \u017ce za testy komponent\u00f3w odpowiedzialni si\u0105 deweloperzy, jednak z do\u015bwiadczenia wiem, \u017ce wi\u0119kszo\u015b\u0107 z nich skupia si\u0119 bardziej na implementacji kodu, ni\u017c pisaniu test\u00f3w. Jest to r\u00f3wnie\u017c <strong>dyskusyjny temat<\/strong> zwi\u0105zany z definicj\u0105 uko\u0144czenia, z podej\u015bciem projektowym oraz zespo\u0142owym.<\/p>\n\n\n\n<p>Moim zdaniem pisanie test\u00f3w komponent\u00f3w to idealne zadanie dla testera, kt\u00f3ry chce rozpocz\u0105\u0107 swoj\u0105 przygod\u0119 z testami automatycznymi, poniewa\u017c s\u0105 one \u0142atwe w przygotowaniu i utrzymaniu, a ich <strong>wyniki s\u0105 bardzo czytelne, rzetelne i transparentne<\/strong>.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\"><strong>Testy komponent\u00f3w w praktyce<\/strong><\/h2>\n\n\n\n<p>Przedstawi\u0119 i om\u00f3wi\u0119 dwa podej\u015bcia \u2013 stary i nowy spos\u00f3b tworzenia test\u00f3w komponent\u00f3w wraz z ich implementacj\u0105 w j\u0119zyku JavaScript z wykorzystaniem Cypressa.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\"><strong>Old-fashion way<\/strong><\/h3>\n\n\n\n<p>Stare podej\u015bcie \u2013 spotykane nie tylko w Cypressie, ale r\u00f3wnie\u017c w innych frameworkach testowych, gdzie nie mamy obecnie mo\u017cliwo\u015bci wy\u015bwietlania komponent\u00f3w. Znaj\u0105c ograniczenia, postarajmy si\u0119 to zaimplementowa\u0107.<\/p>\n\n\n\n<p>Chcemy, aby test sprawdzi\u0142, czy przycisk \u201eClick me\u201d na stronie spe\u0142nia oczekiwania. Weryfikujemy to na naszej uruchomionej lokalnej wersji tworzonego oprogramowania pod adresem <a href=\"http:\/\/localhost:4200\/\" target=\"_blank\" aria-label=\" (opens in a new tab)\" rel=\"noreferrer noopener\" class=\"ek-link\" rel=\"nofollow\" >http:\/\/localhost:4200\/<\/a>:<\/p>\n\n\n\n<figure class=\"wp-block-image aligncenter size-full\"><a href=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2024\/06\/image3-2.png\"><img decoding=\"async\" width=\"717\" height=\"396\" src=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2024\/06\/image3-2.png\" alt=\"Weryfikacja dzia\u0142ania przycisku \u201eClick me\u201d\" class=\"wp-image-28268\" srcset=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2024\/06\/image3-2.png 717w, https:\/\/sii.pl\/blog\/wp-content\/uploads\/2024\/06\/image3-2-300x166.png 300w\" sizes=\"(max-width: 717px) 100vw, 717px\" \/><\/a><figcaption class=\"wp-element-caption\">Ryc. 3 Weryfikacja dzia\u0142ania przycisku \u201eClick me\u201d<\/figcaption><\/figure>\n\n\n\n<p>Tworzymy przypadki testowe i sprawdzamy, czy to dzia\u0142a:<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li>Sprawd\u017a, czy przycisk ma napis \u201eClick me\u201d.<\/li>\n\n\n\n<li>Sprawd\u017a, czy przycisk ma czerwony kolor t\u0142a.<\/li>\n\n\n\n<li>Sprawd\u017a, czy przycisk wy\u015bwietla poprawnie text 1!2#45.<\/li>\n\n\n\n<li>Sprawd\u017a, czy przycisk wy\u015bwietla poprawnie zmieniony kolor na niebieski.<\/li>\n<\/ol>\n\n\n\n<figure class=\"wp-block-image aligncenter size-full\"><a href=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2024\/06\/image4-1.png\"><img decoding=\"async\" width=\"721\" height=\"592\" src=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2024\/06\/image4-1.png\" alt=\"kod\" class=\"wp-image-28270\" srcset=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2024\/06\/image4-1.png 721w, https:\/\/sii.pl\/blog\/wp-content\/uploads\/2024\/06\/image4-1-300x246.png 300w\" sizes=\"(max-width: 721px) 100vw, 721px\" \/><\/a><\/figure>\n\n\n\n<p>Przedstawiony kod wygl\u0105da schludnie i czytelnie. Przy zastosowaniu wzorca projektowego Page-Object i wyciagni\u0119ciu do zmiennych powtarzaj\u0105cych si\u0119 element\u00f3w, mo\u017cemy uzyska\u0107 jeszcze bardziej przejrzysty kod. Jego wad\u0105 niew\u0105tpliwie jest czas wykonywania, kt\u00f3ry przy czterech testach wynosi tylko, albo a\u017c, 809ms.<\/p>\n\n\n\n<p>Musimy zwr\u00f3ci\u0107 uwag\u0119 na to, \u017ce do przycisku dostajemy si\u0119 natychmiast po za\u0142adowaniu \u201elocalhosta\u201d. Nie wymaga on \u017cadnej dodatkowe interakcji, co przy czterech przypadkach testowych pozwala nam osi\u0105gn\u0105\u0107 akceptowalny czas. Jednak\u017ce bardziej skomplikowane jest wyodr\u0119bnienie poszczeg\u00f3lnych element\u00f3w. Przyk\u0142adowo \u2013 edycji u\u017cytkownika z trzeciej strony formularza, aby dotrze\u0107 do przycisku reset, kt\u00f3ry jednak pojawia si\u0119 dopiero po dokonaniu edycji dowolnego pola.<\/p>\n\n\n\n<p>I nagle test wygl\u0105da tak:<\/p>\n\n\n\n<figure class=\"wp-block-image aligncenter size-full\"><a href=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2024\/06\/image5-3.png\"><img decoding=\"async\" width=\"352\" height=\"173\" src=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2024\/06\/image5-3.png\" alt=\"kod\" class=\"wp-image-28272\" srcset=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2024\/06\/image5-3.png 352w, https:\/\/sii.pl\/blog\/wp-content\/uploads\/2024\/06\/image5-3-300x147.png 300w\" sizes=\"(max-width: 352px) 100vw, 352px\" \/><\/a><\/figure>\n\n\n\n<p>W takim przypadku istnieje zagro\u017cenie, \u017ce stracimy sporo czasu na pozyskanie tego elementu, co mo\u017ce prowadzi\u0107 do znacznego wzrostu kodu oraz uzale\u017cnienia od innych serwis\u00f3w.<\/p>\n\n\n\n<p>Co by si\u0119 sta\u0142o, gdyby\u015bmy sprawdzili przycisk na \u201eprodukcyjnym\u201d serwerze? Wykonanie tych czterech test\u00f3w zaj\u0119\u0142o mi 12 sekund.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\"><strong>Co mo\u017cemy zrobi\u0107, aby nasz test by\u0142 lepszy i szybszy?<\/strong><\/h2>\n\n\n\n<p>Co warto uwzgl\u0119dni\u0107, by testy by\u0142y bardziej efektywne:<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li>Je\u017celi mamy StoryBooka lub inne podobne narz\u0119dzie, napiszmy testy w tym narz\u0119dziu. Mo\u017cemy napotka\u0107 nieprzyjemno\u015bci z Iframe, jednak ich skala jest drastycznie mniejsza do czasu uruchomienia tych test\u00f3w. Ponadto s\u0105 one bardzo zbli\u017cone do samych test\u00f3w komponent\u00f3w.<\/li>\n\n\n\n<li>Po\u0142\u0105czmy wszystkie asercje w jednym te\u015bcie, korzystaj\u0105c z tzw. Soft asercji (asercja, kt\u00f3ra w monecie wyst\u0105pienia nie przerywa testu), aby zaoszcz\u0119dzi\u0107 czas podczas odwiedzania strony lub elementu. Pomys\u0142 ten mo\u017ce by\u0107 korzystny, zw\u0142aszcza z odpowiednim reporterem, co mo\u017ce naprawd\u0119 zaowocowa\u0107. (Jest to potencjalny antywzorzec, poniewa\u017c test powinien sk\u0142ada\u0107 si\u0119 z jednej asercji, ale&#8230; to temat na osobny wpis). Uda\u0142o mi si\u0119 uzyska\u0107 czas 358 ms.<\/li>\n\n\n\n<li>Nie od\u015bwie\u017cajmy strony i wykonajmy asercje w osobnych testach (antywzorzec, poniewa\u017c testy s\u0105 zale\u017cne od siebie). Czas: 278 ms.<\/li>\n\n\n\n<li>Wykorzystajmy testy komponent\u00f3w dostarczone od Cypressa z wykorzystaniem metody cy.mount()!<\/li>\n<\/ol>\n\n\n\n<figure class=\"wp-block-image aligncenter size-full\"><a href=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2024\/06\/image6-2.png\"><img decoding=\"async\" width=\"688\" height=\"535\" src=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2024\/06\/image6-2.png\" alt=\"kod\" class=\"wp-image-28274\" srcset=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2024\/06\/image6-2.png 688w, https:\/\/sii.pl\/blog\/wp-content\/uploads\/2024\/06\/image6-2-300x233.png 300w\" sizes=\"(max-width: 688px) 100vw, 688px\" \/><\/a><\/figure>\n\n\n\n<p>Dzi\u0119ki tej metodzie mamy mo\u017cliwo\u015b\u0107 wygenerowania komponentu pojedynczo poprzez jego import i przekazanie go do metody mount(). Oszcz\u0119dzamy czas na pisanie i egzekucj\u0119, nasz kod jest przejrzysty, a testy wiarygodne. Czas, jaki otrzyma\u0142em, to 162 ms! Czyli najlepszy jak do tej pory.<\/p>\n\n\n\n<figure class=\"wp-block-image aligncenter size-large\"><a href=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2024\/06\/image7-3.png\"><img decoding=\"async\" width=\"1024\" height=\"244\" src=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2024\/06\/image7-3-1024x244.png\" alt=\"Testy komponent\u00f3w\" class=\"wp-image-28276\" srcset=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2024\/06\/image7-3-1024x244.png 1024w, https:\/\/sii.pl\/blog\/wp-content\/uploads\/2024\/06\/image7-3-300x72.png 300w, https:\/\/sii.pl\/blog\/wp-content\/uploads\/2024\/06\/image7-3-768x183.png 768w, https:\/\/sii.pl\/blog\/wp-content\/uploads\/2024\/06\/image7-3.png 1429w\" sizes=\"(max-width: 1024px) 100vw, 1024px\" \/><\/a><figcaption class=\"wp-element-caption\">Ryc. 4 Testy komponent\u00f3w<\/figcaption><\/figure>\n\n\n\n<h2 class=\"wp-block-heading\"><strong>Je\u015bli nie Cypress, to co?<\/strong><\/h2>\n\n\n\n<p>Testowanie komponent\u00f3w nie ogranicza si\u0119 jedynie do narz\u0119dzia Cypress. Istnieje szereg alternatywnych narz\u0119dzi, takich jak:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Jest,<\/li>\n\n\n\n<li>Enzyme,<\/li>\n\n\n\n<li>Vue Test Utils,<\/li>\n<\/ul>\n\n\n\n<p>kt\u00f3re r\u00f3wnie\u017c mog\u0105 by\u0107 skutecznie u\u017cywane do tej praktyki.<\/p>\n\n\n\n<p>Te r\u00f3\u017cnorodne opcje pozwalaj\u0105 deweloperom na dostosowywanie narz\u0119dzi do konkretnych potrzeb projektu, co staje si\u0119 szczeg\u00f3lnie istotne w sytuacjach, gdy Cypress, z r\u00f3\u017cnych powod\u00f3w, nie spe\u0142nia oczekiwa\u0144.<\/p>\n\n\n\n<p>***<\/p>\n\n\n\n<p>Wi\u0119cej o Cypress dowiesz si\u0119 <a href=\"https:\/\/sii.pl\/blog\/all\/cypress\/\" target=\"_blank\" aria-label=\"z innych artyku\u0142\u00f3w naszych ekspert\u00f3w (opens in a new tab)\" rel=\"noreferrer noopener\" class=\"ek-link\">z innych artyku\u0142\u00f3w naszych ekspert\u00f3w<\/a>. <\/p>\n\n\n<div class=\"kk-star-ratings kksr-auto kksr-align-left kksr-valign-bottom\"\n    data-payload='{&quot;align&quot;:&quot;left&quot;,&quot;id&quot;:&quot;28263&quot;,&quot;slug&quot;:&quot;default&quot;,&quot;valign&quot;:&quot;bottom&quot;,&quot;ignore&quot;:&quot;&quot;,&quot;reference&quot;:&quot;auto&quot;,&quot;class&quot;:&quot;&quot;,&quot;count&quot;:&quot;13&quot;,&quot;legendonly&quot;:&quot;&quot;,&quot;readonly&quot;:&quot;&quot;,&quot;score&quot;:&quot;4.7&quot;,&quot;starsonly&quot;:&quot;&quot;,&quot;best&quot;:&quot;5&quot;,&quot;gap&quot;:&quot;11&quot;,&quot;greet&quot;:&quot;&quot;,&quot;legend&quot;:&quot;4.7\\\/5 ( votes: 13)&quot;,&quot;size&quot;:&quot;18&quot;,&quot;title&quot;:&quot;Cypress \u2013 testy komponent\u00f3w&quot;,&quot;width&quot;:&quot;130.8&quot;,&quot;_legend&quot;:&quot;{score}\\\/{best} ( {votes}: {count})&quot;,&quot;font_factor&quot;:&quot;1.25&quot;}'>\n            \n<div class=\"kksr-stars\">\n    \n<div class=\"kksr-stars-inactive\">\n            <div class=\"kksr-star\" data-star=\"1\" style=\"padding-right: 11px\">\n            \n\n<div class=\"kksr-icon\" style=\"width: 18px; height: 18px;\"><\/div>\n        <\/div>\n            <div class=\"kksr-star\" data-star=\"2\" style=\"padding-right: 11px\">\n            \n\n<div class=\"kksr-icon\" style=\"width: 18px; height: 18px;\"><\/div>\n        <\/div>\n            <div class=\"kksr-star\" data-star=\"3\" style=\"padding-right: 11px\">\n            \n\n<div class=\"kksr-icon\" style=\"width: 18px; height: 18px;\"><\/div>\n        <\/div>\n            <div class=\"kksr-star\" data-star=\"4\" style=\"padding-right: 11px\">\n            \n\n<div class=\"kksr-icon\" style=\"width: 18px; height: 18px;\"><\/div>\n        <\/div>\n            <div class=\"kksr-star\" data-star=\"5\" style=\"padding-right: 11px\">\n            \n\n<div class=\"kksr-icon\" style=\"width: 18px; height: 18px;\"><\/div>\n        <\/div>\n    <\/div>\n    \n<div class=\"kksr-stars-active\" style=\"width: 130.8px;\">\n            <div class=\"kksr-star\" style=\"padding-right: 11px\">\n            \n\n<div class=\"kksr-icon\" style=\"width: 18px; height: 18px;\"><\/div>\n        <\/div>\n            <div class=\"kksr-star\" style=\"padding-right: 11px\">\n            \n\n<div class=\"kksr-icon\" style=\"width: 18px; height: 18px;\"><\/div>\n        <\/div>\n            <div class=\"kksr-star\" style=\"padding-right: 11px\">\n            \n\n<div class=\"kksr-icon\" style=\"width: 18px; height: 18px;\"><\/div>\n        <\/div>\n            <div class=\"kksr-star\" style=\"padding-right: 11px\">\n            \n\n<div class=\"kksr-icon\" style=\"width: 18px; height: 18px;\"><\/div>\n        <\/div>\n            <div class=\"kksr-star\" style=\"padding-right: 11px\">\n            \n\n<div class=\"kksr-icon\" style=\"width: 18px; height: 18px;\"><\/div>\n        <\/div>\n    <\/div>\n<\/div>\n                \n\n<div class=\"kksr-legend\" style=\"font-size: 14.4px;\">\n            4.7\/5 ( votes: 13)    <\/div>\n    <\/div>\n","protected":false},"excerpt":{"rendered":"<p>Testy komponent\u00f3w to do\u015b\u0107 nowe poj\u0119cie \u2013 zosta\u0142y wprowadzone w Cypress w wersji 10.0.0. w czerwcu 2022. Z implementacj\u0105 test\u00f3w &hellip; <a class=\"continued-btn\" href=\"https:\/\/sii.pl\/blog\/cypress-testy-komponentow\/\">Continued<\/a><\/p>\n","protected":false},"author":460,"featured_media":28350,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"_editorskit_title_hidden":false,"_editorskit_reading_time":0,"_editorskit_is_block_options_detached":false,"_editorskit_block_options_position":"{}","inline_featured_image":false,"footnotes":""},"categories":[1317],"tags":[2221,1546,1051],"class_list":["post-28263","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-testowanie","tag-testy-komponentow","tag-przeglad-narzedzi","tag-cypress"],"acf":[],"aioseo_notices":[],"republish_history":[],"featured_media_url":"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2024\/07\/Cypress_testy-komponentow.jpg","category_names":["Testowanie"],"_links":{"self":[{"href":"https:\/\/sii.pl\/blog\/wp-json\/wp\/v2\/posts\/28263"}],"collection":[{"href":"https:\/\/sii.pl\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/sii.pl\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/sii.pl\/blog\/wp-json\/wp\/v2\/users\/460"}],"replies":[{"embeddable":true,"href":"https:\/\/sii.pl\/blog\/wp-json\/wp\/v2\/comments?post=28263"}],"version-history":[{"count":3,"href":"https:\/\/sii.pl\/blog\/wp-json\/wp\/v2\/posts\/28263\/revisions"}],"predecessor-version":[{"id":28370,"href":"https:\/\/sii.pl\/blog\/wp-json\/wp\/v2\/posts\/28263\/revisions\/28370"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/sii.pl\/blog\/wp-json\/wp\/v2\/media\/28350"}],"wp:attachment":[{"href":"https:\/\/sii.pl\/blog\/wp-json\/wp\/v2\/media?parent=28263"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/sii.pl\/blog\/wp-json\/wp\/v2\/categories?post=28263"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/sii.pl\/blog\/wp-json\/wp\/v2\/tags?post=28263"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}