Sobes.tech
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"