Automatyzacja testowania logiki biznesowej złożonych aplikacji ma długą historię, zaczynając od pierwszych skryptów do weryfikacji walidatorów po nowoczesne testy mikrousługowe. W miarę jak architektury stawały się bardziej skomplikowane (monolit, SOA, mikro- i makrosystemy) powstał problem: zmiany na jednym poziomie architektury często łamią testy na innych poziomach.
Problem polega na konieczności pisania testów, które są odporne na reorganizację interakcji między warstwami aplikacji: zmianę kontraktów, struktur danych, procesów biznesowych. Często testy są związane z szczegółami implementacji, przez co stają się "kruchymi" i trudnymi do utrzymania.
Rozwiązanie — budować testy na zasadzie „czarnej skrzynki” z orientacją na dane wejściowe/wyjściowe, używać warstw abstrakcji do dostępu do encji systemu (na przykład, Warstwa Usługowa i Warstwa Domenowa w architekturze). Należy oddzielić logikę biznesową od szczegółów infrastruktury i używać mocków/stabów do zewnętrznych zależności, aby zapewnić izolację i stabilność testów.
Kluczowe cechy:
Czym różni się weryfikacja logiki biznesowej przez warstwę UI od weryfikacji przez API/Warstwę Domenową?
Testy UI są zazwyczaj mniej odporne na zmiany, ponieważ najmniejsze zmiany interfejsu prowadzą do awarii testów. Testy przez API czy Warstwę Domenową mniej zależą od frontu i lepiej izolują weryfikację zasad biznesowych.
Czy należy zamockować wszystkie zależności logiki biznesowej do ich testowania?
Nie! Nie należy mockować tego, co można zrealizować w środowisku testowym (na przykład, lekką pamięć zamiast Bazy Danych). Mocki są potrzebne dla skomplikowanych, kosztownych lub zewnętrznych zależności. Pełne mockowanie może prowadzić do „fikcyjnych” testów, które nie odzwierciedlają rzeczywistych scenariuszy.
Czy wystarczy testowanie tylko pozytywnych scenariuszy dla logiki biznesowej?
Nie! Ważne jest pokrycie wszystkich przypadków brzegowych i negatywnych scenariuszy, w przeciwnym razie krytyczne błędy pozostaną niezauważone, co prowadzi do podatności głównego procesu biznesowego.
W projekcie testowano logikę biznesową tylko przez testy UI Selenium, bezpośrednio pracując z przyciskami i formularzami. Każdy refaktoryzacja frontendu prowadziła do masowych awarii testów automatycznych.
Zalety:
Wady:
W projekcie wdrożono warstwę testów API i jednostkowych. UI pokrył tylko krytyczne ścieżki, cała reszta walidacji odbywała się poprzez warstwę serwisową z mockowaniem kosztownych usług.
Zalety:
Wady: