{"id":1775,"date":"2016-01-29T12:13:03","date_gmt":"2016-01-29T11:13:03","guid":{"rendered":"https:\/\/sii.pl\/blog\/?p=1775"},"modified":"2023-07-25T08:31:16","modified_gmt":"2023-07-25T06:31:16","slug":"projektowanie-zewnetrznej-klasy-do-testow-soapui","status":"publish","type":"post","link":"https:\/\/sii.pl\/blog\/projektowanie-zewnetrznej-klasy-do-testow-soapui\/","title":{"rendered":"Projektowanie zewn\u0119trznej klasy do test\u00f3w SoapUI"},"content":{"rendered":"\n<p>W poprzednim artykule opisa\u0142em krok po kroku w jaki spos\u00f3b utworzy\u0107 i wczyta\u0107 zewn\u0119trzn\u0105 klas\u0119&nbsp; pomocnicz\u0105 do test\u00f3w SoapUI. W kolejnym chcia\u0142bym om\u00f3wi\u0107 mo\u017cliwo\u015bci kt\u00f3re ona nam daje, oraz om\u00f3wi\u0107 spos\u00f3b w jaki powinni\u015bmy podej\u015b\u0107 do projektowania takiego narz\u0119dzia do naszych test\u00f3w.<\/p>\n\n\n\n<p>Tak jak zd\u0105\u017cyli\u015bcie si\u0119 pewnie przekona\u0107 <a href=\"https:\/\/sii.pl\/blog\/tworzenie-zewnetrznej-klasy-do-testow-soapui\/?category=testowanie&amp;tag=external-class,soapui,testing\" target=\"_blank\" rel=\"noopener\">czytaj\u0105c poprzedni artyku\u0142<\/a>, nasza klasa jest zbudowana na podstawie SoapUI API, kt\u00f3re daje nam praktycznie nieograniczone mo\u017cliwo\u015bci edycji element\u00f3w naszego projektu.<\/p>\n\n\n\n<p>Natomiast przy wykorzystaniu narz\u0119dzia jakim jest SoapUI \u2013 nie jest nam potrzebna a\u017c taka pula funkcjonalno\u015bci \u2013 st\u0105d przed rozpocz\u0119ciem pracy nad tak\u0105 klas\u0105, zalecam mocno zastanowi\u0107 si\u0119 do czego tak naprawd\u0119 jej potrzebujemy.<\/p>\n\n\n\n<p>Na samym pocz\u0105tku powinni\u015bmy zada\u0107 sobie pytania i znale\u017a\u0107 na nie odpowiedzi. <strong>Nie sztuk\u0105 jest znale\u017a\u0107 funkcjonalno\u015b\u0107 i zastosowanie do niej. Sztuk\u0105 jest zna\u0107 funkcjonalno\u015b\u0107 i stwierdzi\u0107 czy op\u0142aca si\u0119 j\u0105 wprowadzi\u0107. <\/strong>St\u0105d je\u015bli jest ma\u0142a potrzeba automatyzacji przypadk\u00f3w testowych a utrzymanie kosztuje minimum czasu, nasze testy nie wymagaj\u0105 specyficznego podej\u015bcia do danych testowych \u2013 zdecydowanie bardziej op\u0142aca si\u0119 utrzymywanie samych przypadk\u00f3w testowych zamiast utrzymywania tak\u017ce narz\u0119dzia kt\u00f3re je wspiera.<\/p>\n\n\n\n<p>W momencie w kt\u00f3rym jeste\u015bmy pewni, \u017ce taka funkcjonalno\u015b\u0107 jest nam potrzebna \u2013 powinni\u015bmy wiedzie\u0107 ju\u017c gdzie s\u0105 s\u0142abe punkty naszych test\u00f3w, i w kt\u00f3rych miejscach taka klasa mog\u0142a by je wesprze\u0107 mo\u017cliwie najlepiej \u2013 pami\u0119tajmy tak\u017ce, \u017ce wprowadzenie takiego narz\u0119dzia do projektu testowego w zaawansowanym stadium tak\u017ce jest czasoch\u0142onne, <strong>powinni\u015bmy to dok\u0142adnie wyestymowa\u0107 \u2013 uwzgl\u0119dniaj\u0105c czas na poprawki<\/strong>.<\/p>\n\n\n\n<p>Z do\u015bwiadczenia jestem w stanie wymieni\u0107 <strong>kilka najbardziej przydatnych miejsc w kt\u00f3rych zastosowanie zewn\u0119trznej klasy jest naprawd\u0119 pomocne i op\u0142acalnie<\/strong>:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Utrzymanie du\u017cej ilo\u015bci przypadk\u00f3w testowych<\/li>\n\n\n\n<li>Wymaganie dynamicznego zmieniania du\u017cej ilo\u015bci danych testowych<\/li>\n\n\n\n<li>Operacje na plikach wykorzystywanych w testach ( za\u0142\u0105czanie do request\u2019a, edycja element\u00f3w wewn\u0105trz)<\/li>\n\n\n\n<li>Optymalizacja krok\u00f3w groovy (kroki te cz\u0119sto zawieraj\u0105 powtarzalne fragmenty kodu kt\u00f3re mo\u017cemy wyci\u0105gn\u0105\u0107 na poziom wy\u017cej \u2013 do klasy zewn\u0119trznej i tym samym spowodowa\u0107, \u017ce nasz kod jest w jednym miejscu i jest reu\u017cywalny)<\/li>\n\n\n\n<li>Wymaganie u\u017cycia mechanizm\u00f3w niewbudowanych do SoapUI (np. kodowanie \/ dekodowanie danych testowych)<\/li>\n\n\n\n<li>Jednorazowa edycja przypadk\u00f3w testowych\n<ul class=\"wp-block-list\">\n<li>Przyk\u0142ad: Przy 240 przypadkach testowych, gdzie w ka\u017cdym z nich co najmniej raz nast\u0119puje tworzenie elementu na podstawie kt\u00f3rego pozosta\u0142e kroki wykonuj\u0105 operacje zmiany status\u00f3w i sprawdzanie asercji \u2013 specyfikacja projektu zmienia si\u0119, ten krok zostaje zmodyfikowany, a jego asercje musz\u0105 zosta\u0107 zast\u0105pione nowymi.<br>Musimy wykona\u0107 co najmniej 240 razy podobn\u0105 operacj\u0119, przy za\u0142o\u017ceniu \u017ce jedna taka zmiana zajmie nam oko\u0142o 7 minut, dodane nam zosta\u0142o oko\u0142o 1680 minut pracy \u2013 co daje nam 28 godzin, 3,5 dnia pracy bez przerwy. Napisanie metody kt\u00f3ra przejdzie przez ca\u0142y projekt i wykona dla ka\u017cdego kroku w projekcie sprawdzenie czy wymaga zmiany i jej ewentualne dokonanie, oraz uruchomienie jej, to oko\u0142o 2 godziny pracy, oraz ponad 3 dni wi\u0119cej czasu na inne obowi\u0105zki i odrobin\u0119 odpoczynku.<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n\n\n\n<p><strong>Najwa\u017cniejsze elementy na kt\u00f3re nale\u017cy zwr\u00f3ci\u0107 uwag\u0119:<\/strong><\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li>Upewnienie si\u0119 \u017ce w \u0142atwy i prosty spos\u00f3b jeste\u015bmy w stanie przekaza\u0107 do niej elementy odpowiedzialne za operacje wykonywane na projekcie, kt\u00f3re wymieni\u0142em w poprzednim artykule (context, testRunner)<\/li>\n\n\n\n<li>Zastosowanie wszystkich konwencji zgodnych z programowaniem obiektowym (enkapsulacja, dziedziczenie, reu\u017cywalno\u015b\u0107 kodu etc.)<\/li>\n\n\n\n<li>Rozdzielenie klas przez nas napisanych wzgl\u0119dem implementowanej funkcjonalno\u015bci (generatory danych testowych, klasy do edycji plik\u00f3w, konwertery, modele testowe etc.)<\/li>\n<\/ol>\n\n\n\n<p>Prawdopodobnie ww. rzeczy s\u0105 oczywiste, ale i tak nale\u017cy o nich wspomnie\u0107 \u2013 nale\u017cy pami\u0119ta\u0107, \u017ce zewn\u0119trzn\u0105 klas\u0119 trzeba utrzymywa\u0107 i zawsze podmienia\u0107 \u2013 <strong>ka\u017cdy musi mie\u0107 t\u0105 sam\u0105 wersj\u0119 dlatego zaleca si\u0119 wersjonowanie<\/strong> \u2013 aby nie by\u0142o w\u0105tpliwo\u015bci czy problemy wyst\u0119puj\u0105 w czyim\u015b projekcie, poniewa\u017c nie ma odpowiedniej wersji, czy jest tam po prostu b\u0142\u0105d.<\/p>\n\n\n\n<p>Reasumuj\u0105c, je\u015bli klasa do test\u00f3w zewn\u0119trznych jest naprawd\u0119 potrzebna, nale\u017cy si\u0119 mocno zastanowi\u0107 do czego. Z t\u0105 wiedz\u0105 powinni\u015bmy podzieli\u0107 te funkcjonalno\u015bci na grupy i w ten spos\u00f3b je zaimplementowa\u0107 tak aby ich p\u00f3\u017aniejsze utrzymanie kosztowa\u0142o nas jak najmniej czasu.<\/p>\n\n\n\n<p>W nast\u0119pnym artykule zaprezentuj\u0119 jak powinna wygl\u0105da\u0107 tak przygotowana biblioteka i jak wygl\u0105da jej zastosowanie. Poka\u017c\u0119 tak\u017ce jak napisa\u0107 i wykorzysta\u0107 elementy klasy, &nbsp;pokrywaj\u0105ce obszary wymienione przeze mnie wcze\u015bniej, kt\u00f3re najcz\u0119\u015bciej wymagaj\u0105 u\u017cycia takiego rozwi\u0105zania.<\/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;1775&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;2&quot;,&quot;greet&quot;:&quot;&quot;,&quot;legend&quot;:&quot;0\\\/5&quot;,&quot;size&quot;:&quot;30&quot;,&quot;title&quot;:&quot;Projektowanie zewn\u0119trznej klasy do test\u00f3w SoapUI&quot;,&quot;width&quot;:&quot;0&quot;,&quot;_legend&quot;:&quot;{score}\\\/5&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: 2px\">\n            \n\n<div class=\"kksr-icon\" style=\"width: 30px; height: 30px;\"><\/div>\n        <\/div>\n            <div class=\"kksr-star\" data-star=\"2\" style=\"padding-right: 2px\">\n            \n\n<div class=\"kksr-icon\" style=\"width: 30px; height: 30px;\"><\/div>\n        <\/div>\n            <div class=\"kksr-star\" data-star=\"3\" style=\"padding-right: 2px\">\n            \n\n<div class=\"kksr-icon\" style=\"width: 30px; height: 30px;\"><\/div>\n        <\/div>\n            <div class=\"kksr-star\" data-star=\"4\" style=\"padding-right: 2px\">\n            \n\n<div class=\"kksr-icon\" style=\"width: 30px; height: 30px;\"><\/div>\n        <\/div>\n            <div class=\"kksr-star\" data-star=\"5\" style=\"padding-right: 2px\">\n            \n\n<div class=\"kksr-icon\" style=\"width: 30px; height: 30px;\"><\/div>\n        <\/div>\n    <\/div>\n    \n<div class=\"kksr-stars-active\" style=\"width: 0px;\">\n            <div class=\"kksr-star\" style=\"padding-right: 2px\">\n            \n\n<div class=\"kksr-icon\" style=\"width: 30px; height: 30px;\"><\/div>\n        <\/div>\n            <div class=\"kksr-star\" style=\"padding-right: 2px\">\n            \n\n<div class=\"kksr-icon\" style=\"width: 30px; height: 30px;\"><\/div>\n        <\/div>\n            <div class=\"kksr-star\" style=\"padding-right: 2px\">\n            \n\n<div class=\"kksr-icon\" style=\"width: 30px; height: 30px;\"><\/div>\n        <\/div>\n            <div class=\"kksr-star\" style=\"padding-right: 2px\">\n            \n\n<div class=\"kksr-icon\" style=\"width: 30px; height: 30px;\"><\/div>\n        <\/div>\n            <div class=\"kksr-star\" style=\"padding-right: 2px\">\n            \n\n<div class=\"kksr-icon\" style=\"width: 30px; height: 30px;\"><\/div>\n        <\/div>\n    <\/div>\n<\/div>\n                \n\n<div class=\"kksr-legend\" style=\"font-size: 24px;\">\n            <span class=\"kksr-muted\"><\/span>\n    <\/div>\n    <\/div>\n","protected":false},"excerpt":{"rendered":"<p>W poprzednim artykule opisa\u0142em krok po kroku w jaki spos\u00f3b utworzy\u0107 i wczyta\u0107 zewn\u0119trzn\u0105 klas\u0119&nbsp; pomocnicz\u0105 do test\u00f3w SoapUI. W &hellip; <a class=\"continued-btn\" href=\"https:\/\/sii.pl\/blog\/projektowanie-zewnetrznej-klasy-do-testow-soapui\/\">Continued<\/a><\/p>\n","protected":false},"author":56,"featured_media":1863,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"_editorskit_title_hidden":false,"_editorskit_reading_time":2,"_editorskit_is_block_options_detached":false,"_editorskit_block_options_position":"{}","inline_featured_image":false,"footnotes":""},"categories":[1317],"tags":[144,146],"class_list":["post-1775","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-testowanie","tag-soapui","tag-testing"],"acf":[],"aioseo_notices":[],"republish_history":[],"featured_media_url":"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2016\/01\/teksty_soapUI.jpg","category_names":["Testowanie"],"_links":{"self":[{"href":"https:\/\/sii.pl\/blog\/wp-json\/wp\/v2\/posts\/1775"}],"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=1775"}],"version-history":[{"count":2,"href":"https:\/\/sii.pl\/blog\/wp-json\/wp\/v2\/posts\/1775\/revisions"}],"predecessor-version":[{"id":23154,"href":"https:\/\/sii.pl\/blog\/wp-json\/wp\/v2\/posts\/1775\/revisions\/23154"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/sii.pl\/blog\/wp-json\/wp\/v2\/media\/1863"}],"wp:attachment":[{"href":"https:\/\/sii.pl\/blog\/wp-json\/wp\/v2\/media?parent=1775"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/sii.pl\/blog\/wp-json\/wp\/v2\/categories?post=1775"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/sii.pl\/blog\/wp-json\/wp\/v2\/tags?post=1775"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}