Przeprowadzanie testów

Najbardziej widoczną częścią Nette Tester jest uruchamianie testów z linii poleceń. Jest on niezwykle szybki i wytrzymały, ponieważ automatycznie uruchamia wszystkie testy jako osobne procesy równolegle w wielu wątkach. Może też uruchamiać się sam w tzw. trybie watch.

Test runner Nette Tester jest wywoływany z linii poleceń. Jako parametr przekazujemy katalog z testami. Dla katalogu bieżącego wystarczy wpisać kropkę:

vendor/bin/tester .

Po wywołaniu, test runner skanuje podany katalog i wszystkie podkatalogi i szuka testów, którymi są pliki *.phpt i *Test.php. Czyta również i ocenia ich adnotacje, aby wiedzieć, które z nich i jak uruchomić.

Następnie wykonuje testy. Dla każdego wykonanego testu, runner drukuje jeden znak, aby wskazać postęp:

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

Dane wyjściowe mogą wyglądać jak:

 _____ ___  ___ _____ ___  ___
|_   _/ __)( __/_   _/ __)| _ )
  |_| \___ /___) |_| \___ |_|_\  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)

Kiedy uruchomisz go ponownie, najpierw uruchamia on testy, które nie powiodły się podczas poprzedniego uruchomienia, więc od razu będziesz wiedział, czy naprawiłeś błąd.

Kod wyjścia testera jest zerowy, jeśli żaden z nich się nie powiódł. W przeciwnym razie niezerowy.

Tester uruchamia procesy PHP bez php.ini. Więcej szczegółów w sekcji Własny php.ini.

Opcje wiersza poleceń

Przegląd opcji wiersza poleceń uzyskujemy uruchamiając Tester bez parametrów lub z opcją -h:

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

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

Options:
    -p <path>                    Specify PHP interpreter to run (default: php).
    -c <path>                    Look for php.ini file (or look in directory) <path>.
    -C                           Use system-wide php.ini.
    -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> (np. -o junit:output.xml)
                                 Określa jeden lub więcej formatów wyjściowych z opcjonalną nazwą pliku.
    -w | --watch <path>          Watch directory.
    -i | --info                  Show tests environment info and exit.
    --setup <path>               Script for runner setup.
    --temp <path>                Ścieżka do katalogu tymczasowego. Domyślna przez 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>

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

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

-c <path>

Określa, która strona php.ini będzie używana podczas uruchamiania testów. Domyślnie, nie jest używany żaden php.ini. Zobacz Własne php.ini, aby uzyskać więcej informacji.

-C

Używany jest ogólnosystemowy php.ini. Czyli na platformie UNIX wszystkie pliki /etc/php/{sapi}/conf.d/*.ini również. Patrz rozdział 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

Zostanie wyświetlona informacja o pominiętych testach.

--stop-on-fail

Tester zatrzymuje testowanie po pierwszym nieudanym teście.

-j <num>

Testy są uruchamiane w <num> równoległych procesach. Domyślna wartość to 8. Jeśli chcemy uruchamiać testy szeregowo, używamy wartości 1.

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

Format wyjścia. Domyślnie jest to format konsolowy. Można określić nazwę pliku, do którego zostaną zapisane dane wyjściowe (np. -o junit:output.xml). Opcja -o może być powtarzana wielokrotnie w celu wygenerowania wielu formatów jednocześnie.

  • console: taki sam jak domyślny, ale w tym przypadku nie jest wypisywane logo ASCII
  • console-lines: podobny do konsoli, ale wynik każdego testu jest wyświetlany w osobnym wierszu z większą ilością informacji
  • tap: format TAP odpowiedni do przetwarzania maszynowego
  • junit: format JUnit XML, odpowiedni również do przetwarzania maszynowego
  • log: Wyświetla postęp testowania. Wszystkie nieudane, pominięte, a także udane testy
  • none: nic nie jest drukowane

-w | --watch <path>

Tester nie kończy pracy po zakończeniu testów, ale cały czas uruchamia i obserwuje pliki PHP w danym katalogu. W przypadku zmiany, uruchamia testy ponownie. Parametr może być użyty wielokrotnie, jeśli chcemy monitorować wiele katalogów.

Jest to przydatne podczas refaktoryzacji biblioteki lub debugowania testów.

tester --watch src tests

-i | --info

Pokazuje informacje o środowisku uruchomionego testu. 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 ładuje podany skrypt PHP. Dostępna jest w nim zmienna Tester\Runner\Runner $runner. Załóżmy, że plik tests/runner-setup.php:

$runner->outputHandlers[] = new MyOutputHandler;

i uruchamiamy Tester:

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

--temp <path>

Ustawia ścieżkę do katalogu dla plików tymczasowych Testera. Domyślna wartość jest zwracana przez sys_get_temp_dir(). Gdy wartość domyślna nie jest prawidłowa, zostaniesz o tym poinformowany.

Jeśli nie jesteśmy pewni, który katalog jest używany, możemy uruchomić Tester z parametrem --info.

--colors 1|0

Tester domyślnie wykrywa terminal obsługujący kolory i koloruje swoje wyjście. Ta opcja jest nad autodetekcją. Możemy ustawić kolorowanie globalnie przez systemową zmienną środowiskową NETTE_TESTER_COLORS.

--coverage <path>

Tester wygeneruje raport z przeglądem tego, jak bardzo kod źródłowy jest pokryty przez testy. Opcja ta wymaga włączonego rozszerzenia PHP Xdebug lub PCOV, albo PHP 7 z PHPDBG SAPI, które jest szybsze. Rozszerzenie pliku docelowego określa format zawartości. HTML lub Clover XML.

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

Priorytet wyboru mechanizmu zbierania jest następujący:

  1. PCOV
  2. PHPDBG
  3. Xdebug

Rozległe testy mogą się nie powieść podczas uruchamiania przez PHPDBG z powodu wyczerpania pamięci. Zbieranie danych o pokryciu jest operacją zużywającą pamięć. W takim przypadku, wywołanie Tester\CodeCoverage\Collector::flush() wewnątrz testu może pomóc. Spłucze ona zebrane dane do pliku i zwolni pamięć. Jeśli zbieranie danych nie jest w toku lub używany jest Xdebug, wywołanie nie ma żadnego efektu.

Przykład raportu HTML z pokryciem kodu.

--coverage-src <path>

Używamy go jednocześnie z opcją --coverage. Opcja <path> jest ścieżką do kodu źródłowego, dla którego generujemy raport. Może być używana wielokrotnie.

Własny php.ini

Tester uruchamia procesy PHP z opcją -n, co oznacza, że nie jest ładowany żaden php.ini (nawet ten z /etc/php/conf.d/*.ini w UNIX). Zapewnia to to samo środowisko dla uruchamianych testów, ale też dezaktywuje wszystkie zewnętrzne rozszerzenia PHP powszechnie ładowane przez systemowe PHP.

Jeśli chcesz zachować konfigurację systemową, użyj parametru -C.

Jeśli potrzebujesz jakichś rozszerzeń lub specjalnych ustawień INI, zalecamy stworzenie własnego pliku php.ini i rozesłanie go pomiędzy testami. Następnie uruchamiamy Tester z opcją -c, np. tester -c tests/php.ini. Plik INI może wyglądać tak:

[PHP]

extension=php_pdo_mysql.dll
extension=php_pdo_pgsql.dll

memory_limit=512M

Uruchomienie Testera z systemem php.ini w systemie UNIX, np. tester -c /etc/php/cgi/php.ini, nie wczytuje innych INI z /etc/php/conf.d/*.ini. To jest zachowanie PHP, a nie Testera.