Démarrer avec Tester
Même les bons programmeurs font des erreurs. La différence entre un bon programmeur et un mauvais programmeur est que le bon programmeur ne le fera qu'une fois et le détectera la fois suivante à l'aide de tests automatisés.
- „Celui qui ne teste pas est condamné à répéter ses propres erreurs“. (sage proverbe)
- „Quand on se débarrasse d'une erreur, une autre apparaît“. (Loi de Murphy)
- „Chaque fois que vous êtes tenté d'imprimer une déclaration, écrivez-la plutôt comme un test.“ (Martin Fowler)
Avez-vous déjà écrit le code suivant en PHP ?
$obj = new MyClass;
$result = $obj->process($input);
var_dump($result);
Avez-vous déjà jeté le résultat d'un appel de fonction juste pour vérifier à l'œil qu'il renvoie ce qu'il doit renvoyer ? Vous le faites sûrement plusieurs fois par jour. La main sur le cœur, si tout fonctionne, supprimez-vous ce code en espérant que la classe ne sera pas cassée à l'avenir ? La loi de Murphy vous garantit le contraire :-)
En fait, c'est vous qui avez écrit le test. Il a besoin d'une légère modification pour ne pas nécessiter notre inspection, simplement pour être capable de se vérifier lui-même. Et si vous ne l'avez pas supprimé, nous pourrons l'exécuter à tout moment à l'avenir pour vérifier que tout fonctionne toujours comme il se doit. Il se peut que vous créiez un grand nombre de ces tests au fil du temps, il serait donc agréable que nous puissions les exécuter automatiquement.
Et Nette Tester aide exactement à cela.
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 standard qui peut être exécuté de manière autonome.
Ainsi, lorsque vous écrivez un test, vous pouvez simplement l'exécuter pour voir s'il y a une erreur de programmation. S'il fonctionne correctement. Dans le cas contraire, vous pouvez facilement parcourir le programme dans votre IDE et rechercher un bug. Vous pouvez même l'ouvrir dans un navigateur.
Et surtout, en l'exécutant, vous effectuerez le test. Vous saurez immédiatement s'il a réussi ou échoué. Comment ?
Montrons-nous ici. Écrivons un test trivial pour utiliser un tableau PHP et sauvegardons-le dans le fichier
ArrayTest.php
:
<?php
use Tester\Assert;
require __DIR__ . '/vendor/autoload.php'; # load Composer autoloader
Tester\Environment::setup(); # initialization of Nette Tester
$stack = [];
Assert::same(0, count($stack)); # we expect count() to return zero
$stack[] = 'foo';
Assert::same(1, count($stack)); # we expect count() to return one
Assert::contains('foo', $stack); # verify that the $stack contains the item 'foo'
Comme vous pouvez le voir, les méthodes d'assertion telles que Assert::same()
sont
utilisées pour affirmer qu'une valeur réelle correspond à une valeur attendue.
Le test est écrit, nous pouvons l'exécuter en ligne de commande. La première exécution révélera toute erreur de syntaxe, et si vous n'avez pas fait de faute de frappe, vous verrez :
$ php ArrayTest.php
OK
Essayez de changer l'instruction en Assert::contains('XXX', $stack);
dans le test et regardez 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 sur l'écriture dans le chapitre sur l'écriture de tests.
Installation et configuration requise
La version minimale de PHP requise par Tester est 7.1 (pour plus de détails, voir le tableau des versions de PHP prises en charge ). La méthode d'installation préférée est celle de Composer:
composer require --dev nette/tester
Essayez de lancer le Nette Tester à partir de la ligne de commande (sans aucun argument, il n'affichera qu'un résumé de l'aide) :
vendor/bin/tester
Exécution des tests
À mesure que notre application se développe, le nombre de tests augmente avec elle. Il ne serait pas pratique d'exécuter les tests un par un. C'est pourquoi le Testeur dispose d'un exécuteur de tests en masse, que nous invoquons depuis la ligne de commande. Le paramètre est le répertoire dans lequel se trouvent les tests. Le point indique le répertoire courant.
vendor/bin/tester .
Le programme d'exécution de Nette Tester recherche le répertoire spécifié et tous les sous-répertoires et recherche les
tests, qui sont les fichiers *.phpt
et *Test.php
. Il trouvera également notre test
ArrayTest.php
, car il correspond au masque.
Puis il commence les tests. Il exécute chaque test comme un nouveau processus PHP, de sorte qu'il est complètement isolé des autres. Il s'exécute en parallèle dans plusieurs threads, ce qui le rend extrêmement rapide. Il exécute d'abord les tests qui ont échoué lors de l'exécution précédente, ce qui vous permet de savoir immédiatement si vous avez corrigé l'erreur.
Pour chaque test effectué, le runner imprime un caractère pour indiquer la progression :
.
– test réussis
– le test a été ignoréF
– le test a échoué
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é ignoré.
Nous continuons dans le chapitre Exécution des tests.
Mode veille
Est-ce que vous refactorez le code ? Ou encore, vous développez selon la méthodologie TDD (Test Driven Development) ? Alors vous aimerez le mode veille. Le testeur surveille les codes sources et s'exécute lui-même en cas de modification.
Pendant le développement, vous avez un terminal dans le coin du moniteur, où la barre d'état verte s'allume sur vous, et quand elle devient soudainement rouge, vous savez que vous venez de faire quelque chose d'indésirable. C'est en fait un grand jeu où vous programmez et essayez de respecter la couleur.
Le mode veille est lancé à l'aide du paramètre –watch.
Rapports de CodeCoverage
Le testeur 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 au format Clover XML pour un traitement automatique ultérieur.
Voir l 'exemple de rapport HTML avec la couverture du code.
Versions PHP prises en charge
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 |
S'applique aux dernières versions des correctifs.
Jusqu'à la version 1.7, Tester supportait HHVM 3.3.0 ou plus récent (en utilisant
tester -p hhvm
). Le support a été abandonné depuis Tester 2.0. L'utilisation était simple :