{"id":7687,"date":"2019-07-24T15:00:51","date_gmt":"2019-07-24T13:00:51","guid":{"rendered":"https:\/\/sii.pl\/blog\/?p=7687"},"modified":"2025-05-07T12:02:43","modified_gmt":"2025-05-07T10:02:43","slug":"automatyzacja-testow-systemow-wbudowanych-z-wykorzystaniem-robot-frameworka-czesc-1","status":"publish","type":"post","link":"https:\/\/sii.pl\/blog\/automatyzacja-testow-systemow-wbudowanych-z-wykorzystaniem-robot-frameworka-czesc-1\/","title":{"rendered":"Automatyzacja test\u00f3w System\u00f3w Wbudowanych z wykorzystaniem Robot Frameworka &#8211; cz\u0119\u015b\u0107 1"},"content":{"rendered":"\n<section class=\"wp-block-sii-block-section sii-t-section\" data-mpaddingtop=\"\" data-mpaddingbottom=\"\">\n<div class=\"wp-block-sii-block-section-container container\" data-mmargintop=\"\">\n<p>Testowanie w Embedded od dawna by\u0142o procesem \u017cmudnym i trudnym w automatyzacji. Wiele dziedzin przemys\u0142u wci\u0105\u017c opiera si\u0119 w du\u017cej mierze na testach r\u0119cznych. Wyd\u0142u\u017ca to czas od wypuszczenia oprogramowania do znalezienia defekt\u00f3w. Na szcz\u0119\u015bcie pojawia si\u0119 coraz wi\u0119cej narz\u0119dzi i metod automatyzacji, kt\u00f3re mo\u017cna zaadaptowa\u0107 do pracy nad oprogramowaniem w Embedded. W tym artykule przedstawimy przyk\u0142adowy projekt Embedded wraz z metod\u0105 przetestowania jego dzia\u0142ania.<\/p>\n\n\n\n<!--more-->\n\n\n\n<h3 class=\"wp-block-heading\">Wprowadzenie<\/h3>\n\n\n\n<p>Najcz\u0119stsz\u0105 praktyk\u0105 jest wykorzystanie osobnych urz\u0105dze\u0144 do pobudzania i zbierania danych z naszego DUT (Device Under Test). Dzi\u0119ki takiemu rozwi\u0105zaniu mo\u017cemy zaprogramowa\u0107 uk\u0142ad, automatycznie wprowadzi\u0107 go w \u017c\u0105dany stan i symulowa\u0107 nieistniej\u0105ce peryferia. Takie urz\u0105dzenia musz\u0105 zapewni\u0107 wsparcie dla wielu magistrali komunikacyjnych czy sterowanie GPIO. Przyk\u0142adem takiego komputera jest Raspberry Pi lub BeagleBone.<\/p>\n\n\n\n<p>Do zarz\u0105dzania testem i ca\u0142ym \u015brodowiskiem testowym od zainicjalizowaniu potrzebnych modu\u0142\u00f3w po zebranie wynik\u00f3w potrzebujemy jarzmo testowe (ang. test harness). Istotna jest mo\u017cliwo\u015b\u0107 definiowania w\u0142asnych bibliotek testowych, na przyk\u0142ad w celu wspierania komunikacji z urz\u0105dzeniem. Kolejnym wymogiem jest wsparcie dla j\u0119zyk\u00f3w skryptowych w celu \u0142atwego tworzenia test\u00f3w automatycznych. Istotna jest te\u017c mo\u017cliwo\u015b\u0107 konfiguracji i uruchamiania test\u00f3w za pomoc\u0105 plik\u00f3w konfiguracyjnych. \u015awietnym narz\u0119dziem, kt\u00f3re spe\u0142nia te wymagania jest Robot Framework.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">O Robot Frameworku<\/h3>\n\n\n\n<p>Robot Framework jest darmowym, otwarto \u017ar\u00f3d\u0142owym narz\u0119dziem do tworzenia test\u00f3w akceptacyjnych oraz rozwoju oprogramowania opartym na tych testach (Acceptance TDD). Poza tym, Robot pozwala nam nie tylko na tworzenie test\u00f3w, ale mo\u017ce by\u0107 r\u00f3wnie\u017c narz\u0119dziem stosowanym do automatyzacji r\u00f3\u017cnych proces\u00f3w. Dodatkowo Robot pozwala na wygodn\u0105 egzekucj\u0119 oraz generowanie raport\u00f3w z tych proces\u00f3w. Jego najwi\u0119ksz\u0105 zalet\u0105 jest mo\u017cliwo\u015b\u0107 wrapowania API w s\u0142owa kluczowe \u2013 frazy w j\u0119zyku naturalnym, kt\u00f3re s\u0105 bardziej zrozumia\u0142e dla os\u00f3b nie zag\u0142\u0119bionych w techniczn\u0105 stron\u0119 projektu. Przyk\u0142ady i szczeg\u00f3\u0142owe wyja\u015bnienie przedstawiono w dalszej cz\u0119\u015bci artyku\u0142u. Sama sk\u0142adnia tego frameworka jest w pewien spos\u00f3b podobna do Pythona: trzeba zwraca\u0107 szczeg\u00f3ln\u0105 uwag\u0119 na stosowanie odst\u0119p\u00f3w i tabulacji. Jednak to nie wszystko, mo\u017cemy w nim r\u00f3wnie\u017c u\u017cywa\u0107 API napisanego w Javie!<\/p>\n\n\n\n<p>W celu zaprezentowania mo\u017cliwo\u015bci Robot Frameworka wykorzystamy mini komputer Raspberry Pi w wersji 3B, wykorzystuj\u0105cy czujnik temperatury i wilgoci DHT11 oraz wy\u015bwietlacz LCD z konwerterem do I2C, LCM1602.<\/p>\n\n\n\n<p>Komunikacja z tymi urz\u0105dzeniami odbywa si\u0119 za pomoc\u0105 protoko\u0142\u00f3w <strong>I2C<\/strong> (wy\u015bwietlacz LCD) oraz <strong>OneWire <\/strong>(czujnik DHT11).<\/p>\n\n\n\n<p>Kolorami czerwonymi oznaczone s\u0105 po\u0142\u0105czenia zasilaj\u0105ce o napi\u0119ciu 5V, czarnymi po\u0142\u0105czenie masy. Inne kolory s\u0142u\u017c\u0105 do komunikacji z urz\u0105dzeniami.<\/p>\n\n\n\n<p>Jak zainstalowa\u0107 Robot Frameworka na Raspberry Pi lub innym komputerze? Bardzo prosto! Wystarczy:<\/p>\n\n\n\n<ol class=\"wp-block-list\"><li>Otworzy\u0107 terminal (Ctrl+Alt+t) lub, w przypadku systemu Windows, wiersz polece\u0144.<\/li><li>Wpisa\u0107 w terminalu\/wierszu polece\u0144 polecenie \u201c<em>pip install robotframework\u201d <\/em>lub \u201cpython3 \u2013m pip <em>install robotframework\u201d.<\/em><\/li><\/ol>\n\n\n\n<h3 class=\"wp-block-heading\">Sposoby pisania test\u00f3w<\/h3>\n\n\n\n<p>Testy akceptacyjne mo\u017cemy pisa\u0107 na kilka r\u00f3\u017cnych sposob\u00f3w, najlepiej w takim, aby by\u0142 zrozumia\u0142y dla wi\u0119kszo\u015bci os\u00f3b zainteresowanych projektem. Poni\u017cej przedstawiamy 3 sposoby na pisanie test\u00f3w w Robot Frameworku, kt\u00f3re spe\u0142niaj\u0105 to za\u0142o\u017cenie<\/p>\n\n\n\n<h4 class=\"wp-block-heading\">Keyword driven tests<\/h4>\n\n\n\n<p>Styl ten polega na \u201copakowywaniu\u201d kodu napisanego w Pythonie lub w Javie do s\u0142\u00f3w kluczowych, kt\u00f3re s\u0105 prostsze do zrozumienia przez cz\u0142owieka. Na przyk\u0142ad kod, kt\u00f3ry odpowiada za wyczyszczenie ekranu:<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\"><pre class=\"brush: python; title: ; notranslate\" title=\"\">def send_clear_command(self):\n&amp;quot;&amp;quot;&amp;quot; Clears LCD screen.&amp;quot;&amp;quot;&amp;quot;\nself.send_command(0x01, LCD_CMD)\ntime.sleep(E_DELAY)<\/pre><\/pre>\n\n\n\n<p>Mo\u017cna opakowa\u0107 w dekorator:<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\"><pre class=\"brush: python; title: ; notranslate\" title=\"\">@keyword(name=&amp;quot;Clear screen&amp;quot;)<\/pre><\/pre>\n\n\n\n<p>Dzi\u0119ki takiemu zabiegowi nie musimy stosowa\u0107 cz\u0119sto niezrozumia\u0142ych funkcji. Zamiast tego, mo\u017cemy je zast\u0105pi\u0107 frazami zrozumia\u0142ymi dla ka\u017cdego.<\/p>\n\n\n\n<p>Tak wygl\u0105da przyk\u0142ad testu, kt\u00f3ry jest napisany z u\u017cyciem s\u0142\u00f3w kluczowych (ang. keywords):<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\"><pre class=\"brush: python; title: ; notranslate\" title=\"\">Cleaning screen should remove the text from both lines\n&#x5B;Tags]&amp;amp;amp;nbsp; LCD\ndisplay message&amp;amp;amp;nbsp; Hello World&amp;amp;amp;nbsp; in line 1\ndisplay message&amp;amp;amp;nbsp; Robot Framework in line 2\nAsk user if Is there any text displayed on the display?&#x5B;y\/n]\nClear screen\nAsk user if Is there any text displayed on the display?&#x5B;y\/n]<\/pre><\/pre>\n\n\n\n<h4 class=\"wp-block-heading\">Data Driven Tests<\/h4>\n\n\n\n<p>Ten styl polega na stworzeniu szablonu testu, a nast\u0119pnie na uruchamianiu go wielokrotnie, za ka\u017cdym razem z innymi argumentami I oczekiwanym rezultatem.. Najlepiej b\u0119dzie to pokaza\u0107, w tym przypadku dla test\u00f3w wy\u015bwietlacza LCD. Oto jak wygl\u0105da szablon testu:<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\"><pre class=\"brush: python; title: ; notranslate\" title=\"\">*** Keywords ***\nVerify if text is displayed\n&#x5B;Arguments]&amp;amp;amp;nbsp; ${text}&amp;amp;amp;nbsp; ${expected_response}\ndisplay message&amp;amp;amp;nbsp; ${text}\nlog to console&amp;amp;amp;nbsp; \\nDo you see &amp;quot;${text}&amp;quot; on the screen?&#x5B;y\/n]\n${answer} =&amp;amp;amp;nbsp; user verification\nshould be equal as strings&amp;amp;amp;nbsp; ${answer}&amp;amp;amp;nbsp; ${expected_response}<\/pre><\/pre>\n\n\n\n<p>Nast\u0119pnie, nale\u017cy w sekcji <strong>Settings<\/strong> zdefiniowa\u0107 ch\u0119\u0107 u\u017cycia tego szablonu do test\u00f3w.<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\"><pre class=\"brush: python; title: ; notranslate\" title=\"\">Test Template&amp;amp;amp;nbsp; Verify if text is displayed<\/pre><\/pre>\n\n\n\n<p>Maj\u0105c spe\u0142nione obie z tych rzeczy, mo\u017cemy zabra\u0107 si\u0119 za tworzenie przypadk\u00f3w testowych. W tym przypadku testy maj\u0105 form\u0119 kolumnow\u0105. Polega to na tym, \u017ce w pierwszej kolumnie wpisujemy nazw\u0119 testu, a w kolejnych kolumnach argumenty, jakie b\u0119d\u0105 u\u017cywane w te\u015bcie. Dzi\u0119ki temu, kod test\u00f3w jest bardzo czytelny.<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\"><pre class=\"brush: python; title: ; notranslate\" title=\"\">*** Test Cases ***&amp;amp;amp;nbsp; &amp;amp;amp;nbsp; &amp;amp;amp;nbsp;Text&amp;amp;amp;nbsp; &amp;amp;amp;nbsp; &amp;amp;amp;nbsp; &amp;amp;amp;nbsp; &amp;amp;amp;nbsp; &amp;amp;amp;nbsp; &amp;amp;amp;nbsp; &amp;amp;amp;nbsp; &amp;amp;amp;nbsp; &amp;amp;amp;nbsp; &amp;amp;amp;nbsp; &amp;amp;amp;nbsp; &amp;amp;amp;nbsp;Expected_Response\n\nShort text&amp;amp;amp;nbsp; &amp;amp;amp;nbsp; &amp;amp;amp;nbsp; &amp;amp;amp;nbsp; &amp;amp;amp;nbsp; &amp;amp;amp;nbsp; &amp;amp;amp;nbsp;Hello there.&amp;amp;amp;nbsp; &amp;amp;amp;nbsp; &amp;amp;amp;nbsp; &amp;amp;amp;nbsp; &amp;amp;amp;nbsp; &amp;amp;amp;nbsp; &amp;amp;amp;nbsp; &amp;amp;amp;nbsp; &amp;amp;amp;nbsp; y\nLonger text&amp;amp;amp;nbsp; &amp;amp;amp;nbsp; &amp;amp;amp;nbsp; &amp;amp;amp;nbsp; &amp;amp;amp;nbsp; &amp;amp;amp;nbsp; &amp;amp;amp;nbsp;Hello, my precious world!&amp;amp;amp;nbsp; &amp;amp;amp;nbsp; y\nSpecial characters&amp;amp;amp;nbsp; &amp;amp;amp;nbsp; &amp;amp;amp;nbsp; WHAT IS $!@$%&amp;amp;amp;amp;*#@?? here?&amp;amp;amp;nbsp; &amp;amp;amp;nbsp; y\nGreek letters&amp;amp;amp;nbsp; &amp;amp;amp;nbsp; &amp;amp;amp;nbsp; &amp;amp;amp;nbsp; &amp;amp;amp;nbsp; &amp;amp;amp;nbsp;\u0394\u0398\u03c6\u03c1\u03c0\u03be\u039e\u03a6\u03a8&amp;amp;amp;nbsp; &amp;amp;amp;nbsp; &amp;amp;amp;nbsp; &amp;amp;amp;nbsp; &amp;amp;amp;nbsp; &amp;amp;amp;nbsp; &amp;amp;amp;nbsp; &amp;amp;amp;nbsp; &amp;amp;amp;nbsp; &amp;amp;amp;nbsp; n\n<\/pre><\/pre>\n\n\n\n<h4 class=\"wp-block-heading\">Gherkin Style Tests<\/h4>\n\n\n\n<p>Jest to sk\u0142adnia bardzo zbli\u017cona do pierwszego sposobu, r\u00f3\u017cni si\u0119 nieznacznie, poniewa\u017c dodatkowo stosuje s\u0142owa G<em>iven<\/em>, W<em>hen<\/em>, <em>and<\/em> oraz <em>Then<\/em>. Pozwala nam to na jeszcze precyzyjniejsze okre\u015blenie zachowania, jakiego oczekujemy od oprogramowania. Przyk\u0142adowo:<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\"><pre class=\"brush: python; title: ; notranslate\" title=\"\">Given a clean screen\nWhen \u201cAn Example text\u201d being displayed\nThen&amp;amp;amp;nbsp; User should see mentioned text in the screen\n<\/pre><\/pre>\n\n\n\n<h3 class=\"wp-block-heading\">Jaki jest cel naszego testowania?<\/h3>\n\n\n\n<p>Celem naszego test\u00f3w jest udowodnienie, \u017ce pod\u0142\u0105czone peryferia (czujnik DHT11 oraz wy\u015bwietlacz) dzia\u0142aj\u0105 zgodnie z okre\u015blonymi wymaganiami. Dokonamy te\u017c weryfikacji oprogramowania obs\u0142uguj\u0105cego te urz\u0105dzenia. W tym celu zdefiniowali\u015bmy list\u0119 wymaga\u0144:<\/p>\n\n\n\n<ol class=\"wp-block-list\"><li>Czujnik temperatury DHT11<ul><li>Czujnik powinien by\u0107 podpi\u0119ty pod pin 36.<\/li><li>Czujnik powinien zwr\u00f3ci\u0107 poprawne dane poni\u017cej okre\u015blonego czasu (domy\u015blnie 10 sekund).<\/li><li>Pr\u00f3by odczytania z niepod\u0142\u0105czonych pin\u00f3w nie powinno si\u0119 uda\u0107.<\/li><li>Odczytana temperatura powinna mie\u015bci\u0107 si\u0119 w zakresie od 18 do 30 stopni Celsjusza.<\/li><li>Odczytana wilgotno\u015b\u0107 powinna mie\u015bci\u0107 si\u0119 w zakresie od 0 do 80 %.<\/li><li>Modu\u0142 obs\u0142uguj\u0105cy czujnik powinien zwraca\u0107 reprezentacj\u0119 temperatury w formacie \u201c C\u201d.<\/li><\/ul><\/li><li>Wy\u015bwietlacz LCD 2&#215;16<ul><li>Wy\u015bwietlacz powinien mie\u0107 mo\u017cliwo\u015b\u0107 wy\u015bwietlania tekstu w dw\u00f3ch liniach.<\/li><li>Je\u015bli tekst do wy\u015bwietlenia ma wi\u0119cej ni\u017c 16 znak\u00f3w i zadane jest wy\u015bwietlenie w pierwszej linii, to wy\u015bwietlacz powinien przedstawi\u0107 tekst w dw\u00f3ch liniach.<\/li><li>Wy\u015bwietlacz nie powinien przedstawia\u0107 tekstu, je\u015bli tekst do wy\u015bwietlenia ma wi\u0119cej ni\u017c 16 znak\u00f3w i zadane jest wy\u015bwietlenie w drugiej linii.<\/li><li>Wy\u015bwietlacz nie powinien przedstawia\u0107 tekstu, kt\u00f3ry ma wi\u0119cej ni\u017c 32 znaki.<\/li><li>Wy\u015bwietlacz powinien mie\u0107 zaimplementowan\u0105 opcj\u0119 wyczyszczenia ekranu z wszelkiego tekstu.<\/li><\/ul><\/li><\/ol>\n\n\n\n<p>Niekt\u00f3rych test\u00f3w nie jeste\u015bmy w pe\u0142ni zautomatyzowa\u0107 ze wzgl\u0119du na ograniczenia technologiczne lub bud\u017cetowe. Przyk\u0142adem takich test\u00f3w s\u0105 testy dla wy\u015bwietlacza. Jednak i w tym przypadku mo\u017cemy wykorzysta\u0107 framework testowy w celu automatyzacji wi\u0119kszo\u015bci scenariusza testowego. W miejscu, w kt\u00f3rym potrzebujemy weryfikacji manualnej (np. wy\u015bwietlonego tekstu na ekranie) Robot Framework wstrzyma wykonanie testu i b\u0119dzie oczekiwa\u0107 na dane wej\u015bciowe od testera.<\/p>\n\n\n\n<p>W <a href=\"https:\/\/sii.pl\/blog\/automatyzacja-testow-systemow-wbudowanych-z-wykorzystaniem-robot-frameworka-czesc-2\/?category=development-na-twardo&amp;tag=centrum-kompetencyjne-embedded,embedded,embedded-competency-center,python,raspberrypi,robotframework,testing,testowanie\" target=\"_blank\" aria-label=\" (opens in a new tab)\" rel=\"noreferrer noopener\" class=\"ek-link\">kolejnej cz\u0119\u015bci artyku\u0142u<\/a> zajmiemy si\u0119 praktyczn\u0105 stron\u0105 testowania. Poka\u017cemy w jaki spos\u00f3b zosta\u0142y stworzone s\u0142owa kluczowe do test\u00f3w oraz jak napisane s\u0105 testy. Uruchomimy testy i przeanalizujemy wygenerowane raporty po egzekucji test\u00f3w.<\/p>\n\n\n\n<p>Seria artyku\u0142\u00f3w powsta\u0142a dzi\u0119ki pracy dw\u00f3ch tester\u00f3w &#8211; Bart\u0142omieja Hirsza oraz Paw\u0142a Wilka &#8211; Tester\u00f3w z Centrum Kompetencyjnego Embedded w Sii.<\/p>\n<\/div>\n<\/section>\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;7687&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;5&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: 5)&quot;,&quot;size&quot;:&quot;18&quot;,&quot;title&quot;:&quot;Automatyzacja test\u00f3w System\u00f3w Wbudowanych z wykorzystaniem Robot Frameworka - cz\u0119\u015b\u0107 1&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: 5)    <\/div>\n    <\/div>\n","protected":false},"excerpt":{"rendered":"","protected":false},"author":211,"featured_media":7838,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"_editorskit_title_hidden":false,"_editorskit_reading_time":4,"_editorskit_is_block_options_detached":false,"_editorskit_block_options_position":"{}","inline_featured_image":false,"footnotes":""},"categories":[1314],"tags":[563,584,794,679,146],"class_list":["post-7687","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-development-na-twardo","tag-embedded","tag-python","tag-raspberry-pi","tag-robot-framework","tag-testing"],"acf":[],"aioseo_notices":[],"republish_history":[],"featured_media_url":"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2019\/07\/thomas-jensen-mc_4viOaxlw-unsplash.jpg","category_names":["Development na twardo"],"_links":{"self":[{"href":"https:\/\/sii.pl\/blog\/wp-json\/wp\/v2\/posts\/7687"}],"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\/211"}],"replies":[{"embeddable":true,"href":"https:\/\/sii.pl\/blog\/wp-json\/wp\/v2\/comments?post=7687"}],"version-history":[{"count":3,"href":"https:\/\/sii.pl\/blog\/wp-json\/wp\/v2\/posts\/7687\/revisions"}],"predecessor-version":[{"id":31057,"href":"https:\/\/sii.pl\/blog\/wp-json\/wp\/v2\/posts\/7687\/revisions\/31057"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/sii.pl\/blog\/wp-json\/wp\/v2\/media\/7838"}],"wp:attachment":[{"href":"https:\/\/sii.pl\/blog\/wp-json\/wp\/v2\/media?parent=7687"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/sii.pl\/blog\/wp-json\/wp\/v2\/categories?post=7687"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/sii.pl\/blog\/wp-json\/wp\/v2\/tags?post=7687"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}