Projekt

Ogólne

Profil

Celem zadania jest wykonanie unit testów przy użyciu PHPUnit dla modułów PHP w datasource/src/include/modules

Organizacja testów

Dodatkowe uwagi do tworzenia testów dla modułów PHP

O unit testach

Unit testy wykonują się bardzo szybko, ale też jest ich bardzo mało. Jako że jest ich mało nie ma potrzeby dzielenia testów na pliki po nazwach funkcji, wewnątrz unit testów można dzielić kod na fragmenty komentarzami
Przykład

O functional testach i fixture

Functional testy wykorzystują do działania bazę danych. Fixture uzupełniają bazę danych danymi, co każdy functional test każda tabela w bazie jest czyszczona (TRUNCATE) i uzupełniana od nowa dzięki czemu każdy test na pewno działa na tych samych danach a testy są powtarzalne.
Główną wadą tego jest wysoki czas potrzebny na wykonanie takich testów dlatego jeśli chcemy sprawdzić jeden konkretny test lepiej uruchomić tylko go (jak zostało to opisane w Organizacja testów).
Functional testy mogą również na potrzebę testu załadować inne dane, domyślnie ładowane są Fixture które nie mają w nazwie żadnego dodatkowego parametru (Taki zostanie załadowany domyślnie a taki nie zostanie)

Co testować

Testy powinny sprawdzać
  • Czy testowana funkcja działa i zwraca odpowiednie dane - dane porównać przy pomocy assertEquals
    • W przypadku gdy funkcja działa na bazie danych a nie zwraca danych można pobrać dane które powinny się zmienić przy pomocy Doctrine'a i sprawdzić czy rzeczywiście działa Przykład
  • Jeśli funkcja używa danych z bazy danych sprawdzić jak działa gdy tych danych nie ma - dane można usunąć na potrzeby testu używając loadCustomFixture, Przykład w którym używam Fixture do wyczyszczenia tabeli
  • Sprawdzić jakie wyjątki może zwrócić i dla każdego wyjątku napisać jeden test - aby sprawdzić czy wyjątek na pewno jest zwracany, wyjątki można sprawdzać przy pomocy exceptException
  • Jeśli funkcja przyjmuje argumenty
    • Jeśli argumenty są opcjonalne przetestować kod z nimi/bez nich
    • Jeśli argumenty to rozbudowane tablice/obiekty (np. duży obiekt z wieloma możliwościami sortowania danych) przetestować każdą taką możliwość Przykład

Pomysły na wykorzystanie testów

To akurat tylko kilka moich pomysłów
  • Uruchamiać testy po aktualizacji na produkcji - szybko można wtedy wykryć że coś jednak nie działa
  • Uruchamiać automatycznie wszystkie testy
    • Gdy dodany zostanie nowy commit na mastera - jest chyba skrypt który mógłby to robić, aktualnie wysyła maile gdy dodany zostanie commit
    • O danej godzinie, może to być np. o północy tak jak wgrywana wtedy jest kopia bazy danych na develu

Gdy po sprawdzeniu testów okaże się że któryś nie przeszedł można wysyłać do autora maila/tworzyć jakiegoś automatycznego ticketa.
Nie powinno być też problemów z tym aby odpowiednio czytać wyniki testów, PHPUnit pozwala na własne klasy do logowania wyników testów i można to łatwo wykorzystać na nasze potrzeby

Dodatkowo należy

  • Poprawić skrypt mkmod.py który tworzy nowy moduł tak aby dodawał automatycznie odpowiednie foldery w testach i tworzony moduł był obiektowy
  • Poprawić ws_stateful.php aby działał z obiektowymi modułami
  • Dodać do config.json.php dane do bazy danych z której korzystają functional testy
  • Poprawić skrypt reconf.py aby można było podać dane do połączenia dla bazy danych functional testów