maj
30
2012
Niedawno w ramach poprawy jakości naszego systemu dostałem zadanie rozpoznania i wdrożenia jakiegoś sposobu na automatyzację testów wykonywanych dotychczas manualnie. Do tej pory przed każdą większą podmianę produkcyjną był wykonywany przez testera zestaw testów regresyjnych. Miało to liczne wady, przede wszystkim:
- Baardzo długi czas wykonywania (przejście wszystkich ścieżek w systemie mogło trwać nawet tydzień)
- Monotonność i powtarzalność (to mnie akurat nie bolało, ale w sumie po co tracić czas na ponowne wykonywanie tych samych czynności przy każdej podmianie ?)
- Średnia skuteczność wykrywania nieprawidłowości - wynika to z faktu, że tester nie do końca dobrze zna biznes systemu, a samo przejście ścieżki nie zawsze oznacza że test się powiódł
Szukałem rozwiązania które:
- Pozwoli na zdefiniowanie testów (sekwencji czynności do wykonania na stronie) i ich uruchomienie w dowolnej chwili
- Umożliwi sprawdzenie, czy generowane strony odpowiadają scenariuszowi testowemu
- Będzie łatwe w obsłudze (żeby czas poświęcony na stworzenie testu nie był dłuższy niż czas implementacji danej funkcjonalności :))
- Będzie możliwe w obsłudze przez testera, który nie posiada żadnych umiejętności programistycznych
Dokonałem małego rozeznanie w firmie i dowiedziałem się, że testerzy mają i używają narzędzia
TestComplete (
http://smartbear.com/products/qa-tools/automated-testing-tools). Jest to narzędzie płatne, ale na szczęście jest możliwość ściągnięcia 10 dniowej wersji próbnej - w sam raz na moje potrzeby :) Przystąpiłem więc do instalacji i po dłuższym czasie (instalacja chwilę trwała) mogłem rozpocząć zapoznawanie się z aplikacją. TestComplete to można powiedzieć taki kombajn wszystkomający dla testerów. Umożliwia testowanie wszelkiego rodzaju aplikacji (nie tylko webowych), testowanie w środowisku rozproszonym, testy wydajnościowe, testy różnych konfiguracji sprzętowych itp. itd. Ma on olbrzymie możliwości, ale większość dla nas nieprzydatnych. Nas interesują tylko testy funkcjonalne web, co jest drobnym procentem tego co aplikacja umie. Samo tworzenie testu jest proste - wystarczy uruchomić nagrywanie czynności które wykonujemy. Od tej chwili aplikacja rejestruje wszystko to w co kliknęliśmy i to co wpisaliśmy. Jest to bardzo przyjemne bo nie wymaga pisania żadnych skryptów ani innego kodu. Po zakończeniu testu zatrzymujemy nagrywanie a aplikacja potrafi odtworzyć nasze poczynania. Samo sprawdzenie, czy strona odpowiada naszym oczekiwaniom jest również bardzo proste - aplikacja odkłada zrzuty ekranu jakie pojawiły się podczas nagrywania i porównuje je z tymi uzyskanymi przy teście. Można powiedzieć, że stworzenie testu jest tak intuicyjne, że każda osoba po 5 min obcowania z aplikacją jest w stanie tego dokonać. Mimo tego, że TestComplete jest taki fajny to zrezygnowałem z jego zastosowania u nas - przesądziło o tym kilka czynników:
- Jest płatny (trzeba by się prosić o licencje/wirtualke - za dużo zachodu)
- Nagrywanie czynności nie bardzo radziło sobie z naszym systemem (mamy menu w javascripcie które przy odtwarzaniu testu z nie wiadomych powodów nie wyświetlało się co kończyło każdy test :))
- Bardziej zaawansowane porównywanie strony wymaga pisania skryptów (średnio przyjemne, chyba że tester jest zaznajomiony z tym narzędziem - nasz nie był)
- No i przede wszystkim - to jest narzędzie dla klikaczy a nie programistów, nie da się tak stworzonych testów podpiąć pod MS Builda, NUnit-a ani wkomponować w nie jakiegoś fajnego kawałka kodu.
Podsumowując, jest to fajne narzędzie dla testerów ale mniej przyjemne dla programistów więc odpada :)
Kolejnym projektem na który zwróciłem uwagę był
Selenium (
http://seleniumhq.org/). Jest to open-sourcowy projekt do automatycznego testowania aplikacji webowych. W przeciwieństwie do TestComplete nie jest to konkretna aplikacja tylko raczej zbiór bibliotek i portów do różnych języków programowania w których można pisać testy. Obsługuje wszystkie najważniejsze przeglądarki (do każdej jest osobna biblioteka) oraz zapewnia wsparcie dla wszystkich podstawowych języków programowania w tym oczywiście .NET. Sam test to po prostu Unit Test polegający na uruchomieniu przeglądarki i przekazywaniu do niej poszczególnych poleceń i sprawdzanie wyników. Polecenia to po prostu wypełnianie poszczególnych pól formularza/klikanie przycisków/odnośników. Tak więc piszemy test w ten sposób: "Przejdź pod jakiś tam adres, w pole tekstowe o id. user wpisz nazwę użytkownika, w pole testkowe hasło wpisz hasło, kliknij przycisk o nazwie loguj itd.). Sprawdzanie rezultatu to porównanie zawartości odpowiednich elementów struktury DOM (np. sprawdź czy w labelu pojawił się podany tekst). Przykład testu:
[TestMethod]
public void PU1_GBP_Test()
{
InternetExplorerDriver driver = new InternetExplorerDriver();
driver.Navigate().GoToUrl("http://perszewski.pl");
IWebElement q = driver.FindElement(By.Name("EC_Login1:Tb_login"));
q.SendKeys("ocr");
q = driver.FindElement(By.Name("EC_Login1:Bt_login"));
q.Click();
}
Test polega na przejściu pod adres http://perszewski.pl, wpisanie w pola formularza o nazwie "EC_Login1:Tb_login" tekstu "ocr" a następnie kliknięciu w element o nazwie "EC_Login1:Bt_login". Jak widać, użyłem tutaj drivera pod IE bo niestety wymogiem naszych testów jest obsługa tylko i wyłącznie IE (nasz system obsługuje tylko tą przeglądarkę :) Samo Selenium ogólnie działa, można pisać UnitTesty w swoim ulubionym frameworku testowym i będą chodzić. Niestety, ma też kilka wad:
- Driver pod IE jest niezbyt dopracowany, wymaga zmiany poziomu uprawnień w przeglądarce i jeszcze kilka zabiegów żeby w ogóle "zaskoczył"
- Provider .NET-owy jest po prostu żywcem przeniesiony z innego języka (prawdopodobnie C++ albo Java) nie obsługuje różnych smaczków .NET-owych
- Nasz system namiętnie korzysta z okien Pop-UP w których jest osadzona ramka ze stroną. Selenium kompletnie sobie z czymś takim nie radzi, nie udało mi się znaleźć sposobu żeby "dobrać się" do takiego pop-upa
Wad tych nie ma kolejne i ostatnie już rozwiązanie, które zostało ostatecznie moim wybrańcem a więc
WatiN (
http://watin.org/). Projekt podobnie jak Selenium jest open-sourcowy i jest przeniesieniem projektu WatiR stworzonego na potrzeby Ruby on Rails na technologię .NET. Jest on trochę uboższy niż Selenium (z przeglądarek obsługuje tylko IE i Firefoxa) ale na nasze potrzeby nadaje się znakomicie. Przede wszystkim radzi sobie z nieszczęsnymi pop-upami i to zarówno z ramką jak i zwykłe confirmy a także okienka z drukowaniem itp. Poza tym, został wyposażony w kilka fajnych klas dzięki którym możemy stronę WWW przedstawić w postaci obiektowej i uzyskiwać dostęp do jej poszczególnych elementów w ładny sposób. Przykład użycia Watin:
[Test]
public void SearchForWatiNOnGoogle()
{
using (var browser = new IE("http://www.google.com"))
{
browser.TextField(Find.ByName("q")).TypeText("WatiN");
browser.Button(Find.ByName("btnG")).Click();
Assert.IsTrue(browser.ContainsText("WatiN"));
}
}
Test polega na przejściu pod adres google, wpisaniu w pole testowe o nazwie "q" słowa Watin i kliknięciu w przycisk o nazwie "btnG". Następnie dokonywane jest sprawdzenie czy zwrócona zawartość strony zawiera słowo WatiN, W przypadku naszego systemu testy są oczywiście o wiele bardziej skomplikowane. O problemach jakie napotkałem podczas ich pisania oraz ich rozwiązaniach będę pisał w kolejnych postach.