Uruchamianie testów

Najbardziej widocznym elementem Nette Tester jest narzędzie do uruchamiania testów z wiersza poleceń. Jest niezwykle szybkie i solidne, ponieważ automatycznie uruchamia wszystkie testy jako oddzielne procesy i to równolegle w wielu wątkach. Potrafi również uruchamiać się samo w tzw. trybie watch.

Narzędzie do uruchamiania testów wywołujemy z wiersza poleceń. Jako parametr podajemy katalog z testami. Dla bieżącego katalogu wystarczy podać kropkę:

vendor/bin/tester .

Narzędzie do uruchamiania testów przeszuka podany katalog i wszystkie podkatalogi i wyszuka testy, czyli pliki *.phpt i *Test.php. Jednocześnie czyta i ocenia ich adnotacje, aby wiedzieć, które z nich i jak uruchamiać.

Następnie uruchomi testy. Podczas wykonywania testów wypisuje na bieżąco wyniki na terminal jako znaki:

  • . – test przeszedł
  • s – test został pominięty (skipped)
  • F – test nie powiódł się (failed)

Wyjście może wyglądać na przykład tak:

 _____ ___  ___ _____ ___  ___
|_   _/ __)( __/_   _/ __)| _ )
  |_| \___ /___) |_| \___ |_|_\  v2.5.2

Note: No php.ini is used.
PHP 8.3.2 (cli) | php -n | 8 threads

........s..........................

OK (35 tests, 1 skipped, 1.7 seconds)

Przy ponownym uruchomieniu najpierw wykonuje testy, które przy poprzednim uruchomieniu nie powiodły się, więc natychmiast dowiesz się, czy udało Ci się naprawić błąd.

Jeśli żaden test się nie powiedzie, kod powrotu Testera wynosi zero. W przeciwnym razie kod powrotu jest niezerowy.

Tester uruchamia procesy PHP bez php.ini. Szczegółowiej w części Własny php.ini.

Parametry wiersza poleceń

Przegląd wszystkich opcji wiersza poleceń uzyskamy, uruchamiając Testera bez parametrów lub z parametrem -h:

 _____ ___  ___ _____ ___  ___
|_   _/ __)( __/_   _/ __)| _ )
  |_| \___ /___) |_| \___ |_|_\  v2.5.2

Usage:
    tester [options] [<test file> | <directory>]...

Options:
    -p <path>                    Określ interpreter PHP do uruchomienia (domyślnie: php).
    -c <path>                    Szukaj pliku php.ini (lub szukaj w katalogu) <path>.
    -C                           Użyj systemowego php.ini.
    -d <key=value>...            Zdefiniuj wpis INI 'key' z wartością 'value'.
    -s                           Pokaż informacje o pominiętych testach.
    --stop-on-fail               Zatrzymaj wykonywanie przy pierwszym niepowodzeniu.
    -j <num>                     Uruchom <num> zadań równolegle (domyślnie: 8).
    -o <console|console-lines|tap|junit|log|none>  (np. -o junit:output.xml)
                                 Określ jeden lub więcej formatów wyjściowych z opcjonalną nazwą pliku.
    -w | --watch <path>          Obserwuj katalog.
    -i | --info                  Pokaż informacje o środowisku testów i zakończ.
    --setup <path>               Skrypt do konfiguracji runnera.
    --temp <path>                Ścieżka do katalogu tymczasowego. Domyślnie przez sys_get_temp_dir().
    --colors [1|0]               Włącz lub wyłącz kolory.
    --coverage <path>            Generuj raport pokrycia kodu do pliku.
    --coverage-src <path>        Ścieżka do kodu źródłowego.
    -h | --help                  Ta pomoc.

-p <path>

Określa binarkę PHP, która będzie używana do uruchamiania testów. Standardowo jest to php.

tester -p /home/user/php-7.2.0-beta/php-cgi tests

-c <path>

Określa, który php.ini będzie używany podczas uruchamiania testów. Domyślnie żaden php.ini nie jest używany. Więcej w części Własny php.ini.

-C

Użyty zostanie systemowy php.ini. Na UNIXie również wszystkie odpowiednie pliki INI /etc/php/{sapi}/conf.d/*.ini. Więcej w części Własny php.ini.

-d <key=value>

Ustawia wartość dyrektywy konfiguracyjnej PHP dla testów. Parametr może być użyty wielokrotnie.

tester -d max_execution_time=20

-s

Wyświetlone zostaną informacje o pominiętych testach.

--stop-on-fail

Tester zatrzyma testowanie przy pierwszym niepowodzeniu testu.

-j <num>

Określa, ile równoległych procesów z testami zostanie uruchomionych. Domyślna wartość to 8. Jeśli chcemy, aby wszystkie testy przebiegły seryjnie, użyjemy wartości 1.

-o <console|console-lines|tap|junit|log|none>

Ustawia format wyjścia. Domyślny jest format dla konsoli. Możesz podać nazwę pliku, do którego zostanie zapisane wyjście (np. -o junit:output.xml). Opcję -o można powtórzyć wielokrotnie, aby wygenerować więcej formatów naraz.

  • console: zgodne z domyślnym formatem, ale w tym przypadku nie wyświetli się logo ASCII
  • console-lines: podobne do console, ale wynik każdego testu jest podany w osobnej linii z dodatkowymi informacjami
  • tap: format TAP odpowiedni do przetwarzania maszynowego
  • junit: format XML JUnit, również odpowiedni do przetwarzania maszynowego
  • log: Wyjścia przebiegu testowania. Wszystkie nieudane, pominięte, a także udane testy
  • none: nic się nie wypisuje

-w | --watch <path>

Po zakończeniu testowania Tester nie kończy pracy, ale pozostaje uruchomiony i śledzi pliki PHP w podanym katalogu. Przy zmianie uruchomi testy ponownie. Parametr może być użyty wielokrotnie, jeśli chcemy śledzić więcej katalogów.

Przydaje się przy refaktoryzacji biblioteki lub debugowaniu testów.

tester --watch src tests

-i | --info

Wyświetla informacje o środowisku uruchomieniowym dla testów. Na przykład:

tester -p /usr/bin/php7.1 -c tests/php.ini --info

PHP binary:
/usr/bin/php7.1

PHP version:
7.1.7-1+0~20170711133844.5+jessie~1.gbp5284f4 (cli)

Code coverage engines:
(not available)

Loaded php.ini files:
/var/www/dev/demo/tests/php.ini

PHP temporary directory:
/tmp

Loaded extensions:
Core, ctype, date, dom, ereg, fileinfo, filter, hash, ...

--setup <path>

Tester przy starcie wczytuje podany skrypt PHP. W nim dostępna jest zmienna Tester\Runner\Runner $runner. Załóżmy plik tests/runner-setup.php z zawartością:

$runner->outputHandlers[] = new MyOutputHandler;

Testera uruchomimy:

tester --setup tests/runner-setup.php tests

--temp <path>

Ustawia ścieżkę do katalogu dla tymczasowych plików Testera. Domyślną wartość zwraca sys_get_temp_dir(). Jeśli domyślna wartość nie jest poprawna, zostaniesz powiadomiony.

Jeśli nie jesteśmy pewni, jaki katalog jest używany, uruchomimy Testera z parametrem --info.

--colors 1|0

Domyślnie Tester wykrywa kolorowy terminal i koloruje swoje wyjście. Ta opcja nadpisuje autodetekcję. Globalnie możemy kolorowanie ustawić zmienną środowiskową systemu NETTE_TESTER_COLORS.

--coverage <path>

Tester wygeneruje raport z przeglądem, ile kodu źródłowego pokrywają testy. Ta opcja wymaga zainstalowanego rozszerzenia PHP Xdebug, lub PCOV, albo PHP 7 z PHPDBG SAPI, które jest szybsze. Rozszerzenie pliku docelowego określa jego format. Albo HTML, albo Clover XML.

tester tests --coverage coverage.html  # raport HTML
tester tests --coverage coverage.xml   # raport Clover XML

Priorytet wyboru mechanizmu jest następujący:

  1. PCOV
  2. PHPDBG
  3. Xdebug

Przy użyciu PHPDBG możemy przy obszernych testach napotkać na niepowodzenie testu z powodu wyczerpania pamięci. Zbieranie informacji o pokrytym kodzie jest pamięciochłonne. W tym przypadku pomoże nam wywołanie Tester\CodeCoverage\Collector::flush() wewnątrz testu. Zapisze zebrane dane na dysk i zwolni pamięć. Jeśli zbieranie danych nie przebiega lub jest używany Xdebug, wywołanie nie ma żadnego efektu.

Przykładowy raport HTML z pokryciem kodu.

--coverage-src <path>

Użyjemy jednocześnie z opcją --coverage. <path> to ścieżka do kodów źródłowych, dla których raport jest generowany. Może być użyty wielokrotnie.

Własny php.ini

Tester uruchamia procesy PHP z parametrem -n, co oznacza, że żaden php.ini nie jest wczytywany. W UNIXie również te z /etc/php/conf.d/*.ini. To zapewnia jednakowe środowisko dla przebiegu testów, ale również wyłącza wszystkie rozszerzenia PHP normalnie wczytywane przez systemowe PHP.

Jeśli chcesz zachować wczytywanie systemowych plików php.ini, użyj parametru -C.

Jeśli potrzebujesz jakichś rozszerzeń lub specjalnych ustawień INI dla testów, zalecamy utworzenie własnego pliku php.ini, który będzie dystrybuowany z testami. Testera następnie uruchamiamy z parametrem -c, na przykład tester -c tests/php.ini tests, gdzie plik INI może wyglądać tak:

[PHP]

extension=php_pdo_mysql.dll
extension=php_pdo_pgsql.dll

memory_limit=512M

Uruchomienie Testera w UNIXie z systemowym php.ini, na przykład tester -c /etc/php/cli/php.ini nie wczyta pozostałych INI z /etc/php/conf.d/*.ini. To jest właściwość PHP, nie Testera.