Senior
Czym jest Model Polity (PM)?
sobes.tech AI
Odpowiedź od AI
Model Polityki (PM) w kontekście testów automatycznych jest rozszerzeniem Modelu Obiektu Strony (POM). Głównym pomysłem jest oddzielenie polityk lub reguł biznesowych dotyczących interakcji z elementami strony (oraz zachowania z nimi związanego) od samych obiektów strony.
Zamiast umieszczać sprawdzenia i złożoną logikę bezpośrednio w Obiektach Strony, te reguły są przenoszone do osobnych klas lub modułów — Obiektów Polityki.
Zalety takiego podejścia:
- Lepsza czytelność: Scenariusze testowe stają się prostsze i łatwiejsze do zrozumienia, ponieważ skupiają się na opisywanym działaniu, a nie na jego walidacji.
- Ponowne użycie: Polityki mogą być używane dla różnych Obiektów Strony lub w różnych scenariuszach testowych.
- Podział odpowiedzialności: Obiekty Strony odpowiadają tylko za interakcję z elementami strony, a Obiekty Polityki za reguły i walidacje.
- Ułatwienie utrzymania: Zmiana reguły biznesowej wymaga zmiany tylko Obiektu Polityki, a nie wszystkich Obiektów Strony, w których ta reguła jest stosowana.
- Lepsza skalowalność: Łatwiej zarządzać większą liczbą testów i stron w miarę rozwoju aplikacji.
Struktura PM może wyglądać tak:
- Obiekty Strony: Reprezentują pojedyncze strony lub moduły UI. Zawierają lokalizatory elementów i metody do interakcji z nimi (np.
click_button(),enter_text()). Nie zawierają logiki walidacji. - Obiekty Polityki: Reprezentują reguły lub polityki biznesowe. Zawierają metody do sprawdzania stanu UI lub wykonywania działań opartych na logice biznesowej (np.
is_user_logged_in(),can_submit_form(),perform_checkout()). Mogą korzystać z jednego lub więcej Obiektów Strony. - Testy: Używają Obiektów Polityki do wykonywania scenariuszy, które zawierają sprawdzenia i logikę biznesową.
Przykład (pseudokod):
# Obiekt Strony
class LoginPage:
def enter_username(self, username):
# interakcja z polem nazwy użytkownika
pass
def enter_password(self, password):
# interakcja z polem hasła
pass
def click_login_button(self):
# interakcja z przyciskiem logowania
pass
# Obiekt Polityki
class AuthPolicy:
def __init__(self, driver):
self.login_page = LoginPage(driver)
self.dashboard_page = DashboardPage(driver) # Zakładamy, że DashboardPage istnieje
def login_as_user(self, username, password):
self.login_page.enter_username(username)
self.login_page.enter_password(password)
self.login_page.click_login_button()
# Potencjalnie dodajemy tutaj lub w osobnych metodach sprawdzenia
# return self.is_user_logged_in()
def is_user_logged_in(self):
# Sprawdzenie, czy elementy panelu głównego są widoczne
return self.dashboard_page.is_dashboard_displayed()
# Test
class LoginTest:
def test_successful_login(self, driver):
auth_policy = AuthPolicy(driver)
auth_policy.login_as_user("test_user", "password123")
assert auth_policy.is_user_logged_in(), "Użytkownik powinien być zalogowany"