Nette Documentation Preview

syntax
Démarrer avec Tester
********************

<div class=perex>

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)

</div>

Avez-vous déjà écrit le code suivant en PHP ?

```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 ? .[#toc-what-makes-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 .{file: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 |Assertions] 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 :

/--pre .[terminal]
$ php ArrayTest.php

<span style="color:#FFF; background-color:#090">OK</span>
\--

Essayez de changer l'instruction en `Assert::contains('XXX', $stack);` dans le test et regardez ce qui se passe lors de l'exécution :

/--pre .[terminal]
$ php ArrayTest.php

<span style="color: #FFF">Failed: </span><span style="color: #FF0">['foo']</span><span style="color: #FFF"> should contain </span><span style="color: #FF0">'XXX'</span>

<span style="color: #CCC">in </span><span style="color: #FFF">ArrayTest.php(17)</span><span style="color: #808080"> Assert::contains('XXX', $stack);</span>

<span style="color: #FFF; background-color: #900">FAILURE</span>
\--

Nous continuons sur l'écriture dans le chapitre sur l'[écriture de tests |Writing Tests].


Installation et configuration requise .[#toc-installation-and-requirements]
===========================================================================

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 |#supported PHP versions] ). La méthode d'installation préférée est celle de [Composer |best-practices:composer]:

/--pre .[terminal]
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) :

/--pre .[terminal]
vendor/bin/tester
\--


Exécution des tests .[#toc-running-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.

/--pre .[terminal]
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 :

- <code style="color: #CCC; background-color: #000">.</code> - test réussi
- <code style="color: #CCC; background-color: #000">s</code> - le test a été ignoré
- <code style="color: #FFF; background-color: #900">F</code> - le test a échoué

La sortie peut ressembler à ceci :

/--pre .[terminal]
 _____ ___  ___ _____ ___  ___
|_   _/ __)( __/_   _/ __)| _ )
  |_| \___ /___) |_| \___ |_|_\  v2.5.2

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

........s................<span style="color: #FFF; background-color: #900">F</span>.........

<span style="color: #F00">-- FAILED: greeting.phpt</span>
<span style="color: #CCC">   </span><span style="color: #FFF">Failed: </span><span style="color: #FF0">'Hello John'</span><span style="color: #FFF"> should be</span>
<span style="color: #FFF">       ... </span><span style="color: #FF0">'Hello Peter'</span>

<span style="color: #CCC">   in </span><span style="color: #FFF">greeting.phpt(19)</span><span style="color: #808080"> Assert::same('Hello Peter', $o->say('John'));</span>

<span style="color: #FFF; background-color: #900">FAILURES! (35 tests, 1 failures, 1 skipped, 1.7 seconds)</span>
\--

35 tests ont été exécutés, un a échoué, un a été ignoré.

Nous continuons dans le chapitre [Exécution des tests |Running tests].


Mode veille .[#toc-watch-mode]
==============================

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 |running-tests#w-watch-path].


Rapports de CodeCoverage .[#toc-codecoverage-reports]
=====================================================

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":https://files.nette.org/tester/coverage.html avec la couverture du code.


Versions PHP prises en charge .[#toc-supported-php-versions]
============================================================

| 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 |https://hhvm.com] 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 :

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éussi
  • s – 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 :