{"id":7985,"date":"2020-01-21T10:00:03","date_gmt":"2020-01-21T09:00:03","guid":{"rendered":"https:\/\/sii.pl\/blog\/?p=7985"},"modified":"2023-10-06T11:38:18","modified_gmt":"2023-10-06T09:38:18","slug":"codeceptjs-czesc-2","status":"publish","type":"post","link":"https:\/\/sii.pl\/blog\/codeceptjs-czesc-2\/","title":{"rendered":"CodeceptJS \u2013 cz\u0119\u015b\u0107 2 &#8211; uruchamianie wsp\u00f3\u0142bie\u017cne, page object pattern"},"content":{"rendered":"\n<p>W poprzednim wpisie pokaza\u0142em jak zacz\u0105\u0107 prac\u0119 z CodeceptJS. <\/p>\n\n\n\n<p>Je\u017celi jeszcze nie mia\u0142e\u015b okazji z nim zapozna\u0107 si\u0119, zach\u0119cam do czytania <a href=\"https:\/\/sii.pl\/blog\/codeceptjs-przyjazna-automatyzacja-testow-akceptacyjnych-dla-www\/\" target=\"_blank\" rel=\"noopener\">link<\/a>. W dzisiejszym wpisie chce pokaza\u0107, jak zaimplementowa\u0107 page object pattern dla CodeceptJS oraz, jak skorzysta\u0107 z kilku przydatnych funkcji, kt\u00f3re s\u0105 dost\u0119pne dla tego frameworka.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Czego dowiesz si\u0119 z tekstu?<\/h2>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Jak zaimplementowa\u0107 page object pattern dla CodeceptJS?<\/li>\n\n\n\n<li>Jak uruchomi\u0107 testy wsp\u00f3\u0142bie\u017cnie?<\/li>\n\n\n\n<li>Jak skorzysta\u0107 z Data Table?<\/li>\n<\/ul>\n\n\n\n<p>Zaczn\u0119 od pokazania, w jaki spos\u00f3b w CodeCeptJS mo\u017cliwe jest uruchomienie test\u00f3w wsp\u00f3\u0142bie\u017cnie. Kopiuje&nbsp;przypadek testowy, kt\u00f3ry utworzy\u0142em w poprzednim wpisie i wklejam go cztery razy. &nbsp;Robi\u0119 to po to, \u017cebym m\u00f3g\u0142 pokaza\u0107 Ci dzia\u0142anie wsp\u00f3\u0142bie\u017cno\u015bci, a do tego potrzebne jest posiadanie wi\u0119cej test\u00f3w ni\u017c jeden. W kodzie prezentuj\u0119 si\u0119 to tak:<\/p>\n\n\n\n<figure class=\"wp-block-image aligncenter\"><a href=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2019\/09\/repeated_tests.png\"><img decoding=\"async\" width=\"1185\" height=\"853\" src=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2019\/09\/repeated_tests.png\" alt=\"fragment kodu\" class=\"wp-image-7986\" srcset=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2019\/09\/repeated_tests.png 1185w, https:\/\/sii.pl\/blog\/wp-content\/uploads\/2019\/09\/repeated_tests-300x216.png 300w, https:\/\/sii.pl\/blog\/wp-content\/uploads\/2019\/09\/repeated_tests-1024x737.png 1024w\" sizes=\"(max-width: 1185px) 100vw, 1185px\" \/><\/a><\/figure>\n\n\n\n<p>Kolejnym krokiem jest zapisanie tego pliku i skorzystanie z parametru run-workers 5, kt\u00f3ry uruchomi testy w spos\u00f3b wsp\u00f3\u0142bie\u017cny.<\/p>\n\n\n\n<figure class=\"wp-block-image aligncenter\"><a href=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2019\/09\/codeceptjs_minimum_version_node.png\"><img decoding=\"async\" width=\"628\" height=\"32\" src=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2019\/09\/codeceptjs_minimum_version_node.png\" alt=\"\" class=\"wp-image-7987\" srcset=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2019\/09\/codeceptjs_minimum_version_node.png 628w, https:\/\/sii.pl\/blog\/wp-content\/uploads\/2019\/09\/codeceptjs_minimum_version_node-300x15.png 300w\" sizes=\"(max-width: 628px) 100vw, 628px\" \/><\/a><\/figure>\n\n\n\n<p><span style=\"color: #000000; font-family: Calibri;\">&nbsp;<\/span><\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Co, je\u017celi natrafimy na taki b\u0142\u0105d?<\/h2>\n\n\n\n<p>W tym przypadku trzeba pobra\u0107 wy\u017csz\u0105 wersje Node JSa.<\/p>\n\n\n\n<figure class=\"wp-block-image aligncenter\"><a href=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2019\/09\/node_js_version_higher.png\"><img decoding=\"async\" width=\"605\" height=\"297\" src=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2019\/09\/node_js_version_higher.png\" alt=\"pobieranie wy\u017cszej wersji\" class=\"wp-image-7988\" srcset=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2019\/09\/node_js_version_higher.png 605w, https:\/\/sii.pl\/blog\/wp-content\/uploads\/2019\/09\/node_js_version_higher-300x147.png 300w\" sizes=\"(max-width: 605px) 100vw, 605px\" \/><\/a><\/figure>\n\n\n\n<p>Wybra\u0142em drug\u0105 opcj\u0119. W moim przypadku jest to instalacja node js dla Windowsa. Po tym kroku uruchamianie test\u00f3w w spos\u00f3b wsp\u00f3\u0142bie\u017cny b\u0119dzie dzia\u0142a\u0107.<\/p>\n\n\n\n<p>Filmik jak dzia\u0142aj\u0105 testy wsp\u00f3\u0142bie\u017cnie w trybie headless z Puppeteerem:<\/p>\n\n\n\n<figure class=\"wp-block-image aligncenter\"><a href=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2019\/09\/codecept_js_parallel.gif\"><img decoding=\"async\" width=\"600\" height=\"338\" src=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2019\/09\/codecept_js_parallel.gif\" alt=\"\" class=\"wp-image-7990\"\/><\/a><\/figure>\n\n\n\n<p>Je\u017celi chcia\u0142by\u015b widzie\u0107 okno przegl\u0105darki podczas egzekucji test\u00f3w, to w ustawieniach&nbsp;codecept.conf.js parametr show trzeba zmieni\u0107 na <strong>true<\/strong>. Domy\u015blnie testy uruchamiane s\u0105 w trybie headless.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\"><span lang=\"EN-US\">Implementacja page object<\/span><\/h2>\n\n\n\n<p>Kod, kt\u00f3ry utworzy\u0142em w poprzednim wpisie, w tym kroku dostosuje do page object pattern.&nbsp; Potrzebuje zdefiniowa\u0107 metod\u0119, kt\u00f3ra b\u0119dzie wype\u0142nia\u0142a tre\u015bci\u0105 formularz kontaktowy. CodeceptJS ma mo\u017cliwo\u015b\u0107 wygenerowania w prosty spos\u00f3b page objectu dla okre\u015blonej strony.<\/p>\n\n\n\n<figure class=\"wp-block-image aligncenter\"><a href=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2019\/09\/codecept_own_steps.png\"><img decoding=\"async\" width=\"1033\" height=\"258\" src=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2019\/09\/codecept_own_steps.png\" alt=\"fragment kodu\" class=\"wp-image-7991\" srcset=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2019\/09\/codecept_own_steps.png 1033w, https:\/\/sii.pl\/blog\/wp-content\/uploads\/2019\/09\/codecept_own_steps-300x75.png 300w, https:\/\/sii.pl\/blog\/wp-content\/uploads\/2019\/09\/codecept_own_steps-1024x256.png 1024w\" sizes=\"(max-width: 1033px) 100vw, 1033px\" \/><\/a><\/figure>\n\n\n\n<p>Przechodz\u0119 do konsoli. W tzw. \u201ehelpie\u201d CodeceptJSa mam podpowied\u017a, \u017ce mog\u0119 u\u017cy\u0107 komendy <strong>codeceptjs gpo<\/strong>, kt\u00f3ra stworzy mi pusty page object. Po dodaniu pliku z page objectem przechodz\u0119 do dodania metody, kt\u00f3ra wype\u0142ni tre\u015bci\u0105 formularz kontaktowy.<\/p>\n\n\n\n<p>Ta komenda zawiera prosty konfigurator. Jestem pytany o to jak page object ma si\u0119 nazywa\u0107. Nada\u0142em nazw\u0119 contactFormPage nast\u0119pnie wybra\u0142em gdzie ma znale\u017a\u0107 si\u0119 m\u00f3j page object. Zostawi\u0142em domy\u015bln\u0105 \u015bcie\u017ck\u0119 \u201e.\/pages\/contactFormPage.js\u201d. W tym miejscu CodeceptJS stworzy folder pages, je\u017celi jeszcze go nie ma na dysku. Po stworzeniu mog\u0119 przej\u015b\u0107 do implementacji, kt\u00f3r\u0105 b\u0119dzie zawiera\u0142 ten page object.<\/p>\n\n\n\n<p>Nast\u0119pnie nale\u017cy doda\u0107 page object do codecept.conf.js<\/p>\n\n\n\n<figure class=\"wp-block-image aligncenter\"><a href=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2019\/09\/codecept_js_include.png\"><img decoding=\"async\" width=\"481\" height=\"90\" src=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2019\/09\/codecept_js_include.png\" alt=\"fragment kodu\" class=\"wp-image-7992\" srcset=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2019\/09\/codecept_js_include.png 481w, https:\/\/sii.pl\/blog\/wp-content\/uploads\/2019\/09\/codecept_js_include-300x56.png 300w\" sizes=\"(max-width: 481px) 100vw, 481px\" \/><\/a><\/figure>\n\n\n\n<p>Teraz wracam do pliku <strong>contactFormPage.js<\/strong> i implementuje metod\u0119, kt\u00f3ra b\u0119dzie wype\u0142nia\u0142a formularz kontaktowy i go wysy\u0142a\u0142a. Rozpoczynam od dodania nazwy metody w tym wypadku b\u0119dzie to fillForm(name, email, comment).<\/p>\n\n\n\n<p>Metoda sk\u0142ada si\u0119 z czterech linijek. Zaczynam od podania warto\u015bci dla pola Name, nast\u0119pnie przekazuje warto\u015b\u0107 pola Email oraz dla pola Comment. Metod\u0119 ko\u0144cz\u0119 wys\u0142aniem formularza. Kto\u015b m\u00f3g\u0142by zapyta\u0107, czemu r\u00f3wnie\u017c asercji tutaj nie umie\u015bci\u0142em? Uwa\u017cam, \u017ce lepiej, gdy asercja znajduje si\u0119 w samym kodzie testu, bo:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Od razu w te\u015bcie wida\u0107 co jest sprawdzane.<\/li>\n\n\n\n<li>Nie trzeba wchodzi\u0107 do implementacji metody.<\/li>\n\n\n\n<li>Czasem nazwa metody mo\u017ce by\u0107 myl\u0105ca, a asercja odnosi si\u0119 do czego\u015b innego.<\/li>\n<\/ul>\n\n\n\n<figure class=\"wp-block-image aligncenter\"><a href=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2019\/09\/codecept_page_object.png\"><img decoding=\"async\" width=\"398\" height=\"241\" src=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2019\/09\/codecept_page_object.png\" alt=\"fragment kodu\" class=\"wp-image-7993\" srcset=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2019\/09\/codecept_page_object.png 398w, https:\/\/sii.pl\/blog\/wp-content\/uploads\/2019\/09\/codecept_page_object-300x182.png 300w\" sizes=\"(max-width: 398px) 100vw, 398px\" \/><\/a><\/figure>\n\n\n\n<p><span style=\"color: #000000; font-family: Calibri;\"><\/span>Przechodz\u0119 do contactForm_test.js, aby korzysta\u0107 z page objecta potrzebuje w parametrze testu przekaza\u0107 nazw\u0119 page objecta. <\/p>\n\n\n\n<figure class=\"wp-block-image aligncenter size-large\"><a href=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2023\/10\/scenario_with_page_as_parameter.png\"><img decoding=\"async\" width=\"1024\" height=\"112\" src=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2023\/10\/scenario_with_page_as_parameter-1024x112.png\" alt=\"fragment kodu contactFormPage\" class=\"wp-image-24890\" srcset=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2023\/10\/scenario_with_page_as_parameter-1024x112.png 1024w, https:\/\/sii.pl\/blog\/wp-content\/uploads\/2023\/10\/scenario_with_page_as_parameter-300x33.png 300w, https:\/\/sii.pl\/blog\/wp-content\/uploads\/2023\/10\/scenario_with_page_as_parameter-768x84.png 768w, https:\/\/sii.pl\/blog\/wp-content\/uploads\/2023\/10\/scenario_with_page_as_parameter.png 1106w\" sizes=\"(max-width: 1024px) 100vw, 1024px\" \/><\/a><\/figure>\n\n\n\n<p>Gdy zdefiniowa\u0142em to w ten spos\u00f3b, od tego momentu mog\u0119 korzysta\u0107 z page objecta w tym te\u015bcie. Test ma teraz trzy linijki zamiast wcze\u015bniejszych o\u015bmiu. Jako parametry podaje wcze\u015bniej u\u017cywane dane testowe. Zmiany dokonuje dla wszystkich skopiowanych test\u00f3w.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Przydatne opcje<\/h2>\n\n\n\n<p>W ostatnim wpisie nie poruszy\u0142em tego, w jaki spos\u00f3b mog\u0119 debugowa\u0107 testy napisane w CodeceptJS. Jednym ze sposob\u00f3w jest skorzystanie z interaktywnego shella. \u017beby z tego skorzysta\u0107, u\u017cywam komendy:<\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: plain; gutter: false; title: ; notranslate\" title=\"\">\nnpx codeceptjs shell\n<\/pre><\/div>\n\n\n<p>Dzi\u0119ki temu CodeceptJS otwiera okno przegl\u0105darki i mog\u0119 przetestowa\u0107 ka\u017cd\u0105 metod\u0119 CodeceptJS, kt\u00f3ra jest po&nbsp; &#8222;I.&#8221;&nbsp; w konsoli. W \u0142atwy spos\u00f3b sprawdzenie tego, czy kod b\u0119dzie dzia\u0142a\u0142 dla przegl\u0105darki.<\/p>\n\n\n\n<p>Innym sposobem na interaktywne debugowanie dla CodeceptJS jest dodanie &#8222;pause&#8221; pomi\u0119dzy akcjami. Ta komenda zatrzyma przegl\u0105dark\u0119 i mo\u017cemy sprawdzi\u0107, jak zachowuje si\u0119 dany test.<\/p>\n\n\n\n<figure class=\"wp-block-image aligncenter\"><a href=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2019\/09\/codeceptjs_debugging.png\"><img decoding=\"async\" width=\"1198\" height=\"472\" src=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2019\/09\/codeceptjs_debugging.png\" alt=\"fragment kodu\" class=\"wp-image-8389\" srcset=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2019\/09\/codeceptjs_debugging.png 1198w, https:\/\/sii.pl\/blog\/wp-content\/uploads\/2019\/09\/codeceptjs_debugging-300x118.png 300w, https:\/\/sii.pl\/blog\/wp-content\/uploads\/2019\/09\/codeceptjs_debugging-1024x403.png 1024w\" sizes=\"(max-width: 1198px) 100vw, 1198px\" \/><\/a><\/figure>\n\n\n\n<p>Dry \u2013 run pokazuje jakie testy zostan\u0105 uruchomione.<\/p>\n\n\n\n<figure class=\"wp-block-image aligncenter\"><a href=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2019\/09\/codecept_dry_run.png\"><img decoding=\"async\" width=\"798\" height=\"166\" src=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2019\/09\/codecept_dry_run.png\" alt=\"fragment kodu\" class=\"wp-image-7995\" srcset=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2019\/09\/codecept_dry_run.png 798w, https:\/\/sii.pl\/blog\/wp-content\/uploads\/2019\/09\/codecept_dry_run-300x62.png 300w\" sizes=\"(max-width: 798px) 100vw, 798px\" \/><\/a><\/figure>\n\n\n\n<div style=\"height:20px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<h2 class=\"wp-block-heading\">CodeCeptJS &#8211; bardziej zaawansowany przyk\u0142ad<b><\/b><\/h2>\n\n\n\n<p>Tym razem przechodz\u0119 do bardziej zaawansowanego przyk\u0142adu, bo b\u0119d\u0119 korzysta\u0142 z Data Driven Tests. Czyli mo\u017cliwo\u015bci tworzenia i korzystania z danych testowych w spos\u00f3b dynamiczny.<\/p>\n\n\n\n<figure class=\"wp-block-image aligncenter\"><a href=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2019\/09\/login_to_account.png\"><img decoding=\"async\" width=\"572\" height=\"605\" src=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2019\/09\/login_to_account.png\" alt=\"Widok logowania\" class=\"wp-image-8007\" srcset=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2019\/09\/login_to_account.png 572w, https:\/\/sii.pl\/blog\/wp-content\/uploads\/2019\/09\/login_to_account-284x300.png 284w\" sizes=\"(max-width: 572px) 100vw, 572px\" \/><\/a><\/figure>\n\n\n\n<p>Test b\u0119dzie polega\u0142 na:<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li>Wej\u015bcie do ekranu logowania wordpressa.<\/li>\n\n\n\n<li>Podanie loginu do jednego konta.<\/li>\n\n\n\n<li>Podanie has\u0142a do jednego konta.<\/li>\n\n\n\n<li>Zalogowanie si\u0119 i sprawdzenie, czy nazwa u\u017cytkownika si\u0119 wy\u015bwietla.<\/li>\n<\/ol>\n\n\n\n<p>CodeceptJS zrobi to dla dw\u00f3ch kont.<\/p>\n\n\n\n<figure class=\"wp-block-image aligncenter size-large\"><a href=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2023\/10\/code_codeceptjs.png\"><img decoding=\"async\" width=\"1024\" height=\"538\" src=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2023\/10\/code_codeceptjs-1024x538.png\" alt=\"fragment kodu\" class=\"wp-image-24892\" srcset=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2023\/10\/code_codeceptjs-1024x538.png 1024w, https:\/\/sii.pl\/blog\/wp-content\/uploads\/2023\/10\/code_codeceptjs-300x158.png 300w, https:\/\/sii.pl\/blog\/wp-content\/uploads\/2023\/10\/code_codeceptjs-768x404.png 768w, https:\/\/sii.pl\/blog\/wp-content\/uploads\/2023\/10\/code_codeceptjs-1536x807.png 1536w, https:\/\/sii.pl\/blog\/wp-content\/uploads\/2023\/10\/code_codeceptjs.png 1556w\" sizes=\"(max-width: 1024px) 100vw, 1024px\" \/><\/a><\/figure>\n\n\n\n<p>Prac\u0119 rozpoczynam od utworzenia nowego pliku. Nazwa\u0142em go\u00a0<strong>checkAccounts_test.js\u00a0<\/strong>implementacje rozpoczynam od dodania Feature w pliku z nazw\u0105 obszaru, do kt\u00f3rego b\u0119d\u0105 odnosi\u0107 si\u0119 testy. Kolejnym krokiem jest zdefiniowanie accounts, kt\u00f3re korzystaj\u0105 ze struktury DataTable, kt\u00f3ra pozwala dla CodeceptJS umieszcza\u0107 r\u00f3\u017cnego rodzaju warto\u015bci np. dane do konta dla u\u017cytkownik\u00f3w.\u00a0To, \u017ce w nazwie korzystam z\u00a0<strong>@accounts<\/strong>\u00a0to jest to spos\u00f3b, w jaki definiuje si\u0119 tagi dla CodeceptJS. Tagi pomagaj\u0105 grupowa\u0107 testy.<\/p>\n\n\n\n<p>Przekazuje accounts do Data. Nast\u0119pnie przekazuje w scenariuszu warto\u015b\u0107 z &#8222;current&#8221;, kt\u00f3ry pozwoli pobra\u0107 warto\u015b\u0107 z date table.<\/p>\n\n\n\n<p>Test zaczyna si\u0119 od przej\u015bcia do panelu logowania wordpressa. Zrobi\u0142em to, podaj\u0105c pe\u0142n\u0105 \u015bcie\u017ck\u0119. Oczywi\u015bcie, gdybym zdefiniowa\u0142 domen\u0119, m\u00f3g\u0142bym odwo\u0142ywa\u0107 si\u0119 do \u015bcie\u017cki po \/. Wype\u0142niam pole login loginem, kt\u00f3ry znajduje si\u0119 w current.login. W tym miejscu korzystam ze wpisywania warto\u015bci do selectora. Po tym kroku klikam przycisk &#8222;Continue&#8221;. Pojawia mi si\u0119 pole <strong>password<\/strong>. W nie wpisuje has\u0142o tego u\u017cytkownika.<\/p>\n\n\n\n<p>Doda\u0142em krok, kt\u00f3ry sprawdza, czy przycisk si\u0119 pojawi\u0142. W tym przypadku jest to przycisk &#8222;Log In&#8221;. Klikam w niego i dodaj\u0119 metod\u0119 <strong>I.waitInUrl(&#8217;\/me&#8217;,10)<\/strong>, kt\u00f3ra pozwala czeka\u0107 na pojawienie si\u0119 okre\u015blonej warto\u015bci w linku. Po tym kroku dodaj\u0119 krok czekaj\u0105cy na element <strong>I.waitForElement(&#8217;.profile-gravatar__user-display-name&#8217;, 15)<\/strong>, kt\u00f3ry jest odzwierciedleniem nazwy u\u017cytkownika wy\u015bwietlanym w dashbordzie . Test ko\u0144cz\u0119 dodaniem asercji, kt\u00f3ra sprawdzam, \u017ce ta warto\u015b\u0107 znajduje si\u0119 na tej stronie.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Uruchamianie test\u00f3w z tagiem<\/h2>\n\n\n\n<p>Je\u017celi chcesz uruchomi\u0107 jak\u0105\u015b pul\u0119 test\u00f3w z okre\u015blonym tagiem, mo\u017cesz to zrobi\u0107 za pomoc\u0105 tej komendy:<\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: plain; gutter: false; title: ; notranslate\" title=\"\">\ncodeceptjs run \u2013grep @accounts\n<\/pre><\/div>\n\n\n<p>Popularne jest nadawanie tag\u00f3w np. @slow dla wolniejszych test\u00f3w, czy @basic dla podstawowych test\u00f3w, kt\u00f3re sprawdzaj\u0105 najwa\u017cniejsze rzeczy.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Kod dost\u0119pny jest na GitHubie<\/h2>\n\n\n\n<p><a href=\"https:\/\/github.com\/testingplusme\/IntroductionToCodeCeptJS\/tree\/second_artile_parallel_and_page_object\" rel=\"nofollow\" >https:\/\/github.com\/testingplusme\/IntroductionToCodeCeptJS\/tree\/second_artile_parallel_and_page_object<\/a><\/p>\n\n\n\n<figure class=\"wp-block-image aligncenter\"><a href=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2019\/09\/passed-all-tests-codeceptjs.png\"><img decoding=\"async\" width=\"2032\" height=\"292\" src=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2019\/09\/passed-all-tests-codeceptjs.png\" alt=\"fragment kodu\" class=\"wp-image-8388\" srcset=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2019\/09\/passed-all-tests-codeceptjs.png 2032w, https:\/\/sii.pl\/blog\/wp-content\/uploads\/2019\/09\/passed-all-tests-codeceptjs-300x43.png 300w, https:\/\/sii.pl\/blog\/wp-content\/uploads\/2019\/09\/passed-all-tests-codeceptjs-1024x147.png 1024w\" sizes=\"(max-width: 2032px) 100vw, 2032px\" \/><\/a><\/figure>\n\n\n\n<div style=\"height:20px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<h2 class=\"wp-block-heading\"><span style=\"color: #000000; font-family: Calibri;\"><\/span>Podsumowanie<\/h2>\n\n\n\n<p>W dzisiejszym wpisie przedstawi\u0142em Ci, w jaki spos\u00f3b mo\u017cna skorzysta\u0107 w bardziej zaawansowany spos\u00f3b z CodeceptJS. W relatywnie \u0142atwy spos\u00f3b mo\u017cesz zaimplementowa\u0107 page object pattern, jak i r\u00f3wnie\u017c skorzysta\u0107 z uruchamiania wsp\u00f3\u0142bie\u017cnego test\u00f3w. Je\u017celi lubisz javascript, &nbsp;ten framework spokojnie mo\u017cesz wdro\u017cy\u0107 przy komercyjnym projekcie.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<p>Chcesz lepiej zrozumie\u0107 aplikacje i systemy, kt\u00f3re testujesz? Do\u0142\u0105cz do ModernTester, poznaj najpotrzebniejsze narz\u0119dzia, frameworki oraz j\u0119zyki programowania i \u0107wicz na specjalnie przygotowanych \u015brodowiskach testowych: <a href=\"https:\/\/moderntester.sii.pl\/\" rel=\"nofollow\" >Platforma e-learningowa ModernTester<\/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;7985&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;8&quot;,&quot;legendonly&quot;:&quot;&quot;,&quot;readonly&quot;:&quot;&quot;,&quot;score&quot;:&quot;5&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;5\\\/5 ( votes: 8)&quot;,&quot;size&quot;:&quot;18&quot;,&quot;title&quot;:&quot;CodeceptJS \u2013 cz\u0119\u015b\u0107 2 - uruchamianie wsp\u00f3\u0142bie\u017cne, page object pattern&quot;,&quot;width&quot;:&quot;139.5&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: 139.5px;\">\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            5\/5 ( votes: 8)    <\/div>\n    <\/div>\n","protected":false},"excerpt":{"rendered":"<p>W poprzednim wpisie pokaza\u0142em jak zacz\u0105\u0107 prac\u0119 z CodeceptJS. Je\u017celi jeszcze nie mia\u0142e\u015b okazji z nim zapozna\u0107 si\u0119, zach\u0119cam do &hellip; <a class=\"continued-btn\" href=\"https:\/\/sii.pl\/blog\/codeceptjs-czesc-2\/\">Continued<\/a><\/p>\n","protected":false},"author":215,"featured_media":8859,"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":[814],"class_list":["post-7985","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-testowanie","tag-codeceptjs"],"acf":[],"aioseo_notices":[],"republish_history":[],"featured_media_url":"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2019\/09\/codeceptJS-2.jpg","category_names":["Testowanie"],"_links":{"self":[{"href":"https:\/\/sii.pl\/blog\/wp-json\/wp\/v2\/posts\/7985"}],"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\/215"}],"replies":[{"embeddable":true,"href":"https:\/\/sii.pl\/blog\/wp-json\/wp\/v2\/comments?post=7985"}],"version-history":[{"count":4,"href":"https:\/\/sii.pl\/blog\/wp-json\/wp\/v2\/posts\/7985\/revisions"}],"predecessor-version":[{"id":24894,"href":"https:\/\/sii.pl\/blog\/wp-json\/wp\/v2\/posts\/7985\/revisions\/24894"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/sii.pl\/blog\/wp-json\/wp\/v2\/media\/8859"}],"wp:attachment":[{"href":"https:\/\/sii.pl\/blog\/wp-json\/wp\/v2\/media?parent=7985"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/sii.pl\/blog\/wp-json\/wp\/v2\/categories?post=7985"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/sii.pl\/blog\/wp-json\/wp\/v2\/tags?post=7985"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}