Testy funkcjonalne w Selenium

Budowanie aplikacje przy wykorzystaniu TDD (ang. Test Drivent Development) staje się nie tyle coraz popularniejsze, co wygodne (zwłaszcza przy dużych projektach), bowiem pozwala wyeliminować wiele błędów, które pojawiłyby się przy pominięciu tworzenia testów jednostkowych i funkcjonalnych budowanych aplikacji. Książka, które niezwykle ciekawie przedstawia proces TDD w praktyce jest Test-Driven Development with Python, w której na przykładzie języka Python oraz framework’a Django autor pokazał jak tworzyć testy jednostkowe oraz testy funkcjonalne w Selenium.

Przykłady omawiane w książce dostępne są w GitHub, które można pobrać i wykorzystać do nauki nie tylko samego Django i Python’a, ale przede wszystkim podejścia TDD i testów w Selenium. Poniżej przedstawiony został przykładowy test w Selenium wraz z komentarzami zbudowany właśnie na podstawie lektury wspomnianej książki.

from django.contrib.staticfiles.testing import StaticLiveServerTestCase
from selenium import webdriver
from selenium.webdriver.common.keys import Keys

class NewVisitorTest(StaticLiveServerTestCase):

    def setUp(self):
        # wykorzystanie sterownika dla Chrome (wcześniej pobranego i umieszczonego w odpowiednim katalogu)
        self.browser = webdriver.Chrome('/Users/seba/Projects/python/drivers/chromedriver')
        # odczekanie 3 sekund po uruchomieniu przeglądarki w celu całkowitego załadownia strony 
        self.browser.implicitly_wait(3)

    def tearDown(self):
        # zamknięcie przeglądarki
        self.browser.quit()

    def check_for_row_in_list_table(self, row_text):
        # pobranie tabeli
        table = self.browser.find_element_by_id('id_list_table')
        # pobranie wierszy z tabeli
        rows = table.find_elements_by_tag_name('tr')
        # sprawdzenie czy w którymś z wierszy znajduje się poszukiwany fragment tekstu
        self.assertIn(row_text, [row.text for row in rows])

    def test_can_start_a_list_and_retrieve_it_later(self):
        # uruchomienie w przeglądarce adresu URL, pod którym dostępna jest testowana aplikacja
        self.browser.get(self.live_server_url)

        # sprawdzenie, czy w tytule strony oraz nagłówku h1 jest nazwa aplikacji 'To-Do'
        self.assertIn('To-Do', self.browser.title)
        header_text = self.browser.find_element_by_tag_name('h1').text
        self.assertIn('To-Do', header_text)

        # znalezienie na wyświetlonej stronie elementu o identyfikatorze 'id_new_item'
        inputbox = self.browser.find_element_by_id('id_new_item')
        self.assertEqual(
                inputbox.get_attribute('placeholder'),
                'Wpisz zadanie'
        )

        # wpisanie w polu tekstowym wartości 'sprzatanie mieszkania'
        inputbox.send_keys('sprzatanie mieszkania')

        # wciśniecię klawisza ENTER by zakończyć wprowadzanie nowego zadania
        inputbox.send_keys(Keys.ENTER)

        # sprawdzenie, czy nowy adres URL zawiera słowo 'lists'
        user1_list_url = self.browser.current_url
        self.assertRegex(edith_list_url, '/lists/.+')

        # sprawdzenie czy w liście zadań jest dodane 'sprzatanie mieszkania'
        self.check_for_row_in_list_table('1: sprzatanie mieszkania')

        # dodanie kolejnego zadania 'zrob zakupy'
        inputbox = self.browser.find_element_by_id('id_new_item')
        inputbox.send_keys('zrob zakupy')
        inputbox.send_keys(Keys.ENTER)

        # sprawdzenie czy oba zadania są wyświetlane na stronie
        self.check_for_row_in_list_table('2: zrob zakupy')
        self.check_for_row_in_list_table('1: sprzatanie mieszkania')

        # zamknięcie przeglądarki wraz z sesją użytkownika, który dodał 2 zadania
        self.browser.quit()

        # ponowne uruchomienie przeglądarki
        self.browser = webdriver.Chrome('/Users/seba/Projects/python/drivers/chromedriver')

        # ponowne uruchomienie witryny z testowaną aplikacją
        self.browser.get(self.live_server_url)

        # sprawdzenie czy zadania dodane przez inne użytkownika nie są wyświetlane
        page_text = self.browser.find_element_by_tag_name('body').text
        self.assertNotIn('zrob zakupy', page_text)
        self.assertNotIn('sprzatanie mieszkania', page_text)

        # dodanie pierwszego zadania przez innego użytkownika
        inputbox = self.browser.find_element_by_id('id_new_item')
        inputbox.send_keys('mycie samochodu')
        inputbox.send_keys(Keys.ENTER)

        # sprawdzenie, czy nowy adres URL zawiera słowo 'lists'
        user2_list_url = self.browser.current_url
        self.assertRegex(francis_list_url, '/lists/.+')

        # sprawdzenie czy URL listy 1 i 2 użytkownika są różne
        self.assertNotEqual(user1_list_url, user2_list_url)

        # sprawdzenie czy zadanie 1 użytkownika nie są widoczne, a 2 użytkownika - są wyświetlane
        page_text = self.browser.find_element_by_tag_name('body').text
        self.assertNotIn('zrob zakupy', page_text)
        self.assertIn('mycie samochodu', page_text)

 

Dodaj komentarz

Twój adres email nie zostanie opublikowany. Pola, których wypełnienie jest wymagane, są oznaczone symbolem *

Time limit is exhausted. Please reload CAPTCHA.