Selenium
W najbliższym czasie postaram się zamieszczać tutaj wszystko to co może przydać się użytkownikom Selenium w formie szybkie kursu opisującego podstawy i uzupełnionego o moje własne doświadczenia i przemyślenia związane z użytkowaniem tego pakietu
KURS – Spis Treści:
Selenium to napisany w Java Script’cie zestaw narzędzi służący do automatycznego testowania aplikacji webowych. Jedną z jego zalet jest możliwość odpalania testów w różnym środowisku – w różnych przeglądarkach.
Testy Selenium mogą być pisane w wielu językach takich jak: Java , C#, Perl, Python, Ruby czy PHP, a także w prostym pseudokodzie Selenese lub HTML, w których podaje się kolejne kroki opisujące akcję, przedmiot operacji (locator) i dane (jeśli są potrzebne), tworząc prostą tabelkę.
Zanim zaczniemy automatyzować testy, czy to za pomocą Selenium, czy innego narzędzia, warto się zastanowić do czego taka automatyzacja jest nam potrzebna. Za pomocą narzędzi tego typu wykonuje sie testy funkcjonalne, które mają za zadanie symulowanie zachowań użytkownika oraz badanie reakcji aplikacji na te zachowania. Testy te mogą być niezwykle pomocne podczas fazy rozwoju aplikacji a także już od samego początku. Automatyczne testy tego typu możne wykorzystywać jako jeden z głównych elementów testów regresyjnych, zwłaszcza w dużych aplikacjach, gdzie testowanie wszystkich funkcjonalności ręcznie jest bardzo czasochłonne a co za tym idzie kosztowne.
Jeśli o kosztach mowa, to testy automatyczne nie są “darmowe”, każda zmiana funkcjonalności w aplikacji prawdopodobnie spowoduje konieczność zmian w testach. Niemniej jednak koszty utrzymania takich testów są o wiele mniejsze niż utrzymywanie zespołu testerów w celu wykonywania dokładnych testów regresyjnych po każdej zmianie. W większych systemach bezsensowne jest zmuszanie ludzi do testów które można zutomatyzować, takich jak np sprawdzanie poprawności walidacji wprowadzanych danych, podstawowe czynności typu rejestrowanie użytkowników etc.
Testy te doskonale sprawdzają się także we wczesnych fazach projektu. Stosowane już od samego początku, pisane wraz z tworzeniem nowych funkcjonalności świetnie strzegą założeń i wymagań, które określono podczas projektowania. Dobrym zwyczajem jest dopisywanie testów do każdego krytycznego buga znalezionego i poprawionego w aplikacji, dzięki temu gdy jakimś cudem błąd pojawi się ponownie zostanie bardzo szybko wykryty.
Co do samego kodowania to aby testy były jak najtańsze w utrzymanie – jakiekolwiek zmiany przeprowadzane były możliwie szybko, należy pisać globalne metody wykonujące standardowe czynności jak np. wypełnianie formularzy, logowanie etc. w celu późniejszego wywołania ich za pomocą jednej linijki kodu a nie jego duplikacji. Dzięki temu gdy np. zmieni się procedura logowania wystarczy raz zmienić kilka linijek w funkcji obsługującej to logowanie zamiast wprowadzać wielokrotnie te same zmiany przy każdym teście, który wymagał zalogowania.
Pakiet Selenium składa się z trzech komponentów:
Selenium IDE to zintegrowane środowisko programistyczne służące do tworzenia przypadków testowych. Instalowane jest jako dodatek do FireFoxa. Umożliwia nagrywanie i odtwarzanie scenariuszy użytkownika. Przydatnym ficzerem jest menu kontekstowe (PPM) umożliwiające szybkie tworzenie asercji.
Selenium RC (Remote Control) umożliwia odpalanie testów w zróżnicowanym środowisku.
Selenium Core umożliwia wykorzystywanie praktycznie wszystkich możliwości języka programowania, w którym pisane są testy, takich jak pętle, warunki, zewnętrzne źródła danych, etc.
Testy można pisać, ale po co utrudniać sobie życie skoro mogą napisać się same, a konkretniej nagrać. W przypadku Selenium służy do tego plugin do Fire Foxa Selenium IDE
Instalacja Selenium IDE jest bardzo prosta – pobieramy i instalujemy dodatek do Fire Foxa z tej strony aby uruchomić Selenium z menu “Narzędzia” w naszym FF wybieramy “Selenium IDE”, otworzy się niewielkie okienko z kilkoma przyciskami, które opisze poniżej. W zasadzie już jesteśmy gotowi by nagrać nasz pierwszy test. Od tej pory każda nasza akcja w okienku przeglądarki zostanie nagrana.
Skoro już mamy jakieś nagrane testy to przydało by się je gdzieś odpalić. Możemy to zrobić używając Selenium IDE, lecz nie jest to wygodne i testuje aplikację tylko lokalnie z poziomu naszej przeglądarki. Do uruchamiania testów w różnym środowisku potrzebujemy Selenium RC.
Instalacja Selenium RC, a właściwie postawienie serwera Selenium RC wymaga zainstalowania środowiska JRE np. stąd. Gdy nasz system operacyjny obsługuje już Jave możemy pobrać Selenium RC. Po czym rozpakowujemy nasz serwer najlepiej gdzieś do katalogu z testowaną aplikacją. W katalogu aplikacji tworzymy folder test/selenium, w którym będziemy zapisywać nasze testy. Aby uruchomić server w wierszu poleceń po przejściu do katalogu z serwerem wpisujemy “java -jar selenium-server.jar”. Serwer jest gotowy do pracy. Aby przejść do panelu uruchamiania testów wpisujemy w naszej przeglądarce adres naszego serwera z odpaloną testowaną aplikacją łamane przez selenium np http://localhost:3000/selenium
Poniżej przykładowy schemat testu w PHP z krótkim opisem co jest czym:
<?php
require_once 'PHPUnit/Extensions/SeleniumTestCase.php';
class Example extends PHPUnit_Extensions_SeleniumTestCase
{
/*
Poniższa funkcja powinna znaleźć się na początku każdej klasy z testami
(wystarczy samo odwołanie do niej).
Tutaj znajduje się wszystko co powinno być odpalane wraz z rozpoczęciem testów.
*/
function setUp()
{
// Wybieramy przeglądarkę
$this->setBrowser("*firefox"); .
// Poniżej adres url z którego testy będą startowały
$this->setBrowserUrl("http://www.google.com/");
}
function tearDown() {
// To co znajduje się w tej funkcji zostanie wykonane po zakończeniu testów.
}
function testMyTestCase()
{
// Tutaj umieszczamy kod naszego testu
}
}
?>
Dla porządku wszystkie nazwy testów powinny wyglądać mniej więcej tak “testNazwaTestu” – ważne żeby zaczynały się od “test” – umożliwi to ofiltrowanie funkcji z testami. Jest to pomocne gdy poza testami mamy w tym samym pliku także inne funkcje (helpery etc.).
Warto lepiej się przyjrzeć funkcji setUp() by dostrzec wszystkie możliwości, które nam daje. Na przykład można w niej umieścić metodę ładującą fixturki do bazy danych, generującą ustawienia aplikacji lub modyfikującą w odpowiedni sposób środowisko testowe, możliwości są prawie nieograniczone. Podobnie funkcja tearDown() umożliwia np. czyszczenie bazy danych po zakończeniu testów.
Co do samych testów i ich scenariuszy spotkałem się z dwoma podejściami:
- Każdy test testuje tylko jedną funkcjonalnośc, w jednym pliku/klasie znajdują się testy dotyczące ściśle powiązanych ze sobą funkcjonalności.
- Każdy test to scenariusz użytkownika – test to crawler, który naśladuje kroki które wykonują normalni użytkownicy.
Sam stosuje je naprzemiennie, gdyż minusem pierwszego jest testowanie jedynie ściśle określonych fragmentów przez co nie jest testowana ingegracja pomiędzy funkcjonalnościami. Wadą drugiego podejścia jest długi czas wykonywania testów.