{"id":3856,"date":"2017-03-27T09:18:48","date_gmt":"2017-03-27T07:18:48","guid":{"rendered":"https:\/\/sii.pl\/blog\/?p=3856"},"modified":"2023-08-28T16:05:52","modified_gmt":"2023-08-28T14:05:52","slug":"testy-wizualne","status":"publish","type":"post","link":"https:\/\/sii.pl\/blog\/testy-wizualne\/","title":{"rendered":"Testy wizualne"},"content":{"rendered":"\n<p>Testowanie wizualne jest pr\u00f3b\u0105 weryfikacji, czy interfejs graficzny u\u017cytkownika wygl\u0105da poprawnie na zadanym ekranie. Celem takich test\u00f3w jest znalezienie bug\u00f3w, czyli niepoprawnego u\u0142o\u017cenia layout\u00f3w, problem\u00f3w z czcionkami, renderowaniem, zanim ko\u0144cowy u\u017cytkownik je zobaczy. Dodatkowo, testowanie wizualne mo\u017ce by\u0107 u\u017cywane do weryfikowania tre\u015bci stron.<\/p>\n\n\n\n<p>Jest to rozwi\u0105zanie idealne dla stron internetowych posiadaj\u0105cych kokpity, wykresy itd., poniewa\u017c tradycyjne testy automatyczne mog\u0105 napotka\u0107 tu spore wyzwanie. Bior\u0105c pod uwag\u0119 liczb\u0119 zmiennych takich jak przegl\u0105darki, systemy operacyjne, urz\u0105dzenia, rozdzielczo\u015bci, responsive design itd., to charakter takich test\u00f3w mo\u017ce by\u0107 nieco skomplikowany. Nie ma sposobu aby sprawdzi\u0107 automatami funkcjonalnymi czy dane komponenty wy\u015bwietlaj\u0105 si\u0119 prawid\u0142owo. Aby m\u00f3wi\u0107 o wst\u0119pnym pokryciu test\u00f3w wizualnych spe\u0142nione musz\u0105 by\u0107 nast\u0119puj\u0105ce warunki:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Ka\u017cdy komponent graficzny ma w\u0142a\u015bciwy kolor, kszta\u0142t, pozycj\u0119 i rozmiar<\/li>\n\n\n\n<li>Komponenty nie nachodz\u0105 na siebie i nie zakrywaj\u0105 pozosta\u0142ych<\/li>\n\n\n\n<li>\u017badna z grafik nie jest uszkodzona, niepe\u0142na<\/li>\n\n\n\n<li>Tre\u015b\u0107 i layout nie jest uszkodzony w zale\u017cno\u015bci od wielko\u015bci, rozdzielczo\u015bci ekranu, wszystkie komponenty rozk\u0142adaj\u0105 si\u0119 r\u00f3wnomiernie w zale\u017cno\u015bci od rozmiaru wy\u015bwietlacza<\/li>\n<\/ul>\n\n\n\n<p>Na rynku pojawi\u0142o si\u0119 kilka firm oferuj\u0105cych narz\u0119dzia wspomagaj\u0105ce testy wizualne jak np. DPXDT, BackstopJS, Gemini, VisualCeption czy Needle. Dzi\u015b chcia\u0142abym jednak zaprezentowa\u0107 rozwi\u0105zanie zaproponowane przez Applitools. Firma ta stworzy\u0142a produkt walidacji wizualnej nazwanej Applitools Eyes.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">EYES<\/h2>\n\n\n\n<p>Jest to rozwi\u0105zanie automatyzacji test\u00f3w wizualnych dla stron internetowych, aplikacji mobilnych oraz desktopowych. Pomaga sprawdzi\u0107 czy zawarto\u015b\u0107 jest wy\u015bwietlana poprawnie na wszystkich typach przegl\u0105darek, urz\u0105dzeniach, systemach operacyjnych. Poprzez wcze\u015bniej manualne, p\u00f3\u017aniej za\u015b funkcjonalne testowanie, w\u0142\u0105czaj\u0105c w to layouty, tre\u015b\u0107 i CSS \u2013 Applitools Eyes natychmiast sprawdza, czy wszystkie elementy interfejsu u\u017cytkownika s\u0105 poprawne, alarmuj\u0105c o wszystkich istotnych kwestiach, kt\u00f3re s\u0105 sprzeczne z po\u017c\u0105danym UI, ignoruje za\u015b nieistotne zmiany, kt\u00f3re dla u\u017cytkownika ko\u0144cowego s\u0105 bez znaczenia. Takie rozwi\u0105zanie pozwala zaoszcz\u0119dzi\u0107 czas na pisanie setek linii kodu testowego, kt\u00f3ry musia\u0142by, nie zawsze w 100% sprawdzi\u0107 poprawno\u015b\u0107 wy\u015bwietlanej tre\u015bci.<\/p>\n\n\n\n<p>Applitools Eyes bezproblemowo integruje si\u0119 z wi\u0119kszo\u015bci\u0105 framework\u00f3w do testowania, takich jak Selenium, Appium, HP QTP\/UFT, MS CodedUI, Protractor for AngularJS i innymi. Dodatkowym atutem tego narz\u0119dzia jest tak\u017ce elastyczne i przepustowe rozwi\u0105zanie u\u017cywania chmury, wspieranie nielimitowanych mo\u017cliwo\u015bci uruchamiania test\u00f3w, tak\u017ce r\u00f3wnolegle, co sprawia ze Eyes jest dobrym rozwi\u0105zaniem dla wi\u0119kszych team\u00f3w.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">EYES i APPIUM<\/h2>\n\n\n\n<p>Zaprezentuj\u0119, jak stworzy\u0107 test wizualny aplikacji mobilnej przy u\u017cyciu Appium i Applitools Eyes. Po <a href=\"https:\/\/applitools.com\/sign-up\/\" rel=\"nofollow\" >za\u0142o\u017ceniu konta&nbsp; <\/a>i zalogowaniu do dashboardu, mo\u017cna przej\u015b\u0107 do pobrania SDK. Dla Appium nale\u017cy pobra\u0107<a href=\"https:\/\/store.applitools.com\/download\/eyes_selenium_java\/\" rel=\"nofollow\" > SDK dla Selenium<\/a>, rozpakowa\u0107 je w dowolnym miejscu na komputerze. Otwieramy projekt Appium w Eclipse, przechodzimy do <em>Properties -&gt; Java Build Path -&gt; Add External JAR\u2019s<\/em> i dodajemy nasze wypakowane jary.<\/p>\n\n\n\n<p>Na pocz\u0105tku nale\u017cy zainicjowa\u0107 obiekt <em>Eyes<\/em>. Kolejnym istotnym krokiem jest ustawienie <em>ApiKey<\/em>, kt\u00f3re jest niezb\u0119dne do pracy z serwerem. Aby pracowa\u0107 z danym wy\u015bwietlaczem\/rozdzielczo\u015bci\u0105, nale\u017cy ustawi\u0107 <strong>baseline image<\/strong>, czy obrazek bazowy, z kt\u00f3rym b\u0119d\u0105 por\u00f3wnywane wszystkie kolejne zrzuty ekranu po ka\u017cdej zmianie w aplikacji. Potem nast\u0119puje inicjowanie ustawie\u0144 dla Appium i inicjacja webdrivera. Istotnym elementem, kt\u00f3ry nale\u017cy om\u00f3wi\u0107 jest punkt walidacji wizualnej <em>checkWindow()<\/em>. Tu tworzony jest zrzut ekranu wysy\u0142any na serwer w celu walidacji jego poprawno\u015bci w stosunku do obrazka bazowego. Nast\u0119pnie nast\u0119puje zamkni\u0119cie drivera.<\/p>\n\n\n\n<p>Test uruchamiany jest jak zwyk\u0142y test Appium, mo\u017cna go uruchomi\u0107 poprzez TestNG lub JUnit, oba sposoby zadzia\u0142aj\u0105. Warunkiem koniecznym jest oczywi\u015bcie uruchomiony serwer Appium i poprawna jego konfiguracja.<\/p>\n\n\n\n<figure class=\"wp-block-image aligncenter\"><a href=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2017\/02\/al1.png\"><img decoding=\"async\" width=\"750\" height=\"588\" src=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2017\/02\/al1.png\" alt=\"eyes in eclipse\" class=\"wp-image-3857\" srcset=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2017\/02\/al1.png 750w, https:\/\/sii.pl\/blog\/wp-content\/uploads\/2017\/02\/al1-300x235.png 300w\" sizes=\"(max-width: 750px) 100vw, 750px\" \/><\/a><\/figure>\n\n\n\n<p>Walidowany mo\u017ce by\u0107 ca\u0142y ekran, jak tak\u017ce okre\u015blona ramka, obszar w ramce. Mo\u017cna tworzy\u0107 tak\u017ce branche, co u\u0142atwia prac\u0119, je\u015bli aplikacja jest tworzona stopniowo, wdra\u017cane s\u0105 kolejne zmiany, kt\u00f3re nie s\u0105 zatwierdzane jednocze\u015bnie. Istnieje tak\u017ce mo\u017cliwo\u015b\u0107 okre\u015blenia w kodzie stopnia por\u00f3wnywania obrazk\u00f3w:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Exact<\/strong> \u2013 por\u00f3wnanie piksel do piksela, obrazy musz\u0105 by\u0107 w 100% identyczne<\/li>\n\n\n\n<li><strong>Strict<\/strong> \u2013 domy\u015blny stopie\u0144 por\u00f3wnania, tylko niewielkie zmiany niewidoczne go\u0142ym okiem s\u0105 ignorowane<\/li>\n\n\n\n<li><strong>Content<\/strong> \u2013 ignoruje style i zmiany tre\u015bci (przydatne je\u015bli strona zawiera tre\u015bci kt\u00f3re nie s\u0105 przedmiotem walidacji)<\/li>\n\n\n\n<li><strong>Layout<\/strong> \u2013 ignoruje zmiany tre\u015bci, skupia si\u0119 na zmianach layout\u00f3w (u\u017cyteczne dla dynamicznych tre\u015bci)<\/li>\n<\/ul>\n\n\n\n<p>Przejd\u017amy do dashboardu i wynik\u00f3w testu. W wynikach zobaczymy nazw\u0119 testu, jego status, dat\u0119 oraz godzin\u0119 a tak\u017ce rozdzielczo\u015b\u0107 na jakiej przeprowadzono test.<\/p>\n\n\n\n<figure class=\"wp-block-image aligncenter\"><a href=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2017\/02\/al2.png\"><img decoding=\"async\" width=\"1024\" height=\"369\" src=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2017\/02\/al2-1024x369.png\" alt=\"eyes dashboard\" class=\"wp-image-3858\" srcset=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2017\/02\/al2-1024x369.png 1024w, https:\/\/sii.pl\/blog\/wp-content\/uploads\/2017\/02\/al2-300x108.png 300w, https:\/\/sii.pl\/blog\/wp-content\/uploads\/2017\/02\/al2-768x276.png 768w, https:\/\/sii.pl\/blog\/wp-content\/uploads\/2017\/02\/al2.png 1092w\" sizes=\"(max-width: 1024px) 100vw, 1024px\" \/><\/a><\/figure>\n\n\n\n<p>Po przej\u015bciu do szczeg\u00f3\u0142\u00f3w mo\u017cemy zobaczy\u0107 obrazek bazowy oraz bie\u017c\u0105cy. Mo\u017cemy tak\u017ce manualnie ustawi\u0107 stopie\u0144 por\u00f3wnania obrazk\u00f3w, doda\u0107 obszary, kt\u00f3re maj\u0105 by\u0107 ignorowane, zmienne. Mo\u017cna tak\u017ce r\u0119cznie zatwierdzi\u0107 dany zrzut ekranu lub go odrzuci\u0107, zaakceptowa\u0107 podobne lub wszystkie.<\/p>\n\n\n\n<figure class=\"wp-block-image aligncenter\"><a href=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2017\/02\/al3.png\"><img decoding=\"async\" width=\"1024\" height=\"52\" src=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2017\/02\/al3-1024x52.png\" alt=\"eyes menu\" class=\"wp-image-3859\" srcset=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2017\/02\/al3-1024x52.png 1024w, https:\/\/sii.pl\/blog\/wp-content\/uploads\/2017\/02\/al3-300x15.png 300w, https:\/\/sii.pl\/blog\/wp-content\/uploads\/2017\/02\/al3-768x39.png 768w, https:\/\/sii.pl\/blog\/wp-content\/uploads\/2017\/02\/al3.png 1094w\" sizes=\"(max-width: 1024px) 100vw, 1024px\" \/><\/a><\/figure>\n\n\n\n<p>Jednym z wa\u017cniejszych minus\u00f3w tego narz\u0119dzia jest konieczno\u015b\u0107 ustawienia obrazka bazowego dla ka\u017cdego urz\u0105dzenia\/rozdzielczo\u015bci, co wi\u0105\u017ce si\u0119 z obowi\u0105zkiem posiadania dobrze wy\u015bwietlaj\u0105cej si\u0119 aplikacji na ka\u017cdym rozwa\u017canym urz\u0105dzeniu.<\/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;3856&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;2&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: 2)&quot;,&quot;size&quot;:&quot;18&quot;,&quot;title&quot;:&quot;Testy wizualne&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: 2)    <\/div>\n    <\/div>\n","protected":false},"excerpt":{"rendered":"<p>Testowanie wizualne jest pr\u00f3b\u0105 weryfikacji, czy interfejs graficzny u\u017cytkownika wygl\u0105da poprawnie na zadanym ekranie. Celem takich test\u00f3w jest znalezienie bug\u00f3w, &hellip; <a class=\"continued-btn\" href=\"https:\/\/sii.pl\/blog\/testy-wizualne\/\">Continued<\/a><\/p>\n","protected":false},"author":37,"featured_media":3860,"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":[279,467,368,469,275,146,468],"class_list":["post-3856","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-testowanie","tag-appium","tag-applitools-eyes","tag-eclipse","tag-layout","tag-mobile","tag-testing","tag-testy-wizualne"],"acf":[],"aioseo_notices":[],"republish_history":[],"featured_media_url":"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2017\/02\/apli.png","category_names":["Testowanie"],"_links":{"self":[{"href":"https:\/\/sii.pl\/blog\/wp-json\/wp\/v2\/posts\/3856"}],"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\/37"}],"replies":[{"embeddable":true,"href":"https:\/\/sii.pl\/blog\/wp-json\/wp\/v2\/comments?post=3856"}],"version-history":[{"count":2,"href":"https:\/\/sii.pl\/blog\/wp-json\/wp\/v2\/posts\/3856\/revisions"}],"predecessor-version":[{"id":23843,"href":"https:\/\/sii.pl\/blog\/wp-json\/wp\/v2\/posts\/3856\/revisions\/23843"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/sii.pl\/blog\/wp-json\/wp\/v2\/media\/3860"}],"wp:attachment":[{"href":"https:\/\/sii.pl\/blog\/wp-json\/wp\/v2\/media?parent=3856"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/sii.pl\/blog\/wp-json\/wp\/v2\/categories?post=3856"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/sii.pl\/blog\/wp-json\/wp\/v2\/tags?post=3856"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}