Mam pytanie odnośnie testowania aplikacji internetowych bo nie bardzo wiem czy dobrze zrozumiałem idee i metodykę.
Powiedzmy że mam prosty formularz rejestracji składający się z pól:
Email
Hasło
Powtórz hasło
Rozumiem, że teraz powinienem napisać testy sprawdzające:
- podanie maila już istniejącego w bazie
- podanie w polu z mailem czegoś w złym formacie np. "asdaf123"
- pozostawienia obu pól pustych
- złego powtórzenia hasła
- poprawnego wypełnienia formularza
Do testowania wykorzystuję Selenium Webdriver - dokładnie API w Pythonie. Model przedstawiania strony Page Object. Całość wygląda tak, że stworzyłem 3 pliki:
- testy.py - główny plik z klasą testującą
- RegistrationPage.py - plik w której mapuję stronę z rejestracją na klasę i uzupełniam o przypadki testowe
- Dictionary.py - plik ze słownikami, w których znajdują się "wartości" do testów jak też elementy strony
Główny plik:
import unittest, re, time
from selenium import webdriver
from selenium.webdriver import Firefox
from selenium.webdriver.common.keys import Keys
from selenium.webdriver.support.wait import WebDriverWait
from selenium.webdriver.firefox.firefox_profile import FirefoxProfile
# Import page object pattern
from registrationpage import RegistrationPage
testingPage = "http://www.example.com"
# Testowanie strony
class PageTest(unittest.TestCase):
def setUp(self):
# Utworzenie nowego profilu FireFoxa
profile = FirefoxProfile()
# Dodanie rozszerzenia umozliwiajacego obsluge bledow JS
profile.add_extension("JSErrorCollector.xpi")
# Utworzenie instancji FireFox na podstawie zdefiniowanego profilu
self.driver = webdriver.Firefox(profile)
self.driver.maximize_window()
self.driver.get(testingPage)
def test_unlogged_user_page(self):
# Rejestracja
Rejestracja = RegistrationPage(self.driver)
Rejestracja.DuplicateMail()
Rejestracja.WrongMailFormat()
Rejestracja.EmptyValues()
Rejestracja.WrongPasswordRepeat()
Potwierdzenie = Rejestracja.RegistrationCorrect()
Potwierdzenie.Confirm()
def tearDown(self):
errors = self.driver.execute_script("return window.JSErrorCollector_errors.pump()")
print "Liczba bledow JavaScript: %s" % errors.__len__()
self.driver.close()
if __name__ == "__main__":
try:
suite = unittest.TestLoader().loadTestsFromTestCase(PageTest)
unittest.TextTestRunner(verbosity=2).run(suite)
except SystemExit: pass
Strona rejestracji:
from dictrionary import locators, values
from confirmpage import ConfirmPage
class RegistrationPage:
def __init__(self, driver):
self.driver = driver
self.driver.get("http://www.example.com/rejestruj")
#
# Tutaj były inny przypadki związane z nieudaną rejestracją
#
def RegistrationCorrect(self):
self.driver.find_element_by_id(locators["reg.mail"]).clear()
self.driver.find_element_by_id(locators["reg.mail"]).send_keys(values["reg.mail"])
self.driver.find_element_by_id(locators["reg.pass"]).clear()
self.driver.find_element_by_id(locators["reg.pass"]).send_keys(values["reg.pass"])
self.driver.find_element_by_id(locators["reg.pass2"]).clear()
self.driver.find_element_by_id(locators["reg.pass2"]).send_keys(values["reg.passRepeat"])
self.driver.find_element_by_id(locators["reg.pass2"]).submit()
# Poprawna rejestracja
return ConfirmPage(self.driver)
Moje pytania
- Czy to co napisałem jest w jakiś sposób poprawne (nie chodzi stricte o kod ale ideę testów)?
- Czy funkcja test_unlogged_user_page może tak wyglądać czy każdy przypadek nieudanej rejestracji powinien być wydzielony osobno?
- Czy dobrze zrozumiałem metodę Page Object w odniesieniu do testowania za pomocą pakietu Selenium?
Niestety nigdzie nie znalazłem przykładu z kodem pełnego testu dla jakiejś funkcjonalności. Będę również wdzięczy za wszelkie uwagi i sugestie od osób zajmujących się testowaniem.