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 :-)

En fait, 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 se vérifie 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 vous aide.

Qu'est-ce qui rend Tester unique ?

L'écriture de tests pour Nette Tester est unique en ce que chaque test est un script PHP ordinaire qui peut être exécuté indépendamment.

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 et chercher l'erreur. Vous pouvez même l'ouvrir dans un navigateur.

Et surtout – en l'exécutant, vous effectuez 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 nous 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 changer 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

Nous continuons à écrire sur l'écriture dans 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 podporované verze PHP). 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

Au fur et à mesure que l'application grandit, le nombre de tests augmente avec elle. Il ne serait pas pratique d'exécuter les tests un par un. C'est pourquoi Tester dispose d'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 masque.

Ensuite, il lance 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 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 à 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, un a échoué, un 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. Tester y surveille les codes sources et se lance lui-même en cas de changement.

Pendant le développement, vous avez donc dans le coin de votre moniteur un terminal où une barre d'état verte brille sur vous, 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 génial, où vous programmez et essayez de garder la couleur.

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

Rapports CodeCoverage

Tester peut générer des rapports avec 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.

Regardez 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 de patch.

Tester jusqu'à la version 1.7 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.