Testy automatyczne aplikacji WWW. Część 1

Testy automatyczne aplikacji WWW. Część 1

Testowanie oprogramowania jest procesem, w którym wykonywane są zdefiniowane akcje w celu odnalezienia różnic pomiedzy zadaną wartością wejściową, a oczekiwaną wartością wyjściową.

W trakcie cyklu rozwoju aplikacji internetowej, wiele rzeczy wymaga przetestowania. Testowanie oprogramowania jest procesem, w którym wykonywane są zdefiniowane akcje w celu odnalezienia różnic pomiędzy zadaną wartością wejściową, a oczekiwaną wartością wyjściową. Zadanie to może być również zdefiniowane jako proces, podczas którego poszukiwane są błędy w oprogramowaniu, czyli zachowanie niezgodne z oczekiwaniami oraz niespełnianie wyspecyfikowanych wymagań. Innymi słowy, testowanie oprogramowania jest procesem weryfikacji i walidacji.

Aplikacje zmieniają się i zwiększają swoją złożoność przez cały okres użytkowania. Zatem liczba wymaganych testów również powinna się zwiększać adekwatnie do wielkości rosnącego obszaru funkcjonalności. W celu usprawnienia i przyspieszenia procesu testowania wykorzystuje się automatyzację. Automatyzacja testów daje nam trzy kluczowe korzyści: kumulatywny zasięg wykrywania błędów i redukowania kosztów w przypadku awarii i uszkodzeń oprogramowania, powtarzalność wykonywania zaoszczędzająca czas, oraz zwiększanie wydajności pracy i wykorzystania zasobów.

Załóżmy, że chcielibyśmy napisać test logowania do aplikacji Trello. Jego celem będzie wpisanie hasła i loginu, kliknięcie przycisku zaloguj, a następnie zweryfikowanie czy nazwa zalogowanego użytkownika jest poprawna. Jest to jedynie krótki przykład, w ramach którego zostaną omówione podstawowe możliwości wykorzystanego narzędzia – Selenium WebDriver. Z każdym kolejnym postem w tej serii będą wyjaśnianie kolejne techniki, które można stosować do automatyzacji. Aby rozpocząć prace, będziemy potrzebowali informacji o tym jak wygląda kod źródłowy strony logowania, a dokładniej trzech elementów: pola do wpisania loginu, hasła oraz przycisk logowania. Po zalogowaniu będziemy musieli odnaleźć pole z nazwą użytkownika. Poniżej kod ze stroną logowania.

Następnie przechodzimy do kodu testu. Selenium posiada implemenację w kilku językach programowania. Podany przykład został napisany w języku JAVA.
Na początek interesuje nas konfiguracja naszego drivera. Test będziemy wykonywać w Firefoxie.
Następnie chcemy zmaksymalizować okno przeglądarki – chociażby po to by mieć pewność, że elementy będą ułożone w ten sam sposób, w który najprawdopodobniej będzie widział je użytkownik. Warto zadbać o to szczególnie w przypadku responsywnych stron.

Każda strona WWW wymaga pewnego czasu aby się załadować, stąd też należy zdefiniować jak długo Selenium ma oczekiwać na wybrany element dokumentu HTML, na którym będzie przeprowadzać jakąś akcje. W tym przypadku zostało użyte najprostsze rozwiązanie. Bezwarunkowy czas oczekiwania na element został ustawiony na 10 sekund. Po tym czasie, jeśli element się nie pojawił zostanie rzucony wyjątek przerywający test. Nie jest to najlepsze rozwiązanie, ale o tym w kolejnych postach.

Jesteśmy gotowi – zatem przechodzimy pod zadany URL za pomocą metody get(java.lang.String url)

Do odnajdywania elementów Selenium dostarcza dwóch podstawowych metod: findElement oraz findElements, które jako argument przyjmują lokalizator wybranego elementu, którym może być:

  • identyfikator
  • atrybut name
  • klasa
  • wyrażenie XPath
  • selektor CSS
  • nazwa tagu
  • tekst linku lub jego fragment

Dodatkowe informacje znajdziecie tutaj.
Pole do wpisania loginu będzie odnajdywane za pomocą identyfikatora, pole hasła przy użyciu atrybutu name, a przycisk logowania z wykorzystaniem wyrażenia XPath.

Następnie należy wykonać akcję wpisania loginu, hasła i kliknięcia w button logowania.

Po przejściu tych kroków powinniśmy zostać zalogowani. Aby to zweryfikować możemy sprawdzić czy wyświetlana nazwa użytkownika jest taka jakiej się spodziewamy. Analizując kod strony okaże się, że nazwa użytkownika znajduję w następującym znaczniku span:

Aby to sprawdzić przy pomocy Selenium WebDriver musimy, podobnie jak wcześniej, pobrać pole, a następnie sprawdzić czy tekst, który posiada jest taki sam jak oczekiwana nazwa użytkownika.

Ponownie do wyszukania elementu zostało użyte wyrażenie XPath (szczegółowe wykorzystanie tej metody w innym poście). Następnie z zainicjowanego obiektu pobierany jest tekst i weryfikowany czy jest taki sam jak “Leopard User”.

Dlaczego w ogóle automatyzować testy?

Wartość testów automatycznych zauważalna jest chociażby w trakcie testów regresyjnych. W przypadku, gdy wymagane jest powtórzenie wszystkich przypadków testów w celu zweryfikowania czy dotychczasowe błędy zostały usunięte oraz czy naprawy nie wpłynęły na działanie pozostałych funkcjonalności aplikacji ogromną rolę odgrywa czas. A jak każdy wie, czas to pieniądz (o tym również w jednym z kolejnych postów). W przypadku naszego pierwszego, trywialnego testu wymagany czas na jego przeprowadzenie to około 5-10 sekund (bierzemy pod uwagę czas potrzebny na uruchomienie przeglądarki, wpisanie adresu i wykonanie wszystkich kroków) to, gdy zależy nam nam stałej precyzji i jednoznacznej odpowiedzi, wykorzystanie automatu do tego celu jest bardzo dobrym wyborem. Pomimo tego, że każde oprogramowanie jest testowane w trakcie jego rozwoju, zawsze posiada jakieś defekty. Testerzy starają się je wychwytywać, zanim produkt zostanie wydany. Jednak część błędów pojawia się na nowo, nawet jeśli stosowane są jak najlepsze praktyki testowania manualnego. Automatyzacja testów jest sposobem na zwiększenie skuteczności, wydajności i wielkości obszaru testowanego oprogramowania. Raz utworzone testy automatyczne mogą łatwo powtarzać oraz rozszerzać zadania wykonywane przez testerów manualnych. Inne zalety testowania automatycznego będą wynikały z konkretnych przykładów – a te juz wkrótce.

Uwagi

W przypadku, gdy chcemy używać innej przeglądarki niż Firefox potrzebujemy dodatkowego sterownika. Na przykład dla przeglądarki Chrome można go pobrać stąd, a w kodzie przed konfiguracją WebDrivera wskazać jego lokalizację.

Jeśli elementy wypełnianego formularza znajdują się w tagu <form> nie potrzeba wyszukiwać przycisku potwierdzającego wysłanie a wykorzystać metodę submit() na jednym z jego elementów.

author-image

Przemysław Górski

Automatyk testów aplikacji frontendowych. Obecnie odpowiedzialny za testy automatyczne aplikacji mobilnej jednego z największych banków w Polsce. Sympatyk technologii javowych. W wolnych chwilach szarpie struny gitary i bawi się muzyką.