Uruchamianie testów

Najbardziej widoczną częścią Nette Testera jest runner testów z wiersza poleceń. Jest niezwykle szybki i solidny, bo automatycznie uruchamia wszystkie testy jako osobne procesy równolegle w wielu wątkach. Potrafi też uruchamiać się w trybie watch.

Runner testów wywołujemy z wiersza poleceń. Jako parametr przekazujemy katalog zawierający testy. Dla bieżącego katalogu wystarczy podać kropkę:

vendor/bin/tester .

Runner testów przeszukuje podany katalog i wszystkie jego podkatalogi w poszukiwaniu testów, czyli plików kończących się na *.phpt albo *Test.php. Odczytuje też i ewaluuje ich adnotacje, żeby ustalić, które testy uruchomić i jak.

Każdy plik testu działa we własnym, odizolowanym procesie PHP, a runner wykonuje kilka z nich naraz, więc jednostką równoległości jest plik. Kod w ramach jednego pliku działa więc sekwencyjnie. TestCase żyje w jednym pliku, więc domyślnie jego metody wykonują się jedna po drugiej w jednym procesie; oznacz go adnotacją @testCase, żeby runner uruchamiał każdą metodę testową jako osobny, równoległy proces.

Następnie wykonuje testy. W trakcie wykonywania wypisuje do terminala znaki wskazujące postęp:

  • . – test przeszedł
  • s – test został pominięty
  • F – test nie przeszedł

Wyjście może wyglądać tak:

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

PHP 8.5.2 (cli) | php | 8 threads

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

OK (35 tests, 1 skipped, 1.7 seconds)

Przy ponownym uruchomieniu najpierw wykonuje testy, które nie przeszły przy poprzednim uruchomieniu, więc od razu wiesz, czy naprawiłeś błąd.

Kod wyjścia Testera to zero, jeśli żaden test nie zawiódł. W przeciwnym razie jest niezerowy.

Opcje wiersza poleceń

Przegląd opcji wiersza poleceń uzyskasz, uruchamiając Testera bez parametrów albo z opcją -h:

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

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

Options:
    -p <path>                    Specify PHP interpreter to run (default: php).
    -c <path>                    Use custom php.ini, ignore system configuration.
    -C                           With -c, include system configuration as well.
    -d <key=value>...            Define INI entry 'key' with value 'value'.
    -s                           Show information about skipped tests.
    --stop-on-fail               Stop execution upon the first failure.
    -j <num>                     Run <num> jobs in parallel (default: 8).
    -o <console|console-lines|tap|junit|log|none>  (e.g. -o junit:output.xml)
                                 Specify one or more output formats with optional file name.
    -w | --watch <path>          Watch directory.
    -i | --info                  Show tests environment info and exit.
    --setup <path>               Script for runner setup.
    --temp <path>                Path to temporary directory. Default by sys_get_temp_dir().
    --colors [1|0]               Enable or disable colors.
    --coverage <path>            Generate code coverage report to file.
    --coverage-src <path>        Path to source code.
    -h | --help                  This help.

-p <path>

Podaje binarkę PHP, która zostanie użyta do uruchamiania testów. Domyślnie jest to php.

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

-c <path>

Używa własnego pliku php.ini i ignoruje konfigurację systemową. Przydaje się to do uruchamiania testów z konkretnymi ustawieniami. Więcej informacji w Własne php.ini.

-C

Użyte razem z -c włącza także konfigurację systemową (nie ignoruje jej). Patrz sekcja Własne php.ini.

-d <key=value>

Ustawia testom wartość dyrektywy konfiguracyjnej PHP. Parametru tego można użyć wielokrotnie.

tester -d max_execution_time=20

-s

Wyświetla informacje o pominiętych testach.

--stop-on-fail

Tester zatrzymuje testowanie przy pierwszym nieudanym teście.

-j <num>

Podaje liczbę równoległych procesów, w których uruchamiane są testy. Wartość domyślna to 8. Żeby uruchamiać testy sekwencyjnie, użyj wartości 1.

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

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

  • console: to samo co format domyślny, ale w tym przypadku nie jest wypisywane logo ASCII
  • console-lines: podobne do console, ale wynik każdego testu wypisywany jest w osobnej linii z dodatkowymi informacjami
  • tap: format TAP odpowiedni do przetwarzania maszynowego
  • junit: format JUnit XML, również odpowiedni do przetwarzania maszynowego
  • log: wypisuje przebieg testowania. Zawiera wszystkie nieudane, pominięte, a także udane testy
  • none: nic nie jest wypisywane

-w | --watch <path>

Po zakończeniu testów Tester nie kończy działania, tylko dalej działa i obserwuje pliki PHP w podanym katalogu. Gdy plik się zmieni, uruchamia testy ponownie. Parametru tego można użyć wielokrotnie, jeśli chcesz obserwować wiele katalogów.

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

tester --watch src tests

-i | --info

Pokazuje informacje o środowisku uruchomieniowym 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 wczytuje przy starcie podany skrypt PHP. W skrypcie tym dostępna jest zmienna Tester\Runner\Runner $runner. Załóżmy plik tests/runner-setup.php o następującej treści:

$runner->outputHandlers[] = new MyOutputHandler;

Uruchamiamy Testera przez:

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

--temp <path>

Ustawia ścieżkę do katalogu na pliki tymczasowe Testera. Wartość domyślną zwraca sys_get_temp_dir(). Jeśli wartość domyślna nie jest poprawna, zostaniesz o tym powiadomiony.

Jeśli nie masz pewności, który katalog jest używany, uruchom Testera z parametrem --info.

--colors 1|0

Domyślnie Tester wykrywa, czy terminal wspiera kolory, i odpowiednio koloruje swoje wyjście. Ta opcja nadpisuje autodetekcję. Kolorowanie możesz ustawić globalnie zmienną środowiskową NETTE_TESTER_COLORS.

--coverage <path>

Tester generuje raport pokazujący, jak dużą część kodu źródłowego pokrywają testy. Ta opcja wymaga zainstalowanego rozszerzenia PHP Xdebug albo PCOV, albo SAPI PHPDBG, który jest szybszy. Rozszerzenie pliku docelowego określa jego format: HTML albo Clover XML.

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

Priorytet wyboru silnika pokrycia jest następujący:

  1. PCOV
  2. PHPDBG
  3. Xdebug

Przy używaniu PHPDBG obszerne testy mogą zawieść z powodu wyczerpania pamięci. Zbieranie informacji o pokryciu kodu jest pamięciożerne. W takim przypadku może pomóc wywołanie Tester\CodeCoverage\Collector::flush() wewnątrz Twojego testu. Zapisuje ono zebrane dane na dysk i zwalnia pamięć. Wywołanie ma efekt tylko przy silniku PHPDBG; przy PCOV, Xdebug albo gdy zbieranie danych nie działa, nie robi nic.

Zobacz `przykładowy raport HTML z pokryciem kodu.

--coverage-src <path>

Używane razem z opcją --coverage. <path> to ścieżka do kodu źródłowego, dla którego generowany jest raport. Można użyć wielokrotnie.

Własne php.ini

Dla swoich testów możesz użyć własnego pliku php.ini. Jeśli potrzebujesz konkretnych rozszerzeń albo specjalnych ustawień INI, zalecamy utworzenie własnego pliku php.ini i dystrybuowanie go razem z testami. Następnie uruchamiaj Testera z opcją -c, na przykład tester -c tests/php.ini tests. Plik INI może wyglądać tak:

[PHP]

extension=php_pdo_mysql.dll
extension=php_pdo_pgsql.dll

memory_limit=512M

Przy użyciu -c Tester ignoruje konfigurację systemową (uruchamia PHP z flagą -n). Jeśli chcesz włączyć także konfigurację systemową, dodaj opcję -C: tester -c tests/php.ini -C tests. Nawet przy połączeniu -c i -C pozostałe pliki INI z /etc/php/conf.d/*.ini nie są w UNIX-ie wczytywane. To zachowanie PHP, nie specyfika Testera.

Przed wersją 2.6 Tester bez -c uruchamiał PHP z flagą -n, czyli bez php.ini; opcja -C to wyłączała. Od wersji 2.6 systemowe php.ini jest wczytywane domyślnie. Zachowanie przy użyciu -c pozostaje bez zmian.