{"id":2429,"date":"2016-04-20T10:55:31","date_gmt":"2016-04-20T08:55:31","guid":{"rendered":"https:\/\/sii.pl\/blog\/?p=2429"},"modified":"2023-08-18T10:02:13","modified_gmt":"2023-08-18T08:02:13","slug":"tworzenie-zewnetrznej-klasy-do-testow-soapui-v-2-zaawansowane-zastosowania","status":"publish","type":"post","link":"https:\/\/sii.pl\/blog\/tworzenie-zewnetrznej-klasy-do-testow-soapui-v-2-zaawansowane-zastosowania\/","title":{"rendered":"Tworzenie zewn\u0119trznej klasy do test\u00f3w SoapUI v. 2 \u2013 zaawansowane zastosowania"},"content":{"rendered":"\n<p>W ci\u0105gu ostatnich dw\u00f3ch artyku\u0142\u00f3w dowiedzieli\u015bcie si\u0119 ju\u017c w jaki spos\u00f3b napisa\u0107 fragment swojej klasy oraz na co nale\u017cy zwraca\u0107 szczeg\u00f3ln\u0105 uwag\u0119 podczas procesu jej projektowania. W tym, ostatnim, artykule tej serii porusz\u0119 tematy zwi\u0105zane z zaawansowanym zastosowaniem naszej klasy.<\/p>\n\n\n\n<p>Obawiam si\u0119, \u017ce ju\u017c w tym miejscu musimy troch\u0119 zmieni\u0107 nazewnictwo, de facto nie b\u0119dzie to ju\u017c tylko klasa, poniewa\u017c zaczyna si\u0119 ona ju\u017c zbli\u017ca\u0107 do bycia<strong> frameworkiem (narz\u0119dzie wspomagaj\u0105ce budow\u0119 danej aplikacji \u2013 w naszym przypadku projektu test\u00f3w <a href=\"http:\/\/sii.pl\/offer-page\/testing\/\">SoapUI<\/a>)<\/strong>.<\/p>\n\n\n\n<p>Ten artyku\u0142 wymaga znajomo\u015bci Javy i programowania obiektowego na poziomie co najmniej dobrym \u2013 poniewa\u017c nie jestem w stanie zamie\u015bci\u0107 w nim ca\u0142ego opisu tworzenia element\u00f3w frameworka zamieszcz\u0119 tylko najwa\u017cniejsze fragmenty, kt\u00f3re postaram si\u0119 szczeg\u00f3\u0142owo om\u00f3wi\u0107.<\/p>\n\n\n\n<p>Na pocz\u0105tek zalecam uporz\u0105dkowa\u0107 troch\u0119 struktur\u0119 plik\u00f3w naszego frameworka.<\/p>\n\n\n\n<figure class=\"wp-block-image aligncenter\"><a href=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2016\/04\/1.png\"><img decoding=\"async\" width=\"296\" height=\"233\" src=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2016\/04\/1.png\" alt=\"1\" class=\"wp-image-2430\"\/><\/a><\/figure>\n\n\n\n<p><\/p>\n\n\n\n<p>Jak pami\u0119tacie z pierwszego artyku\u0142u, mieli\u015bmy tam jedn\u0105 klas\u0119 nazywaj\u0105c\u0105 si\u0119 SoapHelper i za jej pomoc\u0105 uzupe\u0142niali\u015bmy 2 pola \u2013 has\u0142o i login. <strong>Na tym etapie zaleca si\u0119 podzieli\u0107 klasy na funkcjonalno\u015bci kt\u00f3re maj\u0105 spe\u0142nia\u0107<\/strong>, ja podzieli\u0142em je w nast\u0119puj\u0105cy spos\u00f3b:<\/p>\n\n\n\n<p>DataGenerator \u2013 tutaj umie\u015bci\u0142em 2 metody generuj\u0105ce odpowiednio login i has\u0142o<\/p>\n\n\n\n<p>FrameworkCore \u2013 zawiera wszystkie funkcjonalno\u015bci naszego frameworka wsp\u00f3lne dla wszystkich klas z kt\u00f3rych b\u0119dziemy korzysta\u0107.<\/p>\n\n\n\n<p><strong>Dobrym przyk\u0142adem s\u0105 tu &nbsp;\u201eSaveRavRequest\u201d i \u201eSaveRawResponse\u201d \u2013 przydatne przyk\u0142ady metod z kt\u00f3rych mo\u017cemy korzysta\u0107 podczas pisania test\u00f3w Soap \u2013 cz\u0119sto w momencie test\u00f3w interfejs\u00f3w, po zg\u0142oszeniu b\u0142\u0119du, programi\u015bci nas pytaj\u0105 o request i response, dzi\u0119ki tym metodom jeste\u015bmy w stanie je szybko wygenerowa\u0107 i mie\u0107 zapisane w pliku, kt\u00f3rego \u015bcie\u017cka jest okre\u015blona w core.properties, ich kod znajdziecie na screenie poni\u017cej.<\/strong><\/p>\n\n\n\n<p>RegistrationAssistant \u2013 klasa wykonuj\u0105ca ostateczn\u0105 cz\u0119\u015b\u0107 pracy, w niej znajduj\u0105 si\u0119 metody kt\u00f3re pomagaj\u0105 w testowaniu interfejsu do rejestracji. W tym przypadku s\u0105 tam tylko dwie metody \u201esetEmailProperty()\u201d oraz \u201esetLoginProperty()\u201d.<\/p>\n\n\n\n<p>Na screenie poni\u017cej zaprezentowa\u0142em to w jak najczytelniejszy spos\u00f3b:<\/p>\n\n\n\n<figure class=\"wp-block-image aligncenter\"><a href=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2016\/04\/2.png\"><img decoding=\"async\" width=\"939\" height=\"829\" src=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2016\/04\/2.png\" alt=\"2\" class=\"wp-image-2431\" srcset=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2016\/04\/2.png 939w, https:\/\/sii.pl\/blog\/wp-content\/uploads\/2016\/04\/2-300x265.png 300w\" sizes=\"(max-width: 939px) 100vw, 939px\" \/><\/a><\/figure>\n\n\n\n<p><\/p>\n\n\n\n<p>Jak pewnie zauwa\u017cyli\u015bcie <strong>widoczno\u015b\u0107 metod w klasie FrameworkCore jest ograniczona, wi\u0119kszo\u015b\u0107 z nich jest Protected, a to dlatego poniewa\u017c nie chcia\u0142bym \u017ceby ko\u0144cowy u\u017cytkownik frameworka u\u017cywa\u0142 ich w nieodpowiedni spos\u00f3b, chc\u0119 aby dost\u0119p do nich mia\u0142y tylko metody z klas z kt\u00f3rych b\u0119d\u0119 korzysta\u0107 w testach<\/strong> \u2013 takich jak RegistrationAssistant, za\u0142o\u017cy\u0142em \u017ce b\u0119d\u0105 one dziedziczy\u0107 po FrameworkCore.<\/p>\n\n\n\n<p>Przejd\u017amy teraz do tego jak dzia\u0142a pobieranie RawRequest i RawResponse, to nic innego jak parametry naszego kroku testowego, mo\u017cemy je pobra\u0107 w dok\u0142adnie taki sam spos\u00f3b w jaki uzupe\u0142niali\u015bmy Login i Has\u0142o:<\/p>\n\n\n\n<figure class=\"wp-block-image aligncenter\"><a href=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2016\/04\/3.bmp\"><img decoding=\"async\" width=\"740\" height=\"453\" src=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2016\/04\/3.bmp\" alt=\"3\" class=\"wp-image-2432\" srcset=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2016\/04\/3.bmp 740w, https:\/\/sii.pl\/blog\/wp-content\/uploads\/2016\/04\/3-300x184.bmp 300w\" sizes=\"(max-width: 740px) 100vw, 740px\" \/><\/a><\/figure>\n\n\n\n<p><strong>Te dwie metody zosta\u0142y skonstruowane w taki spos\u00f3b aby mog\u0142y by\u0107 u\u017cyte na ko\u0144cu ka\u017cdego testu. Zapisuj\u0105 requesty i responsey dla wszystkich krok\u00f3w danego scenariusza.<\/strong> <strong>Dlatego<\/strong> <strong>pierwsz\u0105 rzecz\u0105 na kt\u00f3r\u0105 zwr\u00f3ci\u0142em uwag\u0119 jest pobranie listy krok\u00f3w dla danego przypadku testowego, zamiast \u201egetTestStepList()\u201d mo\u017cna tutaj u\u017cy\u0107 innych metod takich jak \u201egetTestStepByName()\u201d lub \u201egetTestStepById()\u201d je\u015bli zale\u017ca\u0142oby nam tylko na tym aby pobrany by\u0142 konkretny krok testowy.<\/strong><\/p>\n\n\n\n<p>Drug\u0105 rzecz\u0105 z kolei jest to na co zwr\u00f3ci\u0142em uwag\u0119 ju\u017c wcze\u015bniej, <strong>pobranie requesta i responsea przebiega w podobny spos\u00f3b co ustawienie property \u201eLogin\u201d lub \u201eHas\u0142o\u201d (zamiast \u201esetPropertyValue()\u201d korzystamy z \u201egetPropertyValue()\u201d).<\/strong><\/p>\n\n\n\n<p>Przyjrzyjmy si\u0119 teraz jak to wygl\u0105da z perspektywy SoapUI. Po tym jak wejdziemy w nasz TestStep i jego CustomProperties wida\u0107 wyra\u017anie \u017ce mamy RawRequest, Request oraz Response.<\/p>\n\n\n\n<figure class=\"wp-block-image aligncenter\"><a href=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2016\/04\/4.bmp\"><img decoding=\"async\" width=\"858\" height=\"702\" src=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2016\/04\/4.bmp\" alt=\"4\" class=\"wp-image-2433\" srcset=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2016\/04\/4.bmp 858w, https:\/\/sii.pl\/blog\/wp-content\/uploads\/2016\/04\/4-300x245.bmp 300w\" sizes=\"(max-width: 858px) 100vw, 858px\" \/><\/a><\/figure>\n\n\n\n<p><\/p>\n\n\n\n<p>Zauwa\u017cyli\u015bcie \u017ce zaznaczy\u0142em na powy\u017cszym screenie 3 rzeczy:<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li>RawRequest<\/li>\n\n\n\n<li>Response<\/li>\n\n\n\n<li>Request<\/li>\n<\/ol>\n\n\n\n<p>Oznaczy\u0142em je g\u0142\u00f3wnie dlatego \u017ceby u\u015bwiadomi\u0107 wam gdzie one si\u0119 w SoapUI znajduj\u0105, tak \u017ceby\u015bcie byli w stanie je p\u00f3\u017aniej odnale\u017a\u0107 i wiedzie\u0107 sk\u0105d one s\u0105 pobierane. <strong>Zastanawiacie si\u0119 pewnie tak\u017ce dlaczego w kodzie pobra\u0142em akurat \u201eRawRequest\u201d zamiast wzi\u0105\u0107 \u201eRequest\u201d, sprawa jest ca\u0142kiem prosta \u2013 ot\u00f3\u017c \u201eRawRequest\u201d jest requestem z danymi kt\u00f3re faktycznie zosta\u0142y wys\u0142ane do aplikacji, a \u201eRequest\u201d nie ma rozwini\u0119tych parametr\u00f3w &#8211; co to znaczy?<\/strong><\/p>\n\n\n\n<figure class=\"wp-block-image aligncenter\"><a href=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2016\/04\/5.bmp\"><img decoding=\"async\" width=\"742\" height=\"84\" src=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2016\/04\/5.bmp\" alt=\"5\" class=\"wp-image-2434\" srcset=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2016\/04\/5.bmp 742w, https:\/\/sii.pl\/blog\/wp-content\/uploads\/2016\/04\/5-300x34.bmp 300w\" sizes=\"(max-width: 742px) 100vw, 742px\" \/><\/a><\/figure>\n\n\n\n<p><strong><\/strong><\/p>\n\n\n\n<p><strong>To znaczy \u017ce zamiast danej kt\u00f3ra powinna zosta\u0107 pobrana z CustomProperty naszego TestCase\u2019a o nazwie Login, b\u0119dziemy mie\u0107 odno\u015bnik do tego pola, jak na ww. screenie.<\/strong><\/p>\n\n\n\n<p>Teraz pytanie gdzie mo\u017cna skorzysta\u0107 z takich rzeczy jak generowanie danych \u2013 naturalnie i od razu przychodz\u0105 nam do g\u0142owy kroki groovy, ale to mocno zanieczyszcza projekt \u2013 dajmy na to:<\/p>\n\n\n\n<p>200 przypadk\u00f3w testowych, ka\u017cdy z nich po oko\u0142o 5 krok\u00f3w to ju\u017c daje nam 1000 krok\u00f3w, a teraz dodajmy do tego jeszcze krok groovy na pocz\u0105tku i na ko\u0144cu, do tworzenia danych testowych i zapisywania wynik\u00f3w, i ju\u017c wyjdzie nam 1400 krok\u00f3w!<\/p>\n\n\n\n<p>Na szcz\u0119\u015bcie nie trzeba tego robi\u0107, SoapUI oferuje nam doskona\u0142\u0105, wbudowan\u0105 mo\u017cliwo\u015b\u0107 dodawania skryptu pocz\u0105tkowego i ko\u0144cowego kt\u00f3re s\u0105 uruchamiane odpowiednio przed i po wykonaniu testu.<\/p>\n\n\n\n<p>A mianowicie <strong>\u201eSetup Script\u201d i \u201eTearDown Script\u201d<\/strong>:<\/p>\n\n\n\n<figure class=\"wp-block-image aligncenter\"><a href=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2016\/04\/6.bmp\"><img decoding=\"async\" width=\"939\" height=\"926\" src=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2016\/04\/6.bmp\" alt=\"6\" class=\"wp-image-2435\" srcset=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2016\/04\/6.bmp 939w, https:\/\/sii.pl\/blog\/wp-content\/uploads\/2016\/04\/6-300x296.bmp 300w, https:\/\/sii.pl\/blog\/wp-content\/uploads\/2016\/04\/6-90x90.bmp 90w\" sizes=\"(max-width: 939px) 100vw, 939px\" \/><\/a><\/figure>\n\n\n\n<p><\/p>\n\n\n\n<p><strong>Setup Script przydaje si\u0119 je\u015bli nasz test musi mie\u0107 jakie\u015b warunki pocz\u0105tkowe, mamy tam dok\u0142adnie takie same mo\u017cliwo\u015bci jak w ka\u017cdym kroku skryptowym typu Groovy. Doradzam tworzenie tam mechanizm\u00f3w generuj\u0105cych \/ pobieraj\u0105cych dane testowe (jak na przyk\u0142ad \u201esetLoginProperty()\u201d i \u201esetEmailProperty()\u201d).<\/strong><\/p>\n\n\n\n<p><strong>TearDown Script natomiast jest doskona\u0142ym miejscem na wszystkie operacje ko\u0144cowe \u2013 takie jak logowanie czas\u00f3w wykona\u0144, usuwanie danych po te\u015bcie czy w\u0142a\u015bnie zapisywanie Request\u00f3w i Response\u00f3w (tak jak nasze \u201esaveRawRequests()\u201d oraz \u201esaveRawResponses()\u201d)<\/strong><\/p>\n\n\n\n<figure class=\"wp-block-image aligncenter\"><a href=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2016\/04\/7.bmp\"><img decoding=\"async\" width=\"1154\" height=\"923\" src=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2016\/04\/7.bmp\" alt=\"7\" class=\"wp-image-2436\" srcset=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2016\/04\/7.bmp 1154w, https:\/\/sii.pl\/blog\/wp-content\/uploads\/2016\/04\/7-300x240.bmp 300w, https:\/\/sii.pl\/blog\/wp-content\/uploads\/2016\/04\/7-1024x819.bmp 1024w\" sizes=\"(max-width: 1154px) 100vw, 1154px\" \/><\/a><\/figure>\n\n\n\n<div style=\"height:20px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<figure class=\"wp-block-image aligncenter\"><a href=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2016\/04\/8.bmp\"><img decoding=\"async\" width=\"1103\" height=\"928\" src=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2016\/04\/8.bmp\" alt=\"8\" class=\"wp-image-2437\" srcset=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2016\/04\/8.bmp 1103w, https:\/\/sii.pl\/blog\/wp-content\/uploads\/2016\/04\/8-300x252.bmp 300w, https:\/\/sii.pl\/blog\/wp-content\/uploads\/2016\/04\/8-1024x862.bmp 1024w\" sizes=\"(max-width: 1103px) 100vw, 1103px\" \/><\/a><\/figure>\n\n\n\n<p><\/p>\n\n\n\n<p>Taki framework mo\u017ce umo\u017cliwi\u0107 nam bardzo du\u017c\u0105 ilo\u015b\u0107 funkcjonalno\u015bci z kt\u00f3rych nie mogliby\u015bmy skorzysta\u0107 z poziomu SoapUI:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Zapisywanie danych testowych bezpo\u015brednio w bazie<\/li>\n\n\n\n<li>Usuwanie danych testowych<\/li>\n\n\n\n<li>Mo\u017cliwo\u015b\u0107 dopisania w\u0142asnego loggera do Jira \/ ALM \/ etc..<\/li>\n\n\n\n<li>Mo\u017cliwo\u015b\u0107 tworzenia w\u0142asnego Raportera do test\u00f3w<\/li>\n\n\n\n<li>Mo\u017cliwo\u015b\u0107 szybkiej edycji wszystkich krok\u00f3w testowych (wi\u0119cej w Tips\u2019n\u2019Tricks na ko\u0144cu)<\/li>\n\n\n\n<li>Czytelno\u015b\u0107 test\u00f3w \u2013 minimalizacja pracy, minimalizacja powtarzalnego kodu<\/li>\n\n\n\n<li>Zwi\u0119ksza \u0142atwo\u015b\u0107 w utrzymaniu projektu SoapUI<\/li>\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\"><strong>Tips\u2019n\u2019Tricks<\/strong><\/h2>\n\n\n\n<p>Na koniec chcia\u0142em poda\u0107 jeszcze 2 ca\u0142kiem przydatne sztuczki kt\u00f3re mog\u0105 wam czasem zaoszcz\u0119dzi\u0107 dni pracy podczas <a href=\"http:\/\/kariera.sii.pl\/akademia-sii\/\" rel=\"nofollow\" >testowania oprogramowania<\/a>:<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li><strong>W poprzednim artykule poda\u0142em przyk\u0142ad w kt\u00f3rym tester mia\u0142 zedytowa\u0107 240 przypadk\u00f3w testowych, i zaleci\u0142em podej\u015bcie z wykorzystaniem frameworka do edycji wszystkich asercji, oto jakby wygl\u0105da\u0142 przyk\u0142adowy kod \u2013 kt\u00f3ry mo\u017cna uruchomi\u0107 w dowolnym miejscu projektu soapUI:<\/strong><\/li>\n<\/ol>\n\n\n\n<figure class=\"wp-block-image aligncenter\"><a href=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2016\/04\/9.bmp\"><img decoding=\"async\" width=\"881\" height=\"610\" src=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2016\/04\/9.bmp\" alt=\"9\" class=\"wp-image-2438\" srcset=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2016\/04\/9.bmp 881w, https:\/\/sii.pl\/blog\/wp-content\/uploads\/2016\/04\/9-300x208.bmp 300w\" sizes=\"(max-width: 881px) 100vw, 881px\" \/><\/a><\/figure>\n\n\n\n<p><\/p>\n\n\n\n<ol class=\"wp-block-list\" start=\"2\">\n<li><strong>Nale\u017cy tak\u017ce wspomnie\u0107 o tym, \u017ce projekt SoapUI zapisany na dysku to nic innego jak jeden gigantyczny XML, kt\u00f3ry ma ca\u0142kowicie powtarzaln\u0105 struktur\u0119 \u2013 w razie potrzeby mo\u017cna go edytowa\u0107 r\u0119cznie np. w Notepad++ u\u017cywaj\u0105c opcji \u201eZamie\u0144 wszystkie wyst\u0105pienia\u201d.&nbsp;<\/strong>Nale\u017cy jednak pami\u0119ta\u0107 o tym, \u017ce najbezpieczniej wtedy jest zrobi\u0107 sobie backup wcze\u015bniej.&nbsp;Ponadto jako XMLa z \u0142atwo\u015bci\u0105 mo\u017cemy go edytowa\u0107 u\u017cywaj\u0105c cho\u0107by Dom4j.<\/li>\n<\/ol>\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;2429&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;0&quot;,&quot;legendonly&quot;:&quot;&quot;,&quot;readonly&quot;:&quot;&quot;,&quot;score&quot;:&quot;0&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;0\\\/5 ( votes: 0)&quot;,&quot;size&quot;:&quot;18&quot;,&quot;title&quot;:&quot;Tworzenie zewn\u0119trznej klasy do test\u00f3w SoapUI v. 2 \u2013 zaawansowane zastosowania&quot;,&quot;width&quot;:&quot;0&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: 0px;\">\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            <span class=\"kksr-muted\"><\/span>\n    <\/div>\n    <\/div>\n","protected":false},"excerpt":{"rendered":"<p>W ci\u0105gu ostatnich dw\u00f3ch artyku\u0142\u00f3w dowiedzieli\u015bcie si\u0119 ju\u017c w jaki spos\u00f3b napisa\u0107 fragment swojej klasy oraz na co nale\u017cy zwraca\u0107 &hellip; <a class=\"continued-btn\" href=\"https:\/\/sii.pl\/blog\/tworzenie-zewnetrznej-klasy-do-testow-soapui-v-2-zaawansowane-zastosowania\/\">Continued<\/a><\/p>\n","protected":false},"author":56,"featured_media":2521,"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":[145,276,330,144],"class_list":["post-2429","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-testowanie","tag-external-class","tag-framework","tag-java","tag-soapui"],"acf":[],"aioseo_notices":[],"republish_history":[],"featured_media_url":"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2016\/04\/soapUI-testing-blogersii.jpg","category_names":["Testowanie"],"_links":{"self":[{"href":"https:\/\/sii.pl\/blog\/wp-json\/wp\/v2\/posts\/2429"}],"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\/56"}],"replies":[{"embeddable":true,"href":"https:\/\/sii.pl\/blog\/wp-json\/wp\/v2\/comments?post=2429"}],"version-history":[{"count":2,"href":"https:\/\/sii.pl\/blog\/wp-json\/wp\/v2\/posts\/2429\/revisions"}],"predecessor-version":[{"id":23584,"href":"https:\/\/sii.pl\/blog\/wp-json\/wp\/v2\/posts\/2429\/revisions\/23584"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/sii.pl\/blog\/wp-json\/wp\/v2\/media\/2521"}],"wp:attachment":[{"href":"https:\/\/sii.pl\/blog\/wp-json\/wp\/v2\/media?parent=2429"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/sii.pl\/blog\/wp-json\/wp\/v2\/categories?post=2429"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/sii.pl\/blog\/wp-json\/wp\/v2\/tags?post=2429"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}