Dziś porozmawiamy co nieco o automatyzacji testów serwisów www. Poznasz narzędzia przydatne w nauce automatyzacji i dowiesz się jakie mają wady i zalety.

Przychodzi taki dzień w życiu testera, że ciągłe przeklikiwanie testowanego serwisu zaczyna nas nudzić, bądź nawet irytować. Myślimy sobie wtedy jakby fajnie byłoby, gdyby jakaś bliżej nieokreślona siła zrobiła chociaż część testów za nas. Pozostaje pytanie: jak przywołać taką siłę do swojego życia?

W celu uzyskania odpowiedzi spotykamy się z kumplem z innej firmy (nazwijmy go Bolkiem) na pomarańczowej oranżadzie. Wiadomo: pijemy za błędy deweloperów i za pieniądze z wypłaty. W pewnym momencie Bolek zwierza nam się, że ostatnio podpatrzył jak jeden z deweloperów w pełnej konspiracji pisze kod nieco inny niż ten, który pisał do tej pory. Mianowicie po wpisaniu magicznej sekwencji znaków nagle na jego ekranie dzieją się rzeczy niestworzone: przeglądarka internetowa włącza się i sama przechodzi przez poszczególne strony. Tu kliknie, tam wypełni jakiś formularz. Bolek postanowił dowiedzieć się czegoś więcej i gdy następnym razem deweloper odprawiał swoje czary, ten wyskoczył zza jego pleców krzyczący:

- Mam cię, ptaszku! Gadaj co to jest!

- No dobrze, ale obiecaj, że nikomu nie powiesz - ze strachem odpowiedział deweloper.

- Nie powiem - obiecał kiwając głową Bolek, choć kłamstwo miał on w zwyczaju.

- To testy automatyczne.

Wtem do sali wdarł się ogromny podmuch, który poprzewracał wszystkie monitory. Słowa dewelopera skłębiły myśli w głowie już i tak zdezorientowanego Bolka.

Dziś pomożemy Bolkowi (a także, mam nadzieję, i Wam, drodzy Czytelnicy) rozpocząć przygodę z automatyzacją testów dla stron www - tematem, który na początku przysparza nie lada problemów i wątpliwości. Cały czas będzie towarzyszył nam wspomniany kolega Bolek. Zatem, do dzieła testerze!

Chcę automatyzować, ale nie wiem od czego zacząć!

- poskarżył się Bolek. Pośpieszmy mu więc z pomocą.

Na początku warto by było wybrać język w którym chcesz pisać testy. Ze swojego doświadczenia mogę powiedzieć, że najbardziej uniwersalnym językiem jeżeli chodzi o testy stron www będzie Javascript, chociażby dlatego że sama przeglądarka pozwala uruchomić taki kod. Choć testy można pisać w praktycznie dowolnym języku, na rynku obecnie dominują Python, Java i C# (https://madnight.github.io/githut/).

narzedzia-do-automatyzacji-testow-web-1024x558.png

Na początek musisz zadać sobie jedno bardzo ważne pytanie: do jakiego serwisu chcesz napisać testy automatyczne i czy dany język wspiera technologię, z której korzysta serwis? Warto zainstalować też środowisko, gdzie będziesz mógł pisać kod, a potem sprawdzić czy działa. Najbardziej uniwersalny w tej kwestii jest VSCode (https://vscodium.com/) - obsługuje większość popularnych języków programowania.

Czy jest jakiś sposób bym mógł łatwiej się nauczyć języka programowania?

Oczywiście, że jest. Jeżeli, tak jak Bolek, chcesz ułatwić sobie naukę, zerknij na takie strony jak https://www.codecademy.com/ , https://checkio.org/ czy https://www.freecodecamp.org/. Łączą one teorię z praktyką, co w łatwy i przyjemny sposób pozwoli Ci nie tylko zdobyć wiedzę, ale i ją utrwalić. Znajdziesz tam wiele zadań z programowania do wykonania we wbudowanych kompilatorach na tychże stronach - wyzwania te będą jednak wymagały nieco wysiłku i poświęcenia czasu na naukę.

narzedzia-do-testow-automatycznych-1024x537.png

Wszystkie wymienione przeze mnie strony umożliwiają darmową naukę.

Ukończyłem kurs podstaw programowania i chciałbym zacząć pisać jakieś testy

To bolączka, która dotyka niejednego Bolka. Kurs zaliczony, teoretycznie jesteś już gotowy do samodzielnej pracy, ale wciąż nurtuje Cię pytanie: co dalej?

Warto byś zastanowił się jakiego rodzaju mają być to testy, bo od tego będzie zależało jakiego środowiska testowego będziesz potrzebował:

  • Do testów UI (ang. User Interface) będziesz potrzebował jakiejś przykładowej strony internetowej;
  • Do testów API przyda się tzw. Server API, gdzie będziesz mógł wysyłać żądania;
  • Do testów jednostkowych będzie Ci potrzebny wcześniej napisany kod.

Choć kolejność pisania testów w procesie wytwarzania oprogramowania zaczyna się od testów jednostkowych, ja raczej polecałbym zacząć od testów interfejsu użytkownika i potem dołożyć sobie testy API. Jeżeli chodzi o testy jednostkowe to są one pisane przed testerów bardzo rzadko, dlatego pozwolę je sobie pominąć w tym artykule.

Jest jeszcze jedna bardzo ważna rzecz. Otóż rekomenduję, byś na początku swojej przygody z testowaniem skorzystał z gotowego frameworku do testów. Wspominam o tym dlatego, gdyż na samym początku jest praktycznie niemożliwe napisanie frameworku testowego w sposób prawidłowy. Dzięki skorzystaniu z frameworku przekonasz się, jakie istotne elementy powinien zawierać dobrze napisany framework testowy.

W takim razie jakie narzędzia polecisz do testów interfejsu użytkownika?

Na początek polecam stronę https://the-internet.herokuapp.com/ albo http://automationpractice.com/. Pierwsza z nich to typowa strona do rozwiązywania zadań. Pomoże Ci nauczyć się jak poprawnie obsługiwać operacje na różnych elementach strony internetowej. Druga to z kolei typowy sklep internetowy - coś z czym zapewne nie raz spotkasz się w swojej karierze testerskiej. Przypadki testowe, które napiszesz do tej strony, będą zbliżone do tych prawdziwych.

narzedzia-do-nauki-automatyzacji-1024x511.png

Zalety:

  • Strony są ogólnodostępne, nie potrzebujesz dodatkowego środowiska;
  • Możesz odpalić testy z każdego komputera, adres strony się nie zmienia.

Wady:

  • Nie masz kontroli nad zawartością, przez co testy nie będą działać poprawnie, jeżeli na stronie zajdzie zmiana;
  • Nie możesz dodawać atrybutów do poszczególnych elementów na stronie, przez co opis elementów w testach może być skomplikowany;
  • Strona może po prostu nie działać (I co zrobisz?).

Jednakże, jeżeli nie brak Ci odwagi i determinacji, proponuję byś spróbował innego rozwiązania. Jest to sklep https://github.com/sivadass/react-shopping-cart. Jedyne czego potrzebujesz to zainstalowanych nodejs (https://nodejs.org/en/) oraz git (https://git-scm.com/).

Zalety:

  • Sklep stawiasz sobie lokalnie, więc tylko Ty możesz go wyłączyć;
  • Kod sklepu nie zmieni się dopóki sam nie wprowadzisz zmian;
  • Możesz nadawać elementom własne atrybuty, przez co utrzymanie  testów będzie prostsze i bezpieczniejsze.

Wady:

  • Konieczność pobrania kodu źródłowego sklepu przy pomocy gita na swój dysk;
  • Konieczność uruchamiania sklepu przed rozpoczęciem testów.

narzedzia-do-nauki-automatyzacji-sklep-1024x511.png

A to jeszcze nie wszystko. Należy pamiętać, że jest nam jeszcze potrzebny framework testowy, by móc te testy gdzieś pisać. Jeżeli chodzi o Javascript to jest ich dosyć sporo. Najpopularniejszy w tej chwili to https://www.cypress.io/. Po instalacji otrzymujemy masę przykładów napisanych w folderze “integrations”. Jeżeli chcesz dowiedzieć się więcej jak pisać testy w cypress.io, zerknij do artykułu na naszym blogu.

A co z testami API?

Po ciężkiej batalii Bolkowi udało się napisać działające testy UI. Teraz zastanawia się: co w takim razie z testami API?

Można je pisać, a nawet zalecam. A mówiąc poważnie, z racji tego, że standardów pisania zapytań do API jest kilka, w tym poradniku ograniczę się do REST (choć są jeszcze SOAP i GRAPHQL).Przechodząc płynnie do środowiska testowanego, tutaj możesz skorzystać z dostępnych i darmowych serwerów API. Najpopularniejszy jaki można znaleźć to https://petstore.swagger.io/. Dostęp do poszczególnych endpointów jest dość dobrze opisany, więc już od samego początku możesz spróbować napisać jakieś proste zapytania.

nauka-automatyzacji-testow-web-1024x509.png

Zalety:

  • dostępny online,
  • szczegółowa dokumentacja,
  • zawiera wcześniej przygotowane dane.

Wady:

  • jesteśmy zależni od dostępności,
  • nie możemy tworzyć własnych endpointów,
  • żądanie DELETE jest tylko pozorne ;-)

Tak jak na poprzednim poziomie testów, tu również możemy skorzystać z czegoś bardziej niezależnego od powyższego przykładu. Przedstawiam Json-Server: https://github.com/typicode/json-server. Jest to serwer, który będzie działał  totalnie niezależnie, bo lokalnie na Twoim komputerze. To Ty decydujesz jak będzie wyglądać Twoja baza danych oraz do jakich endpointów będziemy wysyłać zapytania i to wszystko bazie danych w formacie JSON. Czyż to nie brzmi wspaniale? Tak jak w przypadku sklepu internetowego, również potrzebujesz zainstalowanego nodejs.

Zalety:

  • Totalnie niezależny serwer API;
  • Realne operacje na danych zapisanych w pliku JSON(chociażby DELETE);
  •  Możliwość stworzenia własnej bazy danych.

Wady:

  • Konieczność stworzenie własnej bazy danych;
  • Brak walidacji.

I teraz to co tygryski lubią najbardziej, czyli wybór narzędzia w którym będziemy wykonywać testy. Na sam początek poleciłbym Postmana (https://www.postman.com/). Jest dość prosty w nauce, ma przejrzysty interfejs i dość łatwo pisze się w nim testy. 

Jeżeli chcesz sobie uruchomić testy, musisz skorzystać z runnera i wybrać interesujące Cię przypadki testowe. Dodatkowo, sam Postman umożliwia uruchomienie wcześniej napisanych testów w konsoli. Jeśli chcesz dowiedzieć się nieco więcej o testowaniu za pomocą Postmana, zerknij do artykułu na naszym blogu.

Gdyby jednak okazało się, że potrzebujesz jednak coś bardziej zaawansowanego, możemy ponownie skorzystać z Cypress.io (https://www.cypress.io).

nauka-automatyzacji-testow-narzedzia-1024x556.png

Pewnie zapytasz czemu tak polecam tego Cypressa? Na pierwszy rzut oka ma on dość dobrą dokumentację i wsparcie. Do tego cały czas powstają nowe wtyczki, które znacząco ułatwiają życie użytkownikom. Jest to po prostu dojrzały framework, ciągle rozwijany i aktualizowany.

Udało mi się napisać już jakieś testy e2e i api. Nawet działają, ale mój kod czasem wydaje się mało czytelny. Czy mogę coś z tym zrobić?

Na początku warto zaznajomić się z zasadami, które panują w poszczególnych językach programowania, czyli zbiorem dobrych praktyk, dzięki którym  nie tylko Twój kod stanie się czytelniejszy, ale zyskasz również uznanie wśród testerów i programistów.

Dla języków takich jak Python należałoby byś zapoznał się z zasadami PEP: https://www.python.org/dev/peps/pep-0008/). Jeżeli chodzi o Javascript dobrze byłoby poczytać trochę zasadach opisanych tutaj: https://github.com/airbnb/javascript - w linku znajdziesz nawet porównania dobrego kodu, względem złego.

Zapytasz pewnie dlaczego nie mówiłem o tym wcześniej? Otóż popełnianie błędów jest miarą postępu. Napisałeś kod, który działa - teraz warto popracować też nad jego innymi aspektami, pamiętając o tym, że nie tylko ty będziesz go czytał.

Pomyśl trochę o tym jakbyś miał zacząć lepiej garnki z gliny. Na początku w ogóle Ci nie idzie. Potem chcesz żeby Twój garnek nie przeciekał. A jak już się tego nauczysz, to dążysz do tego by Twój garnek sprawiał, że ludzie zachwycają się jego wyglądem. A potem i tak przychodzi kot i garnek ląduje na ziemi w kawałkach ;)

Czy można zautomatyzować sprawdzanie kodu?

 - Hmm, ok, ale czy można w jakiś sposób zrobić, by jednak ten kod było jakoś automatycznie sprawdzany? - zapytał na sam koniec Bolek.

Jest to możliwe. Możesz np. skorzystać z tzw. linterów, które wspomogą Cię w analizie statycznej kodu. Mają one zdefiniowany zbiór zasad, pod kątem których na bieżąco analizują kod, który piszesz. A szczegółowo rzecz ujmując to wskazują linię i problem jaki został wychwycony, dzięki czemu możesz poprawić nas swój na znacznie lepszy.

Do najpopularniejszych linterów należą ESLint (https://eslint.org/) dla Javascript oraz Pylint (https://pypi.org/project/pylint/) dla Pythona.

naucz-sie-automatyzacji-testow-1024x557.png

Kilka słów na koniec

Podsumowując, narzędzi, które wspomogą naukę automatyzacji jest całkiem sporo. Te, które przedstawiłem w powyższym artykule to jedynie namiastka tego, co można znaleźć w sieci. Dodatkowo, na bieżąco powstają nowe, tworzone zarówno przez testerów jak i doświadczonych programistów. Musimy sobie jednak zdać sprawę, że sama znajomość tych narzędzi nie wystarczy - nauka automatyzacji i tak będzie od nas wymagała sporego wkładu własnego w postaci poświęconego czasu i energii na naukę programowania. Warto też wiedzieć, że to zaledwie początek drogi, która nigdy się nie skończy. Od testerów automatyzujących wymaga się coraz to większych kompetencji, chociażby w postaci znajomości CI/CD czy wirtualizacji środowiska testowego. Jednakże, jestem pewien, że przy odrobinie zapału i chęci, owoce tej nauki będą widocznie i dadzą wam wiele radości i satysfakcji.

Na koniec chciałbym podziękować wszystkim Bolkom za celne pytania i cierpliwość ;) Bez Was ten cały artykuł by nie powstał. Trzymam kciuki za Waszą owocną naukę i życzę wiele frajdy z tego procesu. Powodzenia!