Historia pytania:
Początkowo automatyczne testy często były pisane "na żywca", bez podziałów architektonicznych: logika weryfikacji i mechanizmy wykonania były wymieszane. Wraz z rozwojem projektów stało się oczywiste, że mieszanie frameworku i logiki testowej tworzy kruchą, trudną do utrzymania bazę kodu. Pojawiły się zalecenia architektoniczne dotyczące podziału odpowiedzialności.
Problem:
Jeśli testy zależą od wewnętrznych realizacji frameworku lub zawierają logikę interakcji z otoczeniem, wszelkie zmiany wymuszają przepisanie wielu testów. Przypadki testowe są skomplikowane, kod jest duplikowany, migracja do nowego frameworku lub platformy jest utrudniona.
Rozwiązanie:
Rygorystycznie rozdzielać:
Kluczowe cechy:
Czy można pisać kroki testowe bezpośrednio w testach, jeśli jest ich bardzo mało?
Nie warto. Nawet krótkie testy mogą się rozrosnąć, a brak warstw szybko prowadzi do chaosu.
Czy scenariusze testowe powinny znać mechanikę uruchamiania (np. kiedy inicjalizować sterownik)?
Nie. Wszystkie szczegóły infrastruktury powinny być ukryte w warstwie frameworku.
Czy normalne jest hardcodowanie parametrów testów wewnątrz przypadków (np. url, poświadczenia)?
Nie. Parametry testów powinny być konfigurowane przez ustawienia frameworku i otoczenia.
W projekcie testy bezpośrednio wywołują metody sterownika Selenium, w każdym teście powtarza się połączenie z WebDriverem. Każdy test samodzielnie parsuje konfigurację.
Zalety:
Wady:
Testy wykorzystują podstawowe abstrakcje frameworku: wspólna inicjalizacja i teardown, przesyłanie parametrów przez konfigurator, logika testowa wyrażana przez wysokopoziomowe metody.
Zalety:
Wady: