{"id":54167,"date":"2019-12-19T00:00:00","date_gmt":"2019-12-18T21:00:00","guid":{"rendered":"https:\/\/prohoster.info\/blog\/blog_prohoster\/testmace-bystryj-start"},"modified":"2020-02-18T14:02:08","modified_gmt":"2020-02-18T11:02:08","slug":"testmace-bystryj-start","status":"publish","type":"post","link":"https:\/\/prohoster.info\/pl\/blog\/news\/testmace-bystryj-start","title":{"rendered":"TestMace. Szybki start","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p><img decoding=\"async\" alt=\"TestMace. Szybki start\" src=\"\/wp-content\/uploads\/2019\/12\/ca19545f1cc06814a69a6a3e6d9f3a5a.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Witajcie wszyscy. Powoli wychodzimy z cienia i kontynuujemy seri\u0119 artyku\u0142\u00f3w o naszym produkcie. Po <noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/post\/458372\/\">poprzednim<\/a><\/noindex> artyku\u0142ach przegl\u0105dowych otrzymali\u015bmy wiele opinii (przewa\u017cnie pozytywnych), sugestii oraz raport\u00f3w b\u0142\u0119d\u00f3w. Dzi\u015b zaprezentujemy <noindex><a rel=\"nofollow\" href=\"https:\/\/client.testmace.com\">TestMace<\/a><\/noindex> w akcji i b\u0119dziesz m\u00f3g\u0142 oceni\u0107 niekt\u00f3re funkcje naszej aplikacji. Dla pe\u0142niejszego zanurzenia polecamy zapoznanie si\u0119 z nasz\u0105 dokumentacj\u0105 pod adresem <noindex><a rel=\"nofollow\" href=\"http:\/\/docs-ru.testmace.com\">http:\/\/docs-ru.testmace.com<\/a><\/noindex>. No to zaczynamy! <\/p>\n<p><noindex><a rel=\"nofollow\" name=\"habracut\"><\/a><\/noindex><\/p>\n<h1 id=\"ustanovka\">Instalacja<\/h1>\n<p><\/p>\n<p>Zacznijmy od oczywisto\u015bci. Aplikacja jest dost\u0119pna i naprawd\u0119 testowana na trzech platformach \u2014 Linux, Windows, MacOS. Mo\u017cesz pobra\u0107 instalator dla interesuj\u0105cego Ci\u0119 systemu operacyjnego z <noindex><a rel=\"nofollow\" href=\"https:\/\/client.testmace.com\">naszej strony<\/a><\/noindex>. Dla u\u017cytkownik\u00f3w Linuksa istnieje mo\u017cliwo\u015b\u0107 instalacji <noindex><a rel=\"nofollow\" href=\"https:\/\/snapcraft.io\/testmace\">pakietu snap<\/a><\/noindex>. Mamy nadziej\u0119, \u017ce wkr\u00f3tce znajd\u0105 si\u0119 zasoby na Microsoft Store i App Store (a potrzebne? Co s\u0105dzicie?).<\/p>\n<p><\/p>\n<h1 id=\"podopytnyy-scenariy\">Scenariusz testowy<\/h1>\n<p><\/p>\n<p>Jako testowany wybierzemy nast\u0119puj\u0105cy standardowy scenariusz:<\/p>\n<p><\/p>\n<ul>\n<li>zalogujemy si\u0119: u\u017cytkownik \u2014 admin, has\u0142o \u2014 password<\/li>\n<li>dodamy nowy wpis<\/li>\n<li>sprawdzimy poprawne dodanie wpisu<\/li>\n<\/ul>\n<p><\/p>\n<p>B\u0119dziemy testowa\u0107 na <noindex><a rel=\"nofollow\" href=\"https:\/\/testmace-quick-start.herokuapp.com\/\">https:\/\/testmace-quick-start.herokuapp.com\/<\/a><\/noindex>. To zwyk\u0142y <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/typicode\/json-server\">json-server<\/a><\/noindex>, doskona\u0142y do testowania podobnych aplikacji. Dodali\u015bmy tylko autoryzacj\u0119 za pomoc\u0105 tokenu do wszystkich tras json-servera i stworzyli\u015bmy metod\u0119 login dla uzyskania tego\u017c tokenu. B\u0119dziemy dzia\u0142a\u0107 stopniowo, sukcesywnie udoskonalaj\u0105c nasz projekt.<\/p>\n<p><\/p>\n<h2 id=\"sozdanie-proekta-i-popytka-sozdat-suschnost-bez-avtorizacii\">Tworzenie projektu i pr\u00f3ba utworzenia encji bez autoryzacji<\/h2>\n<p><\/p>\n<p>Na pocz\u0105tek stw\u00f3rzmy nowy projekt (<strong>Plik<\/strong>-&gt;<strong>Nowy projekt<\/strong>). Je\u015bli uruchamiasz aplikacj\u0119 po raz pierwszy, nowy projekt otworzy si\u0119 automatycznie. Najpierw spr\u00f3bujmy wys\u0142a\u0107 \u017c\u0105danie dotycz\u0105ce utworzenia nowego wpisu (mo\u017ce dodawanie wpis\u00f3w jest dost\u0119pne bez autoryzacji). Wybierz w menu kontekstowym w\u0119z\u0142a Project opcje <strong>Dodaj w\u0119ze\u0142<\/strong> -&gt; <strong>RequestStep<\/strong>. Jako nazw\u0119 w\u0119z\u0142a ustawimy <strong>create-post<\/strong>. W rezultacie w drzewie zostanie utworzony nowy w\u0119ze\u0142 i otworzy si\u0119 karta tego w\u0119z\u0142a. Ustawmy nast\u0119puj\u0105ce parametry \u017c\u0105dania:<\/p>\n<p><\/p>\n<ul>\n<li>Typ \u017c\u0105dania: POST<\/li>\n<li>url: <noindex><a rel=\"nofollow\" href=\"https:\/\/testmace-quick-start.herokuapp.com\/posts\">https:\/\/testmace-quick-start.herokuapp.com\/posts<\/a><\/noindex><\/li>\n<li>Tre\u015b\u0107 \u017c\u0105dania: json z warto\u015bci\u0105 <code>{\"title\": \"Nowy post szybkiego startu testmace\"}<\/code><br \/>\nJe\u015bli wszystko zrobi\u0142e\u015b poprawnie, interfejs b\u0119dzie wygl\u0105da\u0142 nast\u0119puj\u0105co:<\/li>\n<\/ul>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"TestMace. Szybki start\" src=\"\/wp-content\/uploads\/2019\/12\/a5c81dc4977dd73a4975643bf8ced3da.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Jednak je\u015bli spr\u00f3bujemy wykona\u0107 \u017c\u0105danie, serwer zwr\u00f3ci kod 401 i bez autoryzacji nie uzyskamy nic na tym serwerze. C\u00f3\u017c, w sumie mo\u017cna si\u0119 by\u0142o tego spodziewa\u0107).<\/p>\n<p><\/p>\n<h2 id=\"dobavlyaem-zapros-na-avtorizaciyu\">Dodajemy \u017c\u0105danie autoryzacji<\/h2>\n<p><\/p>\n<p>Jak ju\u017c wspomniano, mamy punkt ko\u0144cowy POST <code>\/login<\/code>, kt\u00f3ry przyjmuje jako tre\u015b\u0107 \u017c\u0105dania json w postaci: <code>{\"username\": \"\", \"password\": \"\"}<\/code>, gdzie <code>nazwa u\u017cytkownika<\/code> i <code>has\u0142o<\/code> (zn\u00f3w, z powy\u017cszej wprowadzenia) maj\u0105 znaczenie <code>admin<\/code> i <code>has\u0142o<\/code> odpowiednio. W odpowiedzi ten endpoint zwraca json w postaci <code>{\"token\": \"\"}<\/code>. Skorzystamy z niego do autoryzacji. Stworzymy <strong>RequestStep<\/strong> w\u0119ze\u0142 o nazwie <strong>login<\/strong>, jako rodzica w tym przypadku b\u0119dzie pe\u0142ni\u0142 rol\u0119 <strong>Projekt<\/strong> w\u0119ze\u0142. Za pomoc\u0105 przeci\u0105gnij i upu\u015b\u0107 przenie\u015b ten w\u0119ze\u0142 w drzewie wy\u017cej ni\u017c w\u0119ze\u0142 <strong>create-post<\/strong>. Ustalmy nowo utworzonemu \u017c\u0105daniu nast\u0119puj\u0105ce parametry:<\/p>\n<p><\/p>\n<ul>\n<li>Typ \u017c\u0105dania: POST<\/li>\n<li>url: <noindex><a rel=\"nofollow\" href=\"https:\/\/testmace-quick-start.herokuapp.com\/login\">https:\/\/testmace-quick-start.herokuapp.com\/login<\/a><\/noindex><\/li>\n<li>Tre\u015b\u0107 \u017c\u0105dania: json z warto\u015bci\u0105 <code>{\"username\": \"admin\", \"password\": \"password\"}<\/code><\/li>\n<\/ul>\n<p><\/p>\n<p>Wykonamy zapytanie i otrzymamy dwusetny kod z tokenem w odpowiedzi. Tak to wygl\u0105da:<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"TestMace. Szybki start\" src=\"\/wp-content\/uploads\/2019\/12\/222b2a0b965b4c1135b5b62c0b7424ba.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<h2 id=\"refaktoring-ubiraem-dublirovanie-domena\">Refaktoryzacja: usuwamy duplikacj\u0119 domeny<\/h2>\n<p><\/p>\n<p>Na razie zapytania nie s\u0105 po\u0142\u0105czone w jeden scenariusz. Ale to nie jedyny problem. Je\u015bli si\u0119 przyjrze\u0107, mo\u017cna zauwa\u017cy\u0107, \u017ce przynajmniej domena jest duplikowana w obu zapytaniach. To nie jest dobre. Nadszed\u0142 czas, aby zrefaktoryzowa\u0107 t\u0119 cz\u0119\u015b\u0107 przysz\u0142ego scenariusza, a w tym pomog\u0105 nam zmienne.<\/p>\n<p><\/p>\n<p>W przybli\u017ceniu zmienne pe\u0142ni\u0105 t\u0119 sam\u0105 rol\u0119, co w innych podobnych narz\u0119dziach i j\u0119zykach programowania \u2014 eliminacja duplikacji, zwi\u0119kszenie czytelno\u015bci itd. Wi\u0119cej o zmiennych mo\u017cna przeczyta\u0107 w <noindex><a rel=\"nofollow\" href=\"https:\/\/docs-ru.testmace.com\/variables\/user-variables\">naszej dokumentacji<\/a><\/noindex>. W tym przypadku potrzebne b\u0119d\u0105 nam zmienne u\u017cytkownika. <\/p>\n<p><\/p>\n<p>Zdefiniujmy na poziomie w\u0119z\u0142a Projekt zmienn\u0105 <code>domena<\/code> o warto\u015bci <code>https:\/\/testmace-quick-start.herokuapp.com<\/code>. W tym celu konieczne jest<\/p>\n<p><\/p>\n<ul>\n<li>Otw\u00f3rz zak\u0142adk\u0119 z tym w\u0119z\u0142em i kliknij ikon\u0119 kalkulatora po prawej g\u00f3rnej stronie<\/li>\n<li>Kliknij na <strong>+ DODAJ ZMIENN\u0104<\/strong><\/li>\n<li>Wprowad\u017a nazw\u0119 i warto\u015b\u0107 zmiennej<br \/>\nW naszym przypadku dialog z dodan\u0105 zmienn\u0105 b\u0119dzie wygl\u0105da\u0142 nast\u0119puj\u0105co:<\/li>\n<\/ul>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"TestMace. Szybki start\" src=\"\/wp-content\/uploads\/2019\/12\/071ac6dca2c5a49b78b11719fae5f650.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>OK. Dzi\u0119ki dziedziczeniu mo\u017cemy teraz u\u017cywa\u0107 tej zmiennej w potomkach na ka\u017cdym poziomie zagnie\u017cd\u017cenia. W naszym przypadku s\u0105 to w\u0119z\u0142y <strong>login<\/strong> i <strong>create-post<\/strong>. Aby w polu tekstowym u\u017cy\u0107 zmiennej, nale\u017cy napisa\u0107 <code>${}<\/code>. Na przyk\u0142ad, url do logowania przekszta\u0142ca si\u0119 w <code>${domain}\/login<\/code>, odpowiednio dla <strong>create-post<\/strong> w\u0119z\u0142a url b\u0119dzie wygl\u0105da\u0107 tak <code>${domain}\/posts<\/code>.<\/p>\n<p><\/p>\n<p>W ten spos\u00f3b, kieruj\u0105c si\u0119 zasad\u0105 DRY, nieco poprawili\u015bmy scenariusz.<\/p>\n<p><\/p>\n<h2 id=\"sohranyaem-token-v-peremennuyu\">Zapisujemy token w zmiennej<\/h2>\n<p><\/p>\n<p>Skoro ju\u017c m\u00f3wimy o zmiennych, rozwiniemy ten temat. W tej chwili w przypadku udanego logowania otrzymujemy od serwera token autoryzacyjny, kt\u00f3ry b\u0119dzie nam potrzebny w kolejnych zapytaniach. Zapiszmy ten token w zmiennej. Poniewa\u017c warto\u015b\u0107 zmiennej b\u0119dzie okre\u015blana w czasie wykonywania scenariusza, wykorzystamy do tego specjalny mechanizm \u2014 <noindex><a rel=\"nofollow\" href=\"https:\/\/docs-ru.testmace.com\/variables\/user-variables\/dynamic-variables\">zmienne dynamiczne<\/a><\/noindex>.<\/p>\n<p><\/p>\n<p>Na pocz\u0105tek wykonajmy zapytanie logowania. W zak\u0142adce <strong>Parsed<\/strong> najpierw najed\u017a myszk\u0105 na token i w menu kontekstowym (wywo\u0142ywanym prawym przyciskiem myszy lub naci\u015bni\u0119ciem przycisku &#8230;) wybierz opcj\u0119 <strong>Przypisz do zmiennej<\/strong>. Pojawi si\u0119 okno dialogowe z nast\u0119puj\u0105cymi polami:<\/p>\n<p><\/p>\n<ul>\n<li><strong>\u015acie\u017cka<\/strong> \u2014 jaki fragment odpowiedzi jest brany (w naszym przypadku to <code>body.token<\/code>)<\/li>\n<li><strong>Aktualna warto\u015b\u0107<\/strong> \u2014 jaka warto\u015b\u0107 znajduje si\u0119 na \u015bcie\u017cce \u015acie\u017cka (w naszym przypadku to warto\u015b\u0107 tokena)<\/li>\n<li><strong>Nazwa zmiennej<\/strong> \u2014 nazwa zmiennej, do kt\u00f3rej <strong>Aktualna warto\u015b\u0107<\/strong> zostanie zapisana. W naszym przypadku b\u0119dzie to <code>token<\/code><\/li>\n<li><strong>W\u0119ze\u0142<\/strong> \u2014 w kt\u00f3rym z przodk\u00f3w b\u0119dzie utworzona zmienna <strong>Nazwa zmiennej<\/strong>. Wybierzmy Projekt<\/li>\n<\/ul>\n<p><\/p>\n<p>Wype\u0142nione okno dialogowe wygl\u0105da nast\u0119puj\u0105co:<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"TestMace. Szybki start\" src=\"\/wp-content\/uploads\/2019\/12\/f524934dd1a4cb238afb6666135b360b.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Teraz przy ka\u017cdym wykonaniu w\u0119z\u0142a <strong>login<\/strong> zmienna dynamiczna <code>token<\/code> b\u0119dzie aktualizowana now\u0105 warto\u015bci\u0105 z odpowiedzi. A ta zmienna b\u0119dzie przechowywana w <strong>Projekt<\/strong> w\u0119\u017ale i dzi\u0119ki dziedziczeniu b\u0119dzie dost\u0119pna dla potomk\u00f3w.<\/p>\n<p><\/p>\n<p>Aby odwo\u0142a\u0107 si\u0119 do zmiennych dynamicznych, nale\u017cy u\u017cy\u0107 <noindex><a rel=\"nofollow\" href=\"https:\/\/docs-ru.testmace.com\/variables\/variables\">wbudowanej zmiennej<\/a><\/noindex> <code>$dynamicVar<\/code>. Na przyk\u0142ad, aby uzyska\u0107 dost\u0119p do przechowanego tokena, nale\u017cy wywo\u0142a\u0107 <code>${$dynamicVar.token}<\/code>.<\/p>\n<p><\/p>\n<h2 id=\"prokidyvaem-avtorizacionnyy-token-v-zaprosy\">Przekazujemy token autoryzacyjny w zapytaniach<\/h2>\n<p><\/p>\n<p>Na wcze\u015bniejszych etapach uzyskali\u015bmy token autoryzacyjny i wszystko, co musimy zrobi\u0107, to doda\u0107 nag\u0142\u00f3wek <code>Authorization<\/code> z warto\u015bci\u0105 <code>Bearer<\/code> do wszystkich zapyta\u0144 wymagaj\u0105cych autoryzacji, w tym do <strong>create-post<\/strong>. Istnieje kilka sposob\u00f3w na to:<\/p>\n<p><\/p>\n<ol>\n<li>R\u0119cznie skopiowa\u0107 token i doda\u0107 nag\u0142\u00f3wek autoryzacji do interesuj\u0105cych zapyta\u0144. Metoda dzia\u0142a, ale jej zastosowanie ogranicza si\u0119 tylko do zapyta\u0144 typu &#171;zr\u00f3b i wrzu\u0107&#187;. Nie nadaje si\u0119 do wielokrotnego wykonywania scenariuszy<\/li>\n<li>Skorzysta\u0107 z funkcji <noindex><a rel=\"nofollow\" href=\"https:\/\/docs-ru.testmace.com\/work-with\/authorization\">autoryzacji<\/a><\/noindex>.<\/li>\n<li>U\u017cy\u0107 <noindex><a rel=\"nofollow\" href=\"https:\/\/docs-ru.testmace.com\/other\/default-http-headers\">domy\u015blnych nag\u0142\u00f3wk\u00f3w<\/a><\/noindex><\/li>\n<\/ol>\n<p><\/p>\n<p>Korzystanie z drugiej metody wydaje si\u0119 oczywiste, ale w kontek\u015bcie tego artyku\u0142u takie podej\u015bcie... nie jest interesuj\u0105ce. Naprawd\u0119: mechanizm autoryzacji jest mniej wi\u0119cej znany z innych narz\u0119dzi (mimo \u017ce mamy rzeczy takie jak <noindex><a rel=\"nofollow\" href=\"https:\/\/docs-ru.testmace.com\/work-with\/authorization#inherit-from-parent\">dziedziczenie autoryzacji<\/a><\/noindex>) i raczej nie wywo\u0142a w\u0105tpliwo\u015bci. <\/p>\n<p><\/p>\n<p>Inne s\u0105 nag\u0142\u00f3wki domy\u015blne! W skr\u00f3cie, nag\u0142\u00f3wki domy\u015blne to nag\u0142\u00f3wki HTTP dziedziczone od przodk\u00f3w, kt\u00f3re s\u0105 domy\u015blnie dodawane do \u017c\u0105dania, je\u015bli nie zostan\u0105 wyra\u017anie wy\u0142\u0105czone. Dzi\u0119ki tej funkcjonalno\u015bci mo\u017cna na przyk\u0142ad zrealizowa\u0107 niestandardow\u0105 autoryzacj\u0119 lub po prostu pozby\u0107 si\u0119 duplikacji w scenariuszach. Zastosujemy t\u0119 funkcj\u0119 do przekazywania tokena w nag\u0142\u00f3wkach.<\/p>\n<p><\/p>\n<p>Wcze\u015bniej ostro\u017cnie zapisali\u015bmy token w zmiennej dynamicznej <code>$dynamicVar.token<\/code> na poziomie w\u0119z\u0142a Project. Pozostaje wykona\u0107 nast\u0119puj\u0105ce kroki:<\/p>\n<p><\/p>\n<ol>\n<li>Zdefiniowa\u0107 nag\u0142\u00f3wek domy\u015blny <code>Authorization<\/code> o warto\u015bci <code>Bearer ${$dynamicVar.token}<\/code> na poziomie w\u0119z\u0142a Project. W tym celu w interfejsie w\u0119z\u0142a Project nale\u017cy otworzy\u0107 okno dialogowe z nag\u0142\u00f3wkami domy\u015blnymi (przycisk <strong>Headers<\/strong> w prawym g\u00f3rnym rogu) i doda\u0107 odpowiadaj\u0105cy nag\u0142\u00f3wek. Okno dialogowe z wype\u0142nionymi warto\u015bciami b\u0119dzie wygl\u0105da\u0107 nast\u0119puj\u0105co:<br \/>\n<img decoding=\"async\" alt=\"TestMace. Szybki start\" src=\"\/wp-content\/uploads\/2019\/12\/9abd888cbf96e53b633e8f0fd3389297.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/li>\n<li>Wy\u0142\u0105cz ten nag\u0142\u00f3wek z \u017c\u0105dania logowania. Co wida\u0107: w momencie logowania nie mamy jeszcze tokena i tym \u017c\u0105daniem w\u0142a\u015bnie go ustalimy. Dlatego w interfejsie \u017c\u0105dania logowania w zak\u0142adce <strong>Headers<\/strong> w obszarze <strong>Inherited<\/strong> odznaczymy pole z nag\u0142\u00f3wka Authorization. <\/li>\n<\/ol>\n<p><\/p>\n<p>Na tym ko\u0144czymy. Teraz nag\u0142\u00f3wek autoryzacji b\u0119dzie dodawany do wszystkich \u017c\u0105da\u0144, kt\u00f3re s\u0105 potomkami w\u0119z\u0142a Project, z wyj\u0105tkiem w\u0119z\u0142a logowania. Oznacza to, \u017ce na tym etapie mamy ju\u017c gotowy scenariusz i pozostaje nam go tylko uruchomi\u0107. Uruchomi\u0107 scenariusz mo\u017cna, wybieraj\u0105c opcj\u0119 <strong>Run<\/strong> w menu kontekstowym w\u0119z\u0142a Project. <\/p>\n<p><\/p>\n<h2 id=\"proveryaem-korrektnost-sozdaniya-posta\">Sprawdzamy poprawno\u015b\u0107 tworzenia posta<\/h2>\n<p><\/p>\n<p>Na tym etapie nasz scenariusz potrafi si\u0119 zalogowa\u0107, a korzystaj\u0105c z tokena autoryzacyjnego, stworzy\u0107 posta. Musimy jednak upewni\u0107 si\u0119, \u017ce nowo utworzony post ma poprawn\u0105 nazw\u0119. To znaczy, \u017ce w zasadzie pozostaje wykona\u0107 nast\u0119puj\u0105ce kroki:<\/p>\n<p><\/p>\n<ul>\n<li>Wys\u0142a\u0107 \u017c\u0105danie o pobranie posta wed\u0142ug id, <\/li>\n<li>Sprawdzi\u0107, czy nazwa, kt\u00f3ra przysz\u0142a z serwera, odpowiada nazwie przes\u0142anej przy tworzeniu posta<\/li>\n<\/ul>\n<p><\/p>\n<p>Rozwa\u017cmy pierwszy krok. Poniewa\u017c warto\u015b\u0107 id jest okre\u015blana w czasie wykonania skryptu, trzeba stworzy\u0107 zmienn\u0105 dynamiczn\u0105 (nazwijmy j\u0105 <code>postId<\/code>) z w\u0119z\u0142a <strong>create-post<\/strong> na poziomie w\u0119z\u0142a Project. Jak to zrobi\u0107, ju\u017c wiemy, wystarczy si\u0119gn\u0105\u0107 do sekcji <strong>Zapisujemy token w zmiennej<\/strong>. Pozostaje tylko stworzy\u0107 \u017c\u0105danie o pobranie posta wed\u0142ug tego id. W tym celu stw\u00f3rzmy RequestStep <strong>get-post<\/strong> z nast\u0119puj\u0105cymi parametrami:<\/p>\n<p><\/p>\n<ul>\n<li>Typ \u017c\u0105dania: GET<\/li>\n<li>URL: ${domain}\\\/posts\\\/${$dynamicVar.postId}<\/li>\n<\/ul>\n<p><\/p>\n<p>Aby zrealizowa\u0107 drugi krok, musimy zapozna\u0107 si\u0119 z <noindex><a rel=\"nofollow\" href=\"https:\/\/docs-ru.testmace.com\/node-types\/assertion\">Assertion<\/a><\/noindex> w\u0119z\u0142em. W\u0119ze\u0142 Assertion to w\u0119ze\u0142, kt\u00f3ry pozwala na pisanie sprawdze\u0144 dla okre\u015blonych zapyta\u0144. Ka\u017cdy w\u0119ze\u0142 Assertion mo\u017ce zawiera\u0107 kilka stwierdze\u0144 (sprawdze\u0144). Wi\u0119cej informacji na temat wszystkich rodzaj\u00f3w assertion-\u00f3w znajdziesz w naszej <noindex><a rel=\"nofollow\" href=\"https:\/\/docs-ru.testmace.com\/node-types\/assertion\">dokumentacji<\/a><\/noindex>. B\u0119dziemy u\u017cywa\u0107 <code>Compare<\/code> assertion z operatorem <code>equal<\/code>. Istnieje kilka sposob\u00f3w tworzenia assertion-\u00f3w:<\/p>\n<p><\/p>\n<ol>\n<li>D\u0142ugi. R\u0119cznie z menu kontekstowego w\u0119z\u0142a RequestStep utworzy\u0107 w\u0119ze\u0142 Assertion. W utworzonym w\u0119\u017ale Assertion doda\u0107 interesuj\u0105cy assertion i wype\u0142ni\u0107 pola.<\/li>\n<li>Szybki. Utworzy\u0107 w\u0119ze\u0142 Assertion wraz z assertion-om z odpowiedzi w\u0119z\u0142a RequestStep za pomoc\u0105 menu kontekstowego<\/li>\n<\/ol>\n<p><\/p>\n<p>Skorzystamy z drugiego sposobu. Oto jak to b\u0119dzie wygl\u0105da\u0107 w naszym przypadku.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"TestMace. Szybki start\" src=\"\/wp-content\/uploads\/2019\/12\/7f1d81669cb4c10db5f0afa3bf04eddf.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Dla tych, kt\u00f3rzy nie zrozumieli, tu dzieje si\u0119 to:<\/p>\n<p><\/p>\n<ol>\n<li>Wykona\u0107 zapytanie w w\u0119\u017ale <strong>get-post<\/strong><\/li>\n<li>Na zak\u0142adce <strong>Parsed<\/strong> odpowiedzi wywo\u0142a\u0107 menu kontekstowe i wybra\u0107 <strong>Create assertion<\/strong> -&gt; <strong>Compare<\/strong> -&gt; <strong>Equal<\/strong><\/li>\n<\/ol>\n<p><\/p>\n<p>Gratulacje, stworzyli\u015bmy pierwszy test! Proste, prawda? Teraz mo\u017cesz uruchomi\u0107 scenariusz w ca\u0142o\u015bci i cieszy\u0107 si\u0119 wynikiem. Zostaje tylko odrefaktoryzowa\u0107 i przenie\u015b\u0107 <code>title<\/code> do osobnej zmiennej. Ale to pozostawimy wam jako zadanie domowe)<\/p>\n<p><\/p>\n<h1 id=\"zaklyuchenie\">Podsumowanie<\/h1>\n<p><\/p>\n<p>W tym przewodniku stworzyli\u015bmy pe\u0142noprawny scenariusz i jednocze\u015bnie om\u00f3wili\u015bmy kilka funkcji naszego produktu. Oczywi\u015bcie, nie wykorzystali\u015bmy w pe\u0142ni wszystkich funkcji i w kolejnych artyku\u0142ach przeprowadzimy szczeg\u00f3\u0142owy przegl\u0105d mo\u017cliwo\u015bci TestMace. \u015aled\u017a nasze aktualizacje!<\/p>\n<p><\/p>\n<p>P.S. Dla tych, kt\u00f3rym si\u0119 nie chce powtarza\u0107 wszystkich krok\u00f3w, uprzejmie przygotowali\u015bmy <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/TestMace\/testmace-quick-start-project\">repozytorium<\/a><\/noindex> z projektem z artyku\u0142u. Mo\u017cna je otworzy\u0107 za pomoc\u0105 <strong>Plik<\/strong> -&gt; <strong>Open project<\/strong> i wybra\u0107 folder Project.<\/p>\n<p>\u0179r\u00f3d\u0142o: <a content=\"nofollow\" rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/post\/458964\/\">habr.com<\/a><\/p>","protected":false,"gt_translate_keys":[{"key":"rendered","format":"html"}]},"excerpt":{"rendered":"<p>\u0412\u0441\u0435\u043c \u043f\u0440\u0438\u0432\u0435\u0442. \u041c\u044b \u043f\u043e\u0442\u0438\u0445\u043e\u043d\u044c\u043a\u0443 \u0432\u044b\u0445\u043e\u0434\u0438\u043c \u0438\u0437 \u0442\u0435\u043d\u0438 \u0438 \u043f\u0440\u043e\u0434\u043e\u043b\u0436\u0430\u0435\u043c \u0441\u0435\u0440\u0438\u044e \u0441\u0442\u0430\u0442\u0435\u0439 \u043e \u043d\u0430\u0448\u0435\u043c \u043f\u0440\u043e\u0434\u0443\u043a\u0442\u0435. \u041f\u043e\u0441\u043b\u0435 \u043f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0435\u0439 \u043e\u0431\u0437\u043e\u0440\u043d\u043e\u0439 \u0441\u0442\u0430\u0442\u044c\u0438 \u043c\u044b \u043f\u043e\u043b\u0443\u0447\u0438\u043b\u0438 \u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432\u043e \u043e\u0442\u0437\u044b\u0432\u043e\u0432 (\u043f\u0440\u0435\u0438\u043c\u0443\u0449\u0435\u0441\u0442\u0432\u0435\u043d\u043d\u043e \u043f\u043e\u043b\u043e\u0436\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0445), \u043f\u0440\u0435\u0434\u043b\u043e\u0436\u0435\u043d\u0438\u0439 \u0438 bug \u0440\u0435\u043f\u043e\u0440\u0442\u043e\u0432. \u0421\u0435\u0433\u043e\u0434\u043d\u044f \u043c\u044b \u043f\u043e\u043a\u0430\u0436\u0435\u043c TestMace \u0432 \u0434\u0435\u043b\u0435 \u0438 \u0432\u044b \u043f\u043e \u0434\u043e\u0441\u0442\u043e\u0438\u043d\u0441\u0442\u0432\u0443 \u0441\u043c\u043e\u0436\u0435\u0442\u0435 \u043e\u0446\u0435\u043d\u0438\u0442\u044c \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0444\u0438\u0448\u043a\u0438 \u043d\u0430\u0448\u0435\u0433\u043e \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f. \u0414\u043b\u044f \u0431\u043e\u043b\u0435\u0435 \u043f\u043e\u043b\u043d\u043e\u0433\u043e \u043f\u043e\u0433\u0440\u0443\u0436\u0435\u043d\u0438\u044f \u0441\u043e\u0432\u0435\u0442\u0443\u044e \u043e\u0431\u0440\u0430\u0442\u0438\u0442\u044c\u0441\u044f \u043a \u043d\u0430\u0448\u0435\u0439 \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u0438 \u043f\u043e \u0430\u0434\u0440\u0435\u0441\u0443 [&hellip;]<\/p>\n","protected":false,"gt_translate_keys":[{"key":"rendered","format":"html"}]},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[702],"tags":[],"class_list":["post-54167","post","type-post","status-publish","format-standard","hentry","category-news"],"aioseo_notices":[],"aioseo_head":"\n\t\t<!-- All in One SEO 5.0.1.1 - aioseo.com -->\n\t<meta name=\"description\" content=\"\u0412\u0441\u0435\u043c \u043f\u0440\u0438\u0432\u0435\u0442.\" \/>\n\t<meta name=\"robots\" content=\"max-image-preview:large\" \/>\n\t<meta name=\"author\" content=\"Yuri Gagarin\"\/>\n\t<link rel=\"canonical\" href=\"https:\/\/prohoster.info\/pl\/blog\/news\/testmace-bystryj-start\" \/>\n\t<meta name=\"generator\" content=\"All in One SEO (AIOSEO) 5.0.1.1\" \/>\n\t\t<meta property=\"og:locale\" content=\"pl_PL\" \/>\n\t\t<meta property=\"og:site_name\" content=\"ProHoster | \u041a\u0443\u043f\u0438\u0442\u044c \u043d\u0430\u0434\u0435\u0436\u043d\u044b\u0439 \u0445\u043e\u0441\u0442\u0438\u043d\u0433 \u0434\u043b\u044f \u0441\u0430\u0439\u0442\u043e\u0432 \u0441 \u0437\u0430\u0449\u0438\u0442\u043e\u0439 \u043e\u0442 DDoS, VPS VDS \u0441\u0435\u0440\u0432\u0435\u0440\u044b\" \/>\n\t\t<meta property=\"og:type\" content=\"article\" \/>\n\t\t<meta property=\"og:title\" content=\"\ud83e\udd47TestMace. \u0411\u044b\u0441\u0442\u0440\u044b\u0439 \u0441\u0442\u0430\u0440\u0442 | ProHoster\" \/>\n\t\t<meta property=\"og:description\" content=\"\u0412\u0441\u0435\u043c \u043f\u0440\u0438\u0432\u0435\u0442.\" \/>\n\t\t<meta property=\"og:url\" content=\"https:\/\/prohoster.info\/pl\/blog\/news\/testmace-bystryj-start\" \/>\n\t\t<meta property=\"og:image\" content=\"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg\" \/>\n\t\t<meta property=\"og:image:secure_url\" content=\"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg\" \/>\n\t\t<meta property=\"og:image:width\" content=\"350\" \/>\n\t\t<meta property=\"og:image:height\" content=\"350\" \/>\n\t\t<meta property=\"article:published_time\" content=\"2019-12-18T21:00:00+00:00\" \/>\n\t\t<meta property=\"article:modified_time\" content=\"2020-02-18T11:02:08+00:00\" \/>\n\t\t<meta property=\"article:publisher\" content=\"https:\/\/www.facebook.com\/prohoster\" \/>\n\t\t<meta property=\"article:author\" content=\"https:\/\/www.facebook.com\/prohoster\" \/>\n\t\t<!-- All in One SEO -->\n\n","aioseo_head_json":{"title":"\ud83e\udd47TestMace. Szybki start | ProHoster","description":"Witajcie wszyscy.","canonical_url":"https:\/\/prohoster.info\/pl\/blog\/news\/testmace-bystryj-start","robots":"max-image-preview:large","keywords":"","webmasterTools":{"miscellaneous":""},"schema":null,"og:locale":"pl_PL","og:site_name":"ProHoster | \u041a\u0443\u043f\u0438\u0442\u044c \u043d\u0430\u0434\u0435\u0436\u043d\u044b\u0439 \u0445\u043e\u0441\u0442\u0438\u043d\u0433 \u0434\u043b\u044f \u0441\u0430\u0439\u0442\u043e\u0432 \u0441 \u0437\u0430\u0449\u0438\u0442\u043e\u0439 \u043e\u0442 DDoS, VPS VDS \u0441\u0435\u0440\u0432\u0435\u0440\u044b","og:type":"article","og:title":"\ud83e\udd47TestMace. \u0411\u044b\u0441\u0442\u0440\u044b\u0439 \u0441\u0442\u0430\u0440\u0442 | ProHoster","og:description":"\u0412\u0441\u0435\u043c \u043f\u0440\u0438\u0432\u0435\u0442.","og:url":"https:\/\/prohoster.info\/pl\/blog\/news\/testmace-bystryj-start","og:image":"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg","og:image:secure_url":"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg","og:image:width":350,"og:image:height":350,"article:published_time":"2019-12-18T21:00:00+00:00","article:modified_time":"2020-02-18T11:02:08+00:00","article:publisher":"https:\/\/www.facebook.com\/prohoster","article:author":"https:\/\/www.facebook.com\/prohoster"},"aioseo_meta_data":{"post_id":"54167","title":null,"description":null,"keywords":null,"keyphrases":null,"primary_term":null,"canonical_url":null,"og_title":null,"og_description":null,"og_object_type":"default","og_image_type":"default","og_image_url":null,"og_image_width":null,"og_image_height":null,"og_image_custom_url":null,"og_image_custom_fields":null,"og_video":null,"og_custom_url":null,"og_article_section":null,"og_article_tags":null,"twitter_use_og":false,"twitter_card":"default","twitter_image_type":"default","twitter_image_url":null,"twitter_image_custom_url":null,"twitter_image_custom_fields":null,"twitter_title":null,"twitter_description":null,"schema":{"blockGraphs":[],"customGraphs":[],"default":{"data":{"Article":[],"Course":[],"Dataset":[],"FAQPage":[],"Movie":[],"Person":[],"Product":[],"ProductReview":[],"Car":[],"Recipe":[],"Service":[],"SoftwareApplication":[],"WebPage":[]},"graphName":"","isEnabled":true},"graphs":[]},"schema_type":null,"schema_type_options":null,"pillar_content":false,"robots_default":true,"robots_noindex":false,"robots_noarchive":false,"robots_nosnippet":false,"robots_nofollow":false,"robots_noimageindex":false,"robots_noodp":false,"robots_notranslate":false,"robots_max_snippet":null,"robots_max_videopreview":null,"robots_max_imagepreview":"large","priority":null,"frequency":null,"local_seo":null,"seo_analyzer_scan_date":"2026-01-24 10:17:19","breadcrumb_settings":null,"limit_modified_date":false,"reviewed_by":null,"ai":null,"created":"2021-02-28 20:10:34","updated":"2026-01-24 10:17:19","focus_keyword":null,"additional_keywords":null,"truseo_locale":null},"gt_translate_keys":[{"key":"link","format":"url"}],"_links":{"self":[{"href":"https:\/\/prohoster.info\/pl\/wp-json\/wp\/v2\/posts\/54167","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/prohoster.info\/pl\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/prohoster.info\/pl\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/prohoster.info\/pl\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/prohoster.info\/pl\/wp-json\/wp\/v2\/comments?post=54167"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/pl\/wp-json\/wp\/v2\/posts\/54167\/revisions"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/pl\/wp-json\/wp\/v2\/media?parent=54167"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/pl\/wp-json\/wp\/v2\/categories?post=54167"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/pl\/wp-json\/wp\/v2\/tags?post=54167"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}