Commencer avec Nette Tester

Même les bons programmeurs font des erreurs. La différence entre un bon et un mauvais programmeur est que le bon ne la fait qu'une fois et la prochaine fois, il la détecte à l'aide de tests automatisés.

  • “Celui qui ne teste pas est condamné à répéter ses erreurs.” (proverbe)
  • “Dès qu'on se débarrasse d'une erreur, une autre apparaît.” (Loi de Murphy)
  • “Chaque fois que vous avez envie d'afficher une variable à l'écran, écrivez plutôt un test.” (Martin Fowler)

Avez-vous déjà écrit un code similaire en PHP ?

$obj = new MyClass;
$result = $obj->process($input);

var_dump($result);

C'est-à-dire, avez-vous affiché le résultat de l'appel de fonction juste pour vérifier visuellement s'il renvoie ce qu'il devrait ? Vous le faites certainement plusieurs fois par jour. Main sur le cœur : dans le cas où tout fonctionne correctement, supprimez-vous ce code ? Vous attendez-vous à ce que la classe ne se casse pas à l'avenir ? Les lois de Murphy garantissent le contraire :-)

Fondamentalement, vous avez écrit un test. Il suffit de le modifier légèrement pour qu'il ne nécessite pas de contrôle visuel, mais qu'il puisse se vérifier lui-même. Et si vous ne supprimez pas le test, vous pouvez l'exécuter à tout moment à l'avenir et vérifier que tout fonctionne toujours comme prévu. Avec le temps, vous créerez un grand nombre de ces tests, il serait donc utile de les exécuter automatiquement.

Et c'est précisément là que Nette Tester intervient.

Qu'est-ce qui rend Tester unique ?

L'écriture de tests pour Nette Tester est unique en ce sens que chaque test est un script PHP ordinaire qui peut être exécuté de manière autonome.

Ainsi, lorsque vous écrivez un test, vous pouvez simplement l'exécuter et vérifier s'il contient, par exemple, une erreur de programmation. S'il fonctionne correctement. Sinon, vous pouvez facilement le déboguer pas à pas dans votre IDE pour rechercher l'erreur. Vous pouvez même l'ouvrir dans un navigateur.

Et surtout, en l'exécutant, vous réalisez le test. Vous savez immédiatement s'il a réussi ou échoué. Comment ? Montrons-le. Écrivons un test trivial de manipulation de tableau PHP et enregistrons-le dans le fichier ArrayTest.php :

<?php
use Tester\Assert;

require __DIR__ . '/vendor/autoload.php';  # chargement de l'autoloader Composer
Tester\Environment::setup();               # initialisation de Nette Tester

$stack = [];
Assert::same(0, count($stack));   # nous attendons que count() renvoie zéro

$stack[] = 'foo';
Assert::same(1, count($stack));   # nous attendons que count() renvoie un
Assert::contains('foo', $stack);  # nous vérifions que $stack contient l'élément 'foo'

Comme vous pouvez le voir, les soi-disant méthodes d'assertion comme Assert::same() sont utilisées pour confirmer qu'une valeur réelle correspond à une valeur attendue.

Le test est écrit, et nous pouvons l'exécuter depuis la ligne de commande. La première exécution révélera d'éventuelles erreurs de syntaxe et si vous n'avez fait aucune faute de frappe, il s'affichera :

$ php ArrayTest.php

OK

Essayez de modifier l'assertion dans le test en une affirmation fausse Assert::contains('XXX', $stack); et observez ce qui se passe lors de l'exécution :

$ php ArrayTest.php

Failed: ['foo'] should contain 'XXX'

in ArrayTest.php(17) Assert::contains('XXX', $stack);

FAILURE

Pour en savoir plus sur l'écriture des tests, consultez le chapitre Écriture des tests.

Installation et prérequis

La version minimale de PHP requise par Tester est 7.1 (détaillée dans le tableau versions PHP supportées). La méthode d'installation préférée est via Composer :

composer require --dev nette/tester

Essayez d'exécuter Nette Tester depuis la ligne de commande (sans paramètres, il affiche simplement l'aide) :

vendor/bin/tester

Exécution des tests

À mesure que l'application grandit, le nombre de tests augmente également. Il ne serait pas pratique d'exécuter les tests un par un. C'est pourquoi Tester fournit un lanceur de tests en masse, que nous appelons depuis la ligne de commande. Comme paramètre, nous indiquons le répertoire dans lequel se trouvent les tests. Le point signifie le répertoire actuel.

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. Il trouve ainsi également notre test ArrayTest.php, car il correspond au pattern.

Ensuite, il démarre les tests. Chaque test est exécuté comme un nouveau processus PHP, il se déroule donc de manière totalement isolée des autres. Il les exécute en parallèle dans plusieurs threads et est donc extrêmement rapide. Et 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.

Pendant l'exécution des tests, Tester affiche continuellement 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 à ceci :

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

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

........s................F.........

-- FAILED: greeting.phpt
   Failed: 'Hello John' should be
       ... 'Hello Peter'

   in greeting.phpt(19) Assert::same('Hello Peter', $o->say('John'));

FAILURES! (35 tests, 1 failures, 1 skipped, 1.7 seconds)

35 tests ont été exécutés, 1 a échoué, 1 a été sauté.

Nous continuons ensuite dans le chapitre Exécution des tests.

Mode Watch

Vous refactorisez du code ? Ou développez-vous même selon la méthodologie TDD (Test Driven Development) ? Alors vous aimerez le mode watch. Dans ce mode, Tester surveille les fichiers sources et se lance automatiquement en cas de modification.

Pendant le développement, vous avez donc dans un coin de votre moniteur un terminal affichant une barre d'état verte, et quand elle passe soudainement au rouge, vous savez que vous venez de faire quelque chose pas tout à fait bien. C'est en fait un jeu amusant où vous programmez en essayant de maintenir la couleur verte.

Le mode Watch est lancé avec le paramètre –watch.

Rapports CodeCoverage

Tester peut générer des rapports donnant un aperçu de la quantité de code source couverte par les tests. Le rapport peut être soit au format HTML lisible par l'homme, soit en XML Clover pour un traitement machine ultérieur.

Consultez l'exemple de rapport HTML avec la couverture de code.

Versions PHP supportées

version compatible avec PHP
Tester 2.5 PHP 8.0 – 8.3
Tester 2.4 PHP 7.2 – 8.2
Tester 2.3 PHP 7.1 – 8.0
Tester 2.1 – 2.2 PHP 7.1 – 7.3
Tester 2.0 PHP 5.6 – 7.3
Tester 1.7 PHP 5.3 – 7.3 + HHVM 3.3+
Tester 1.6 PHP 5.3 – 7.0 + HHVM
Tester 1.3 – 1.5 PHP 5.3 – 5.6 + HHVM
Tester 0.9 – 1.2 PHP 5.3 – 5.6

Valable pour la dernière version patch.

Jusqu'à la version 1.7, Tester supportait également HHVM 3.3.0 ou supérieur (via tester -p hhvm). Le support a été interrompu à partir de la version Tester 2.0.