{"id":10377,"date":"2021-03-25T11:42:21","date_gmt":"2021-03-25T10:42:21","guid":{"rendered":"https:\/\/sii.pl\/blog\/?p=10377"},"modified":"2023-03-13T15:57:47","modified_gmt":"2023-03-13T14:57:47","slug":"kilka-slow-o-testowaniu-api","status":"publish","type":"post","link":"https:\/\/sii.pl\/blog\/kilka-slow-o-testowaniu-api\/","title":{"rendered":"Kilka s\u0142\u00f3w o testowaniu API"},"content":{"rendered":"\n<p>Testowanie aplikacji kojarzy mi si\u0119 z poznaniem jej, sprawdzeniem, czy wszystko dzia\u0142a zgodnie z projektem, a tak\u017ce z weryfikacj\u0105 i przetestowaniem r\u00f3wnie\u017c tego, co jest niewidoczne dla u\u017cytkownika! Z testowaniem API w\u0142a\u015bnie \ud83d\ude0a<\/p>\n\n\n\n<h2 class=\"wp-block-heading\"><strong>Testowanie aplikacji<\/strong><\/h2>\n\n\n\n<p>Zanim przejdziemy do rozwini\u0119cia tego akronimu, na pocz\u0105tek zastan\u00f3wmy si\u0119 nad samym testowaniem aplikacji. Dla przyk\u0142adu \u2013&nbsp;<strong>w jaki spos\u00f3b przetestujesz stron\u0119 internetow\u0105 z polem \u201eimi\u0119\u201d<\/strong>, kt\u00f3re mo\u017ce sk\u0142ada\u0107 si\u0119 maksymalnie z 20 znak\u00f3w?<\/p>\n\n\n\n<p>Domy\u015blam si\u0119, \u017ce na pocz\u0105tku sprawdzisz, czy pole mo\u017ce by\u0107 puste. Nast\u0119pnie zweryfikujesz przyk\u0142adowe imiona, kt\u00f3rych zakres mie\u015bci si\u0119 w wymaganiach. Kolejnym krokiem mo\u017ce by\u0107 sprawdzenie warto\u015bci granicznych \u2013 wpisanie imienia o 20 i 21 znakach. Je\u015bli 21 znak\u00f3w nie spowoduje b\u0142\u0119du, to mo\u017ce rozbicie s\u0142owa na dwa du\u017co mniejsze i rozdzielone spacj\u0105, uka\u017ce prawdziwe oblicze aplikacji? Nie, wszystko wci\u0105\u017c dzia\u0142a dobrze. Nie wykryto b\u0142\u0119d\u00f3w. Zesp\u00f3\u0142 zatem poprawnie napisa\u0142 t\u0119 funkcjonalno\u015b\u0107. Zatwierdzasz j\u0105 jako przetestowan\u0105 i dzia\u0142aj\u0105c\u0105. Strona mo\u017ce i\u015b\u0107 na produkcj\u0119.<\/p>\n\n\n\n<p>Po tygodniu, gdy popijasz kaw\u0119, dostajesz informacj\u0119 zwrotn\u0105 od biznesu o tytule \u201eNA PRODUKCJI WYKRYTO KRYTYCZNY B\u0141\u0104D\u201d oraz tre\u015bci: \u201ew polu \u201eimi\u0119\u201d zosta\u0142a zapisana warto\u015b\u0107 o d\u0142ugo\u015bci 21 znak\u00f3w\u201d. Jak to mo\u017cliwe? Przecie\u017c wszystko zosta\u0142o sprawdzone i przetestowane! Developerzy napisali kod, a testerzy potwierdzili poprawne dzia\u0142anie funkcjonalno\u015bci!<\/p>\n\n\n\n<h2 class=\"wp-block-heading\"><strong>Dlaczego warto zna\u0107 API?<\/strong><\/h2>\n\n\n\n<p>Czy domy\u015blasz si\u0119, co posz\u0142o nie tak? Dobrze podejrzewasz&nbsp;\u2013 zawini\u0142 brak wiedzy i do\u015bwiadczenia. Nikt nie zasugerowa\u0142, \u017ce samo przetestowanie funkcjonalno\u015bci na front-endzie (czyli za pomoc\u0105 samej przegl\u0105darki i interfejsu graficznego), to nie wszystko. Czasami konieczne jest r\u00f3wnie\u017c przetestowanie po\u0142\u0105czenia pomi\u0119dzy front-endem a back-endem.<strong><\/strong><\/p>\n\n\n\n<p>Jak jednak tego dokona\u0107 z poziomu zwyk\u0142ego u\u017cytkownika? W tym celu mo\u017cemy (i powinni\u015bmy)&nbsp;<strong>wykorzysta\u0107 znajomo\u015b\u0107 API<\/strong>. Je\u015bli jest ju\u017c wykonana walidacja na front-endzie, to wcale nie oznacza, \u017ce back-end nie wymaga naszej uwagi.<\/p>\n\n\n\n<p>API to angielski akronim od s\u0142\u00f3w&nbsp;<strong>Application Programming Interface<\/strong>. Jest to&nbsp;<strong>zbi\u00f3r metod s\u0142u\u017c\u0105cych do komunikacji pomi\u0119dzy dwoma systemami<\/strong>. Dzi\u0119ki u\u017cyciu tego interfejsu, dost\u0119p do zasob\u00f3w jest \u0142atwiejszy i bezpieczniejszy (pod warunkiem, \u017ce s\u0105 dobrze zaprojektowane), a dodatkowo u\u0142atwiona jest wymiana danych pomi\u0119dzy r\u00f3\u017cnymi platformami. API pozwala u\u017cy\u0107 danych bez wgl\u0105du w szczeg\u00f3\u0142y implementacji.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\"><strong>Architektura klient-serwer<\/strong><\/h2>\n\n\n\n<p>Ze wzgl\u0119du na to, \u017ce pracuj\u0119 g\u0142\u00f3wnie z aplikacjami webowymi, zaczn\u0119 od opisania&nbsp;<strong>architektury klient-serwer (client-server)<\/strong>. W tym podej\u015bciu klientem mo\u017ce by\u0107 przegl\u0105darka, telefon lub inna aplikacja. Operacje i zadania wykonane po stronie klienta musz\u0105 by\u0107 odwzorowane po stronie serwera.<\/p>\n\n\n\n<p>Aby dosz\u0142o do wymiany danych pomi\u0119dzy klientem a serwerem, powinny zosta\u0107 wys\u0142ane wiadomo\u015bci. Wg&nbsp;<strong>standardu W3C<\/strong>&nbsp;do komunikacji sieciowej mo\u017ce by\u0107 u\u017cyty&nbsp;<strong>protok\u00f3\u0142 HTTP<\/strong>&nbsp;(Hypertext Transfer Protocol), a konkretnie&nbsp;<strong>wiadomo\u015bci HTTP<\/strong>&nbsp;(HTTP messages). Takimi wiadomo\u015bciami b\u0119d\u0105 \u017c\u0105dania (requests) i odpowiedzi (responses).<\/p>\n\n\n\n<h2 class=\"wp-block-heading\"><strong>Jak wygl\u0105da to w praktyce?<\/strong><\/h2>\n\n\n\n<p>Wyobra\u017a sobie formularz do rejestracji uczestnika na zawody motocyklowe. Po wype\u0142nieniu formularza na stronie internetowej (po stronie klienta) klikasz \u201ewy\u015blij\u201d. Klikni\u0119cie przycisku powoduje wys\u0142anie \u017c\u0105dania do serwera. Serwer przetwarza \u017c\u0105danie i odsy\u0142a odpowiedni\u0105 odpowied\u017a, kt\u00f3r\u0105 nast\u0119pnie widzi klient. Tyle w teorii. Przejd\u017amy do strony technicznej.<\/p>\n\n\n\n<p>API webowe jest podzielone na 3 typy:<\/p>\n\n\n\n<ul class=\"wp-block-list\"><li>prywatne,<\/li><li>partnerskie,<\/li><li>zewn\u0119trzne.<\/li><\/ul>\n\n\n\n<p>Prywatne API jest zbudowane i wykorzystywane np. w przypadku aplikacji u\u017cywanych przez pracownik\u00f3w jednej firmy (z ograniczonym dost\u0119pem z zewn\u0105trz). Partnerskie API jest dost\u0119pne dla ka\u017cdego, kto spe\u0142ni odpowiednie warunki. G\u0142\u00f3wnie u\u017cywane jest do integracji pomi\u0119dzy firmami. Zewn\u0119trzne API jest z kolei dost\u0119pne dla ka\u017cdego.<\/p>\n\n\n\n<p>Najpopularniejszymi typami API s\u0105:<\/p>\n\n\n\n<ul class=\"wp-block-list\"><li>REST,<\/li><li>SOAP,<\/li><li>RPC,<\/li><li>oraz, od pewnego czasu, GraphQL.<\/li><\/ul>\n\n\n\n<p><strong>Najcz\u0119\u015bciej u\u017cywanym typem jest REST. I to jemu po\u015bwi\u0119c\u0119 kolejny akapit<\/strong>.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\"><strong>REST API<\/strong><\/h2>\n\n\n\n<p>REST API (ang.&nbsp;<strong>Representational State Transfer<\/strong>) jest architektur\u0105 oraz zbiorem zasad. API REST-owe umo\u017cliwia wykorzystanie dowolnego formatu danych \u2013 np. JSON, XML. Korzystaj\u0105c z REST-owego API, wykorzystujesz tzw.&nbsp;<strong>CRUD<\/strong>, czyli nast\u0119puj\u0105ce operacje:<\/p>\n\n\n\n<ul class=\"wp-block-list\"><li>Utw\u00f3rz (Create),<\/li><li>Odczytaj (Read),<\/li><li>Zmodyfikuj (Update),<\/li><li>Usu\u0144 (Delete).<\/li><\/ul>\n\n\n\n<p>W przypadku&nbsp;<strong>REST API wykorzystasz nast\u0119puj\u0105ce metody<\/strong>:<\/p>\n\n\n\n<ul class=\"wp-block-list\"><li>Create \u2013 b\u0119dzie to g\u0142\u00f3wnie metoda POST<\/li><li>Read \u2013 metoda GET<\/li><li>Update \u2013 metoda PUT\/PATCH<\/li><li>Delete \u2013 metoda DELETE.<\/li><\/ul>\n\n\n\n<p>Oczywi\u015bcie to tylko czubek g\u00f3ry lodowej. Samo REST API mo\u017cna wykorzysta\u0107 do szeregu innych operacji jak np. restart serwera.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\"><strong>Dlaczego warto wykorzysta\u0107 API w testowaniu?<\/strong><\/h2>\n\n\n\n<p>Po pierwsze testy API to nie tylko testy funkcjonalne. API jest na tyle<strong>&nbsp;elastycznym rozwi\u0105zaniem<\/strong>, \u017ce mo\u017cesz wykorzysta\u0107 je jako podstaw\u0119 do test\u00f3w wydajno\u015bci, bezpiecze\u0144stwa czy niezawodno\u015bci. Pocz\u0105tkowy przyk\u0142ad i problem z polem \u201eimi\u0119\u201d testy z wykorzystaniem API wykry\u0142yby niemal natychmiast. Prawdopodobnie uda\u0142oby Ci si\u0119 zapisa\u0107 do bazy danych imi\u0119 sk\u0142adaj\u0105ce si\u0119 z 23 znak\u00f3w i takim&nbsp;<strong>testem sprawdzi\u0107 poprawno\u015b\u0107 pola<\/strong>, u\u017cywaj\u0105c np. Swaggera lub konsoli deweloperskiej (popularne F12).<\/p>\n\n\n\n<p>Zastan\u00f3w si\u0119 \u2013&nbsp;<strong>jakie inne pola powinny tak\u017ce uwzgl\u0119dnia\u0107 walidacj\u0119 zar\u00f3wno na front-endzie jak i back-endzie<\/strong>? Np. pola, kt\u00f3rych niedostateczne przetestowanie mog\u0142oby wywo\u0142a\u0107 o wiele powa\u017cniejsze konsekwencje!<\/p>\n\n\n\n<p>Poza tym, uwzgl\u0119dniaj\u0105c w testach API, mo\u017cesz zweryfikowa\u0107 konkretne \u017c\u0105dania (bez potrzeby wywo\u0142ania ich na front-endzie). Ba! Mo\u017cesz wr\u0119cz pomin\u0105\u0107 front-end! Opr\u00f3cz tego masz mo\u017cliwo\u015b\u0107 wykorzystania swoich umiej\u0119tno\u015bci przy nowoczesnych&nbsp;<strong>projektach pokroju technologii Internetu Rzeczy (IoT, kt\u00f3ra opiera si\u0119 o API)<\/strong>, dodatkowo maj\u0105c \u015bwiadomo\u015b\u0107, \u017ce pod\u0105\u017casz za najnowszymi trendami. Przecie\u017c Shift Left opiera si\u0119 o koncepcj\u0119 \u201etestowania bli\u017cej kodu\u201d.<\/p>\n\n\n\n<p>Podsumowuj\u0105c, ten \u201eAPI\u201d nie jest taki najgorszy.&nbsp;<\/p>\n\n\n\n<p>***<\/p>\n\n\n\n<p>Je\u015bli interesuje Ci\u0119 temat API, zajrzyj do innych artyku\u0142\u00f3w naszych ekspert\u00f3w m.in.: <a aria-label=\"Dane przemys\u0142owe w Internecie \u2013 implementacja REST API z wykorzystaniem sieci polowej MODBUS (opens in a new tab)\" href=\"https:\/\/sii.pl\/blog\/dane-przemyslowe-w-internecie-implementacja-rest-api-z-wykorzystaniem-sieci-polowej-modbus\/?category=development-na-twardo&amp;tag=c,plc,rest-api\" target=\"_blank\" rel=\"noreferrer noopener\" class=\"ek-link\">Dane przemys\u0142owe w Internecie \u2013 implementacja REST API z wykorzystaniem sieci polowej MODBUS<\/a> oraz Charles \u2013 pomocne narz\u0119dzie w testowaniu REST API.<\/p>\n\n\n\n<p>***<br>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:\u00a0<a aria-label=\" (opens in a new tab)\" href=\"https:\/\/moderntester.sii.pl\/\" target=\"_blank\" rel=\"noreferrer noopener\" class=\"ek-link\" 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;10377&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;20&quot;,&quot;legendonly&quot;:&quot;&quot;,&quot;readonly&quot;:&quot;&quot;,&quot;score&quot;:&quot;4.1&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;4.1\\\/5&quot;,&quot;size&quot;:&quot;30&quot;,&quot;title&quot;:&quot;Kilka s\u0142\u00f3w o testowaniu API&quot;,&quot;width&quot;:&quot;130.2&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: 130.2px;\">\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            4.1\/5    <\/div>\n    <\/div>\n","protected":false},"excerpt":{"rendered":"<p>Testowanie aplikacji kojarzy mi si\u0119 z poznaniem jej, sprawdzeniem, czy wszystko dzia\u0142a zgodnie z projektem, a tak\u017ce z weryfikacj\u0105 i &hellip; <a class=\"continued-btn\" href=\"https:\/\/sii.pl\/blog\/kilka-slow-o-testowaniu-api\/\">Continued<\/a><\/p>\n","protected":false},"author":274,"featured_media":10384,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"_editorskit_title_hidden":false,"_editorskit_reading_time":3,"_editorskit_is_block_options_detached":false,"_editorskit_block_options_position":"{}","inline_featured_image":false,"footnotes":""},"categories":[1317],"tags":[1026,956,146],"class_list":["post-10377","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-testowanie","tag-api","tag-rest-api","tag-testing"],"acf":[],"aioseo_notices":[],"republish_history":[],"featured_media_url":"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2021\/03\/TESTING-APICER2.png","category_names":["Testowanie"],"_links":{"self":[{"href":"https:\/\/sii.pl\/blog\/wp-json\/wp\/v2\/posts\/10377"}],"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\/274"}],"replies":[{"embeddable":true,"href":"https:\/\/sii.pl\/blog\/wp-json\/wp\/v2\/comments?post=10377"}],"version-history":[{"count":2,"href":"https:\/\/sii.pl\/blog\/wp-json\/wp\/v2\/posts\/10377\/revisions"}],"predecessor-version":[{"id":20290,"href":"https:\/\/sii.pl\/blog\/wp-json\/wp\/v2\/posts\/10377\/revisions\/20290"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/sii.pl\/blog\/wp-json\/wp\/v2\/media\/10384"}],"wp:attachment":[{"href":"https:\/\/sii.pl\/blog\/wp-json\/wp\/v2\/media?parent=10377"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/sii.pl\/blog\/wp-json\/wp\/v2\/categories?post=10377"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/sii.pl\/blog\/wp-json\/wp\/v2\/tags?post=10377"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}