« Introduction au test logiciel/Tests unitaires/PHPUnit » : différence entre les versions

Contenu supprimé Contenu ajouté
DannyS712 (discussion | contributions)
m <source> -> <syntaxhighlight> (phab:T237267)
Ligne 5 :
== Installation ==
=== Via composer ===
<sourcesyntaxhighlight lang=bash>
composer require --dev phpunit/phpunit ^8
</syntaxhighlight>
</source>
 
=== Via wget ===
Ligne 13 :
 
==== Unix-like ====
<sourcesyntaxhighlight lang=bash>
wget https://phar.phpunit.de/phpunit-8.phar
mv phpunit.phar /usr/local/bin/phpunit
chmod +x phpunit.phar
</syntaxhighlight>
</source>
 
==== Windows ====
Ligne 27 :
=== Test ===
Test de l'installation :
<sourcesyntaxhighlight lang=bash>
phpunit --version
</syntaxhighlight>
</source>
 
== Utilisation ==
Il faut indiquer au programme les dossiers contenant des tests dans le fichier phpunit.xml.dist. Exemple sur Symfony<ref>https://symfony.com/doc/current/testing.html</ref> :
<sourcesyntaxhighlight lang=xml>
<?xml version="1.0" encoding="UTF-8"?>
 
Ligne 69 :
 
</phpunit>
</syntaxhighlight>
</source>
 
Ensuite, pour tester tous les fichiers du dossier /test et ignorer ceux de /src, il suffit de lancer :
<sourcesyntaxhighlight lang=bash>
./bin/phpunit
</syntaxhighlight>
</source>
 
Si les tests sont longs et qu'on ne travaille que sur une seule classe ou une seule méthode, on peut demander à ne tester qu'elle en précisant son nom (ce qui évite d'afficher des dumps que l'on ne souhaite pas voir lors des autres tests) :
<sourcesyntaxhighlight lang=bash>
./bin/phpunit --filter=MaClasseTest
./bin/phpunit --filter=MaMethodeTest
</syntaxhighlight>
</source>
 
== Écriture des tests ==
 
<sourcesyntaxhighlight lang=php>
use PHPUnit\Framework\MockObject\MockObject;
use PHPUnit\Framework\TestCase;
Ligne 110 :
}
}
</syntaxhighlight>
</source>
 
La classe de test PHPUnit propose des dizaines d'assertions différentes.
Ligne 120 :
Par exemple, pour simuler le résultat de deux classes imbriquées (en appelant la méthode d'une méthode), on leur crée une méthode de test chacune :
 
<sourcesyntaxhighlight lang=php>
public function mainTest()
{
Ligne 144 :
return $monMock;
}
</syntaxhighlight>
</source>
 
{{attention|Pour qu'une méthode de mock réalise un "set" quand elle est appelée, il ne faut pas le faire directement dans le <code>willReturn</code>, auquel cas il s'effectue lors de sa définition, mais dans un callback. Ex :
<sourcesyntaxhighlight lang=php>
$monMock->method('MaMéthode3')
->will($this->returnCallback(function($item) use ($quantity) {
Ligne 153 :
}))
;
</syntaxhighlight>
</source>
}}
 
Ligne 159 :
==== willThrowException() ====
Pour qu'un mock simule une erreur. Ex :
<sourcesyntaxhighlight lang=php>
$monMock->method('MaMéthode3')->willThrowException(new Exception());
</syntaxhighlight>
</source>
 
==== expects() ====
Ligne 174 :
 
Exemple :
<sourcesyntaxhighlight lang=php>
$this->enumProvider->method('getEnumFromVariable')
->will($this->onConsecutiveCalls(
Ligne 181 :
));
;
</syntaxhighlight>
</source>
 
==== with() ====
Cette méthode permet de définir les paramètres avec lesquels doit être lancé une méthode mock. Ex :
<sourcesyntaxhighlight lang=php>
$this->enumProvider->method('getEnumFromVariable')
->with($this->equalTo('variable 1'))
</syntaxhighlight>
</source>
 
==== disableOriginalConstructor() ====
Ligne 195 :
==== expectException() ====
S'utilise quand le test unitaire doit provoquer une exception dans le code testé (ex : s'il contient un ''throw'').
<sourcesyntaxhighlight lang=php>
$this->expectException(Exception::class);
$monObjetTesté->method('MaMéthodeQuiPète');
</syntaxhighlight>
</source>
 
Si au contraire on veut vérifier que le code testé ne renvoie pas d'exception, on peut le lancer suivi d'une incrémentation des assertions :
<sourcesyntaxhighlight lang=php>
$monObjetTesté->method('MaMéthodeSansErreur');
$this->addToAssertionCount(1);
</syntaxhighlight>
</source>
 
== Annotations ==
Ligne 221 :
Pour récupérer une variable d'environnement ou un service dans un test unitaire Symfony, il faut passer par <code>setUpBeforeClass()</code> pour booter le kernel du framework :
 
<sourcesyntaxhighlight lang=php>
/** @var string */
private static $maVariableYaml;
Ligne 235 :
self::$translator = $kernel->getContainer()->get('translator');
}
</syntaxhighlight>
</source>
 
== Références ==