Selenium WebDriver – Testowanie automatyczne aplikacji webowych

Posted by in C#, Selenium, Testowanie automatyczne

Post ten rozpocznie cykl wpisów na temat Selenium WebDriver. Tematykę tę chcę skierować zarówno do osób rozpoczynających przygodę z testowaniem automatycznym, jak i do osób, które szukają bardziej zaawansowanych rozwiązań.

Czym jest testowanie automatyczne?

Myślę, że każdy z nas, który testuje różnego rodzaju oprogramowania zastanawia się czy scenariusze, które są testowane manualnie w jakiś sposób da się zautomatyzować.  Czy czas, który jest wykorzystywany na testowanie manualnie, da się w jakiś sposób skrócić na wykonywaniu testów regresji naszego oprogramowania.

Przeklikiwanie aplikacji po każdej zmianie jest kosztowne w czasie.

Testy automatyczne znakomicie uzupełniają testy manualne. Większość testerów zgadza się, że niemożliwe jest, by całkowicie zastąpić testowanie manualne na rzecz automatycznego. Człowiek w niektórych kontekstach sprawuje się lepiej, a testy automatyczne są  tym co zaprogramowaliśmy. Wykonują powtarzalne kroki.

Chcę na przykładzie Selenium Web Driver z wykorzystaniem języka programowania C# przedstawić pisanie testów automatycznych od podstaw. W blogu znajdziecie m.in. odpowiedzi na pytania:

  • Jak kliknąć w dany element?
  • Jak pobrać wartość tekstową elementu?
  • W jaki sposób odwoływać się do elementów?
  • Czym jest wzorzec Page Object Model?
  • I wiele innych.

Testowanie automatyczne

Plusy:

  • możliwość po wytworzeniu scenariusza testowego, odtwarzania kroków w sposób powtarzalny
  • przy dobrze dobranych scenariuszach i np. uruchamianiu i utrzymywaniu testów automatycznych aplikacji, większa kontrola nad potencjalnym defektami w systemie

Minusy:

  •  utrzymywanie testów z każdą zmianą aplikacji kosztuje (Jednak przy użyciu wzorca projektowego Page Object Model o, którym kiedyś opowiem da się ten koszt czasowy utrzymania testów znacząco zmniejszyć)

 

Czego potrzebujemy, żeby pisać przy użyciu Selenium Webdriver?

Visual Studio

https://www.visualstudio.com/en-us/products/visual-studio-community-vs.aspx

Selenium WebDriver

Selenium.WebDriver.Chrome – Jest to namespace, który reprezentuje przeglądarkę Chrome. Chrome jest najlepiej rozwiniętą przeglądarką w kontekście szybkości i rozwijalności driverów. Jest to przeglądarka dostosowana do Selenium. Potrzebujemy jakieś, aby Selenium wiedziało gdzie ma urchomić nasze testy automatyczne.

NUnit – jest to framework do pisania głównie testów jednostkowych. Jednak wiele innych testowych frameworków wykorzystuje NUnita pewnie dlatego, że jest gotowy i darmowy np. nasze Selenium WebDriver, Android UI Test, specFlow.

C# – na początku przygody z Selenium wystarczą podstawy na temat programowania.

R# – dodatek, który jest darmowy dla studentów, lub przez pierwsze 30 dni użytkowania dla każdego. Pomaga znacznie przy refraktoryzacji kodu. Dodatkowo stanowi dobre wsparcie dla NUnita i w dobry sposób prezentuje sesje testów. Podczas pisania testów będę go używał.

 

Tworzenie projektu

projekt1

W Visual Studio 2015 klikamy na „New” – > „Project”

Tworzymy aplikację typu class library – > Klikamy „OK”

Klikamy PPM na „TestyCw”.

Klikamy na „Manage NuGet Packages…”.

W Browse wpisujemy NUnit.

Dla Selenium WebDriver oraz Chrome również wykonujemy te kroki.

Wchodzimy do „Class1” Jest to miejsce gdzie będziemy pisać nasz kod testu.

Zmieniamy nazwę klasy na „EnterToPage”. Klasa powinna odzwierciedlać to, co będziemy robić w danych testach. Ponieważ klasa może posiadać wiele testów. Co moim zdaniem jest średnią praktyką. Osobiście preferuje każdy test w osobnej klasie. Jest to wtedy jasne, że dana klasa ma w sobie jeden określony scenariusz, swoją unikalną nazwą.

projekt2

[TextFixture] nadajemy w każdej klasie, która ma być klasą zawierając test. Jest to przez niektórych nazywane kontekstem testowym.

https://en.wikipedia.org/wiki/Test_fixture

[Test] Każdy test składa się z metody, która posiada atrybut [Test], pozwala to NUnitowi rozpoznać dany test. Bez tego atrybutu nie jest on widoczny.

Jest wiele innych atrybutów, które posiadają różną rolę. Sukcesywnie z kolejnymi wpisami będę przedstawiał większą ich ilość.

projekt3

Następnie przechodzimy do stworzenia Drivera. Driver jest naszą instancją, która pozwala odwoływać do danej, wybranej przeglądarki.

projekt4

Jak widać na zdjęciu mam spore możliwości. Ja na początek polecam  ChromeDrivera, bo działa on najszybciej ze wszystkich dostępnych driverów i najmniej z nim problemów. Dodatkową ciekawą opcją do rozważenia jest PhantomJS, który nie uruchamia graficznego interfejsu przeglądarki. Tylko odpala testy w konsoli. Ma on zbliżoną prędkość do ChromeDriver (jednak na korzyść chrome).

Url strony zapisałem do zmiennej. Polecam tę praktykę, żeby nie tworzyć tzw. Magicznych zmiennych. Czyli zmiennych, które są wpisane i nie wiemy czemu akurat taka wartość a nie inna. W tym przypadku akurat jest to zrozumiałe, ale gdy zaczniemy odwoływać się do elementów np. po CssSelectorze, może to już tak jasne nie być. Kolejną korzyścią z używania zmiennych jest fakt, że możemy sobie stworzyć klasę z ustawieniami i w jednym miejscu zmieniać adres url, a nie w każdym teście z osobna.

obraz55

Metodą do przejścia pod dany adres url. Jest GoToUrl („adresstrony”). Dodatkowymi ciekawymi metodami są:

Refresh – jest to odświeżenie przeglądarki

Back – pozwala wrócić do poprzedniej strony

Forward – pozwala „iść naprzód” (Czyli jeżeli cofnęliśmy się z jakiejś strony, możemy do niej wrócić)

projekt5

W kolejnym kroku używamy metody  driver.Manage().Window.Maximize(); która pozwala powiększyć okno przeglądarki do pełnej rozdzielczości.

W ostatnim kroku zajmujemy się zamknięciem drivera.

Gdy napisaliśmy test taki jak wyżej, uruchamiamy go.

projekt6

Robimy to, klikając na tę kulkę PPM -> Run.

projekt7

Gdy uruchomimy test przejdzie pozytywnie, obok kółka pojawi się zielony znaczek.

Do testów możemy i powinniśmy dodawać różnego rodzaju asercje.

Definicja:

Asercja (ang. assertion) – predykat (forma zdaniowa w danym języku, która zwraca prawdę lub fałsz), umieszczony w pewnym miejscu w kodzie. Asercja wskazuje, że programista zakłada, że predykat ów jest w danym miejscu prawdziwy.

Źródło: wikipedia

Pozwala nam np. to na:

– sprawdzenie, czy jesteśmy na pewno na tej samej stronie, czy może nie wystąpił jakiś redirect na inny adres

– czy title strony zgadza się z tym, co wiemy o tytule

– czy dany element wyświetla się na stronie

– czy dany element np. jakiś przycisk posiada określony tekst

Używanie asercji w testach jest niezbędne. Nie wyobrażam sobie bez nich testów.

selenium

selenium

Żeby użyć Asercji w testach korzystamy z klasy Assert i po kropce mamy dostęp do różnych metod. W tym przykładzie użyjemy Assert.AreEqual(obiekt1, obiekt2). Ta asercja sprawdza, czy jakieś dwa obiekty są tej samej wartości. Jeżeli tak to zwraca true, jeżeli nie to fałsz i test nie przechodzi.

77

Asercja ze screenu pozwala nam sprawdzić, czy url, który mamy wpisany w chrome driverze jest taki sam, jak podaliśmy w metodzie GoToUrl(). Uruchamiamy test, po chwili występuje błąd asercji, czyli to, co sprawdzamy okazuje się błędne. Dodatkowo kroki po asercji, która zwróciła błąd, nie są uruchamiane. W tym przypadku to driver.Close();

Dostajemy komunikat

selenium

selenium

Okazuje się, że nasz adres Url do bloga nie zawiera slasha na końcu zmiennej, a properties driver.Url zwraca ze slashem zawsze adres. Dokonujemy zmiany w naszym teście i dodajemy w zmiennej pageUrl slasha na końcu jej przed cudzysłowem kończącym zmienną.

Po zmianie slasha test zaczyna przechodzić.

projekt10

Podsumowanie

Udało nam się napisać pierwszy test w selenium.

Poznaliśmy podstawowe asercje. Następnym wpis będzie na temat szukania elementów.

Jeżeli podobał Ci się ten post.

Zachęcam do udostępniania.

MŚ.