Exécution des tests

La partie la plus visible de Nette Tester est le lanceur de tests depuis la ligne de commande. Il est extraordinairement rapide et robuste, car il lance automatiquement tous les tests comme des processus distincts et ce, en parallèle dans plusieurs threads. Il sait aussi se lancer lui-même en mode ‘watch’.

Nous appelons le lanceur de tests depuis la ligne de commande. Comme paramètre, nous indiquons le répertoire contenant les tests. Pour le répertoire actuel, il suffit d'entrer un point :

vendor/bin/tester .

Le lanceur de tests parcourt le répertoire spécifié et tous les sous-répertoires et recherche les tests, qui sont les fichiers *.phpt et *Test.php. En même temps, il lit et évalue leurs annotations, pour savoir lesquels et comment les lancer.

Ensuite, il lance les tests. Pendant l'exécution des tests, il affiche en continu les résultats sur le terminal sous forme de caractères :

  • . – le test a réussi
  • s – le test a été sauté (skipped)
  • F – le test a échoué (failed)

La sortie peut ressembler par exemple à ceci :

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

Lors d'une exécution répétée, il exécute d'abord les tests qui ont échoué lors de l'exécution précédente, de sorte que vous savez immédiatement si vous avez réussi à corriger l'erreur.

Si aucun test n'échoue, le code de retour de Tester est zéro. Sinon, le code de retour est non nul.

Tester lance les processus PHP sans php.ini. Plus de détails dans la section php.ini personnalisé.

Paramètres de la ligne de commande

Nous obtenons un aperçu de toutes les options de la ligne de commande en lançant Tester sans paramètres, ou avec le paramètre -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>  (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>

Spécifie le binaire PHP qui sera utilisé pour exécuter les tests. Par défaut, c'est php.

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

-c <path>

Spécifie quel php.ini sera utilisé lors de l'exécution des tests. Par défaut, aucun php.ini n'est utilisé. Plus d'informations dans la section php.ini personnalisé.

-C

Le php.ini système sera utilisé. Sous UNIX, également tous les fichiers INI pertinents /etc/php/{sapi}/conf.d/*.ini. Plus d'informations dans la section php.ini personnalisé.

-d <key=value>

Définit la valeur de la directive de configuration PHP pour les tests. Le paramètre peut être utilisé plusieurs fois.

tester -d max_execution_time=20

-s

Affiche des informations sur les tests sautés.

--stop-on-fail

Tester arrête les tests au premier test échouant.

-j <num>

Spécifie combien de processus parallèles avec des tests seront lancés. La valeur par défaut est 8. Si nous voulons que tous les tests s'exécutent en série, nous utilisons la valeur 1.

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

Définit le format de sortie. Le format par défaut est pour la console. Vous pouvez spécifier un nom de fichier dans lequel la sortie sera écrite (par exemple -o junit:output.xml). L'option -o peut être répétée plusieurs fois pour générer plusieurs formats à la fois.

  • console : identique au format par défaut, mais dans ce cas, le logo ASCII n'est pas affiché
  • console-lines : similaire à console, mais le résultat de chaque test est indiqué sur une ligne distincte avec des informations supplémentaires
  • tap : format TAP adapté au traitement machine
  • junit : format XML JUnit, également adapté au traitement machine
  • log : Sorties du déroulement des tests. Tous les tests échoués, sautés et aussi réussis
  • none : rien n'est affiché

-w | --watch <path>

Après la fin des tests, Tester ne se termine pas, mais reste en cours d'exécution et surveille les fichiers PHP dans le répertoire spécifié. En cas de changement, il relance les tests. Le paramètre peut être utilisé plusieurs fois si nous voulons surveiller plusieurs répertoires.

Utile lors du refactoring d'une bibliothèque ou du débogage de tests.

tester --watch src tests

-i | --info

Affiche des informations sur l'environnement d'exécution des tests. Par exemple :

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 charge au démarrage le script PHP spécifié. Dans celui-ci, la variable Tester\Runner\Runner $runner est disponible. Supposons un fichier tests/runner-setup.php avec le contenu :

$runner->outputHandlers[] = new MyOutputHandler;

Nous lançons Tester :

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

--temp <path>

Définit le chemin vers le répertoire pour les fichiers temporaires de Tester. La valeur par défaut est renvoyée par sys_get_temp_dir(). Si la valeur par défaut n'est pas valide, vous serez averti.

Si nous ne sommes pas sûrs du répertoire utilisé, nous lançons Tester avec le paramètre --info.

--colors 1|0

Par défaut, Tester détecte un terminal couleur et colore sa sortie. Cette option supplante l'auto-détection. Globalement, nous pouvons définir la coloration avec la variable d'environnement système NETTE_TESTER_COLORS.

--coverage <path>

Tester génère un rapport avec un aperçu de la quantité de code source couverte par les tests. Cette option nécessite l'extension PHP Xdebug installée, ou PCOV, ou PHP 7 avec PHPDBG SAPI, qui est plus rapide. L'extension du fichier cible détermine son format. Soit HTML, soit Clover XML.

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

La priorité de sélection du mécanisme est la suivante :

  1. PCOV
  2. PHPDBG
  3. Xdebug

Lors de l'utilisation de PHPDBG, nous pouvons rencontrer un échec de test sur des tests volumineux en raison de l'épuisement de la mémoire. La collecte d'informations sur le code couvert est gourmande en mémoire. Dans ce cas, l'appel Tester\CodeCoverage\Collector::flush() à l'intérieur du test nous aide. Il écrit les données collectées sur le disque et libère la mémoire. Si la collecte de données n'a pas lieu, ou si Xdebug est utilisé, l'appel n'a aucun effet.

Exemple de rapport HTML avec la couverture de code.

--coverage-src <path>

À utiliser en même temps que l'option --coverage. <path> est le chemin vers les codes sources pour lesquels le rapport est généré. Peut être utilisé de manière répétée.

php.ini personnalisé

Tester lance les processus PHP avec le paramètre -n, ce qui signifie qu'aucun php.ini n'est chargé. Sous UNIX, même ceux de /etc/php/conf.d/*.ini. Cela garantit un environnement identique pour l'exécution des tests, mais désactive également toutes les extensions PHP normalement chargées par le PHP système.

Si vous souhaitez conserver le chargement des fichiers php.ini système, utilisez le paramètre -C.

Si vous avez besoin de certaines extensions ou de paramètres INI spéciaux pour les tests, nous vous recommandons de créer votre propre fichier php.ini, qui sera distribué avec les tests. Tester est ensuite lancé avec le paramètre -c, par exemple tester -c tests/php.ini tests, où le fichier INI peut ressembler à ceci :

[PHP]

extension=php_pdo_mysql.dll
extension=php_pdo_pgsql.dll

memory_limit=512M

Lancer Tester sous UNIX avec le php.ini système, par exemple tester -c /etc/php/cli/php.ini, ne chargera pas les autres INI de /etc/php/conf.d/*.ini. C'est une caractéristique de PHP, pas de Tester.