Moduł PrestaShop bez testów to moduł, który testujesz ręcznie przy każdej zmianie lub nie testujesz wcale. Przy module o kilku funkcjach i minimalnej logice to może być akceptowalne. Przy module z logiką biznesową, integracjami i wieloma ścieżkami wykonania - to jest przepis na regresje.
PHPUnit w projekcie PrestaShop
PrestaShop sam używa PHPUnit do testów i dołącza go jako zależność deweloperską przez Composer. Do testowania własnych modułów możesz skonfigurować osobną instancję PHPUnit w katalogu modułu. Plik phpunit.xml.dist definiuje konfigurację: gdzie są testy, co bootstrapować, jakie raporty generować.
Bootstrap i inicjalizacja PS
Testy modułów wymagają środowiska PS: załadowania klas, połączenia z bazą, konfiguracji. Bootstrap skryptu testowego inicjalizuje PS w trybie testowym. To wymaga dostępu do bazy danych - testy integracyjne modułu potrzebują działającej instalacji PS, nie tylko izolowanego PHPUnit.
Co testować
Priorytet testów dla modułu PS:
- Logika biznesowa w klasach serwisów - obliczenia, transformacje danych, walidacje
- Metody hooku - co jest zwracane przy różnych danych wejściowych
- Operacje na bazie danych - czy dane są poprawnie zapisywane i odczytywane
- Integracje z zewnętrznymi API - tu przydają się mocki
Mocki dla zewnętrznych zależności
Zewnętrzne API (bramka płatności, serwis wysyłki, zewnętrzny serwis danych) nie powinny być wywoływane podczas testów. Mocki symulują odpowiedzi tych serwisów bez rzeczywistego połączenia. PHPUnit ma wbudowane mechanizmy tworzenia mocków dla interfejsów i klas.
Integracja z CI
Testy uruchamiane automatycznie przy każdym commicie dają wartość znacznie większą niż uruchamiane raz na jakiś czas ręcznie. Konfiguracja GitHub Actions lub GitLab CI do uruchamiania PHPUnit dla modułu przy każdym push to kilka linii YAML i godziny pracy wstępnej, która wielokrotnie się zwraca.
Pokrycie testami
Nie musisz dążyć do 100% pokrycia. Skup się na krytycznej logice biznesowej i miejscach, które historycznie powodowały problemy. Testy pokrywające 60-70% istotnej logiki są znacznie bardziej wartościowe niż testy pisane wyłącznie po to, żeby podnieść metrykę pokrycia.