Pokazywanie postów oznaczonych etykietą web driver. Pokaż wszystkie posty
Pokazywanie postów oznaczonych etykietą web driver. Pokaż wszystkie posty

sobota, 17 czerwca 2017

Unit test w Pythonie

Przypadek testowy

Część pewnej majowej niedzieli postanowiłam spędzić na pisaniu testów automatycznych w Selenium. Zamysł wydawał się prosty: stworzyć na githubie repozytorium z testami sprawdzającymi stronę mojego własnego bloga. Wymyśliłam, że przetestuję jakąś małą funkcjonalność tej strony, czyli np. czy ikonka Facebooka i Twittera zabierają użytkownika do odpowiednich stron internetowych podłączonych do tychże ikon. W manualnym testowaniu taki przypadek testowy wyglądałby mniej więcej tak:

Tytuł: Nawigacja do linka na Facebook
Środowisko: Windows 10, Przeglądarka Chrome
Warunek wstępny: Użytkownik ma dostęp do internetu i przeglądarkę Chrome

Kroki:
  1. Otwórz przeglądarkę Chrome.
  2. Wejdź na stronę martamaracje.blogspot.com.
  3. Kliknij na ikonę Facebook z prawej strony ekranu pod nagłówkiem "Tutaj jestem".
Rezultat oczekiwany: Otwiera się strona facebook.com/martamaracje/.

Proste? Proste! Co w tym trudnego? Łatwo wykonać te kroki manualnie.

Test automatyczny

Wynalazłam moje notatki z zajęć z testowania automatycznego w Pythonie przy użyciu Selenium oraz zajrzałam do repozytorium na githubie zapewnionym przez naszego WSB-owego wykładowcę tego tematu i skopiowałam zarys formuły do stworzenia testu jednostkowego.
W testach jednostkowych w Pythonie można za pomocą metody setUp spowodować, że Selenium przed wykonaniem konkretnego testu lub zestawu testów otwiera przeglądarkę Chrome - może to być oczywiście dowolna inna przeglądarka.
def setUp(self):
    self.driver=webdriver.Chrome()
Następnie, kolejna funkcja musi zaczynać się od słowa "test" i wykonuje kolejne kroki naszego przypadku testowego. Kilka poleceń dla webdrivera mogłam skopiować z przykładów, które robiłam na zajęciach w WSB, a reszty szukałam w googlu. Większość odpowiedzi na to, jak pokierować webdriverem znalazłam na stackoverflow.com. Po godzinach wymyślania, szukania i sprawdzania, doszłam do czegoś takiego:
def test_when_facebook_link_clicked_then_navigate_to_facebook(self):
    #Arrange
    driver=self.driver
    driver.get("http://martamaracje.blogspot.com")
    expected_url="https://www.facebook.com/martamaracje/"
    social_media_link=driver.find_element_by_css_selector(
           "#fawesomeicons > a[href='" + expected_url + "']")
    initial_tabs=len(driver.window_handles)
        
    #Act
    social_media_link.click()
    sleep(2) #wait for navigation
    opened_tabs=len(driver.window_handles)
    driver.switch_to.window(driver.window_handles[opened_tabs-1])

    #Assert
    self.assertGreater(opened_tabs, initial_tabs)
    self.assertIn(expected_url, driver.current_url)
Nazwa testu opisuje w zwięzły sposób, co ma on sprawdzać (when_facebook_link_clicked_then_navigate_to_facebook). Wiem, że to nie jest zdanie, jak z Szekspira i ma lekko zachwianą gramatykę, ale zawiera kluczowe słowa "when" i "then" ważne w programowaniu np. w składni gherkin. Wszystkie kroki pogrupowane są wg zasady:
  • Arrange - przygotuj
  • Act - wykonaj
  • Assert - sprawdź

W sekcji Arrange webdriver otwiera stronę martamaracje.blogspot.com. Stworzyłam sobie zmienną expected_url, żeby móc jej później użyć dla sprawdzenia twittera, podmieniając jedynie wartość expected_url na mój twiterrowy adres. Zmienna social_media_link będzie miała przypisany element w kodzie html, który webdriver znajdzie na podstawie selektora css zawierającego oczekiwany adres internetowy, przypisany wcześniej do zmiennej expected_url. Ponieważ link do facebooka otwiera się w nowej zakładce, musiałam też stworzyć zmienną initial_tabs, która zliczy ilość zakładek otwartych zanim kliknie się na link.

Po tych warunkach wstępnych zlecam driverowi następujące działania (Act): po pierwsze kliknąć na to, co znalazł i co przypisane zostało do zmiennej social_media_link. Następnie, po 2 sekundach funkcja len zlicza jeszcze raz ilość otwartych zakładek i przypisuje ją do zmiennej opened_tabs. Na koniec driver ma za zadanie przejść do ostatnio otwartej zakładki (to będzie ta otwarta kliknięciem na link facebooka).

I nadchodzi czas na sprawdzenie (Assert), czy otworzyła się poprawna strona z linka. Najpierw, więc test sprawdzi, czy ilość otwartych po kliknięciu zakładek (opened_tabs) jest większa od początkowej ilości zakładek (initial_tabs). To sprawdzenie daje pojęcie, czy coś nowego się otworzyło. Ale jeszcze przydałoby się sprawdzić, czy adres internetowy obecnie otwartej zakładki zgadza się z tym oczekiwanym i przypisanym do zmiennej expected_url. Do tego użyłam funkcji assertIn, która oceni, czy adres https://www.facebook.com/martamaracje/ występuje w url-u, do którego posłałam webdrivera poleceniem driver.switch_to.window().

Uruchomiony na moim komputerze test nawigacji do linków na facebooku i twitterze zadziałał: webdriver sam otwierał przeglądarkę, klikał, gdzie mu wskazałam i sprawdzał wyniki tych działań, wracając do mnie z komentarzem "OK". Całość kodu do tego testu jednostkowego można obejrzeć na github.com/martamaracje/blogtests. Jestem z siebie dumna. To może mały krok dla ludzkości, ale duży skok dla martamaracje:).

środa, 29 marca 2017

Napisz swój pierwszy test w Javie

Zaproszenie na warsztaty pod tytułem "Napisz swój pierwszy test w Javie"

Women in Technology Rule

Zgłosiłam się na wydarzenie organizowane przez Women in Technology i QA Courses dla testerów manualnych, którzy nie znają języka Java, ani nigdy wcześniej nie pisali testów automatycznych. Mimo, że wprawdzie nie jestem testerem manualnym, na podstawie mojego zgłoszenia zakwalifikowałam się do grona 25 uczestników warsztatów "Napisz swój pierwszy test w Javie".  Bardzo się ucieszyłam z tego małego sukcesu. Konfigurowanie środowiska, żeby sprawnie w tych warsztatach wziąć udział przysporzyły mi nieco kłopotów, ale dopomógł mąż deweloper. Zainstalowałam na swoim  komputerze pod czujnym okiem domowego uber-programisty Java JDK, środowisko programistyczne IntelliJ IDEA i wtyczkę Selenium Builder w Firefoksie, aby w środowy wieczór popędzić moją srebrną Renią na spotkanie z innymi aktywnymi technologicznie dziewczętami. Jak przed każdym tego typu wydarzeniem, byłam zestresowana, że nie nadążę za tempem prowadzących i reszty grupy, ale dzielnie pojawiłam się na miejscu.

QA Courses Rule

Warsztaty prowadziła Irena Szumowskaja z pomocą krążącego po sali, żeby rozwiązywać bieżące problemy Olega Manzhosa. Irena jeszcze przed szkoleniem wymagała, żeby wszyscy uczestnicy poprosili ją na Skypie o dodanie do czatu, dzięki czemu mogliśmy wszelkie linki i kawałki kodu dostawać wprost na nasze konta Skypowe natychmiast, gdy były nam potrzebne w ćwiczeniach. Bardzo przypadło mi do gustu to rozwiązanie usprawniające naszą komunikację i nasze ćwiczenia.

Sama Irena prowadziła warsztaty w komfortowym tempie, spokojnie, cierpliwie i z poczuciem humoru tłumacząc zagadnienia i rozwiązując problemy. Dziewczyna umie uczyć! Warsztaty były dobrze zorganizowane i zaplanowane - jedno ćwiczenie dotyczyło stworzenia testu automatycznie przy pomocy zapisu z nagrywarki Selenium Builder, a drugie odbywało się już ręcznie - prawie od podstaw.

Najpierw robiliśmy test automatyczny z użyciem Selenium Buildera wspólnie. Wtyczka Selenium Builder zapisuje kroki, które wykonuje się na jakiejś stronie internetowej, a następnie te kroki można wyeksportować do "Java/TestNG", czyli zapisać w pliku scenariusz testowy w języku Java. Taki plik można potem otworzyć przy pomocy IntelliJ IDEA, żeby zobaczyć kod i ponownie uruchomić zapisane kroki.

Na podstawie kodu, który utworzył się przy pomocy Selenium Buildera, Irena pokazała nam, jak stworzyć podobny test od podstaw, ręcznie. Nauczyła nas poleceń takich jak:
 // utwórz sterownik
 FirefoxDriver wd = new FirefoxDriver();
 // nawiguj do wskazanego adresu strony
 wd.get("adres.strony.http");
 // znajdź element po identyfikatorze i go kliknij
 wd.findElement(By.id("main-search-text")).click();
 // znajdź element po nazwie
 wd.findElement(By.name("a"));
 // znajdź element po nazwie i wstaw do niego tekst
 wd.findElement(By.name("password")).sendKeys("password");
 // znajdź element z wykorzystaniem XPath
 // - drugie pole tekstowe w formularzu o identyfikatorze 'login'
 // - i go kliknij
 wd.findElement(By.xpath("//form[@id='login']/input[2]")).click();
Zmienna wd to Web Driver przeglądarki Firefox. Jest to urządzenie z pakietu Selenium, które możemy prosić o wykonanie konkretnych poleceń w przeglądarce internetowej, np. znalezienie elementu w kodzie HTML strony, aby następnie wywołać na nim akcje takie, jak kliknięcie, czy uzupełnienie danymi. Irena pokazała nam, jak znajdować elementy oznaczone identyfikatorem (id) i/lub nazwą (name), których chcemy użyć w naszym teście.

Jest to dla mnie nadal doświadczenie z pogranicza magii, kiedy jakieś tajemnicze polecenia napisane w ledwo zrozumiałym języku powodują, że komputer zaczyna żyć własnym życiem, otwierać strony internetowe, uzupełniać pola tekstowe. Warsztaty nie były dla mnie ani za trudne, ani za łatwe. Zakończyły się z poczuciem osiągniętego sukcesu, bo oba zadania udało mi się zrobić i wszystko zadziałało tak, jak było przewidziane.

JetBrains Rule

IntelliJ IDEA to takie środowisko, w którym można tworzyć kod w języku Java. Stworzyła je firma JetBrains, z którą miałam już styczność przy bezpłatnym kursie podstaw Pythona przygotowanym przez Udemy.com.  Tam poznałam środowisko podobne do IntelliJ tyle, że przygotowane specjalnie do pisania w Pythonie - PyCharm. JetBrains wydaje się tworzyć dosyć przystępne narzędzia do ćwiczenia swoich umiejętności tworzenia oprogramowania w różnych językach. W PyCharm można znaleźć konsolę do tworzenia skryptów Pythonowych oraz terminal do wpisywania komend typowych dla Linuxa. Wszystko jest zintegrowane w jednym miejscu i od razu można zobaczyć działanie swojej radosnej twórczości.