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ętyF
– 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 ASCIIconsole-lines
: podobny do konsoli, ale wynik każdego testu jest wyświetlany w osobnym wierszu z większą ilością informacjitap
: format TAP odpowiedni do przetwarzania maszynowegojunit
: format JUnit XML, odpowiedni również do przetwarzania maszynowegolog
: Wyświetla postęp testowania. Wszystkie nieudane, pominięte, a także udane testynone
: 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:
- PCOV
- PHPDBG
- 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.