Lorsque j'écris mes modules, j'essaie de leur fournir des tests unitaires pour les parties les plus critiques de l'application. Cependant, il existe actuellement (Magento 2.1.3) plusieurs façons d'écrire des tests unitaires:
Différentes façons de tester
- Intégrez-le avec
bin/magento dev:tests:run unit
et exécutez-le au-dessus des paramètres phpunit par défaut fournis avec Magento. - Écrivez-les séparément, exécutez-les avec
vendor/bin/phpunit app/code/Vendor/Module/Test/Unit
et moquez tout ce qui est Magento. - Écrivez-les séparément, simulez tout et utilisez une version globale de PHPUnit.
- Écrivez-les séparément, exécutez-les avec
vendor/bin/phpunit
, mais utilisez toujours\Magento\Framework\TestFramework\Unit\Helper\ObjectManager
.
Magento 2 et PHPUnit
En plus de cela, Magento 2 est livré avec PHPUnit 4.1.0, qui n'est pas compatible PHP7. Les natifs avec indication de type (comme string
et `int) et la déclaration des types de retour dans vos signatures génèreront des erreurs. Par exemple, une interface / classe avec une signature de méthode comme celle-ci:
public function foo(string $bar) : bool;
... ne pourra pas être raillé par PHPUnit 4.1.0. :-(
Ma situation actuelle
C'est à cause de cela que j'écris maintenant principalement mes tests unitaires de la troisième manière (en appelant une version PHPUnit globale du système).
Dans ma configuration, j'ai PHPUnit 5.6 installé à l'échelle mondiale, donc je peux résoudre l'écriture de code PHP7 approprié, mais je dois faire quelques ajustements. Par exemple:
phpunit.xml
doit ressembler à ceci pour que je puisse utiliser l'autochargeur du compositeur:
<?xml version="1.0"?>
<phpunit bootstrap="../../../../../../vendor/autoload.php"
colors="true">
<testsuites>
<testsuite name="Testsuite">
<directory>.</directory>
</testsuite>
</testsuites>
</phpunit>
... et dans toutes mes setUp()
méthodes, j'ai la vérification suivante pour pouvoir écrire mes tests avec la compatibilité ascendante:
// Only allow PHPUnit 5.x:
if (version_compare(\PHPUnit_Runner_Version::id(), '5', '<')) {
$this->markTestSkipped();
}
De cette façon, lorsque mes tests sont exécutés par PHPUnit intégré à Magentos, cela ne génère pas d'erreur.
Ma question
Voici donc ma question: est-ce une façon «saine» d'écrire des tests unitaires? Parce qu'il ne me semble pas juste que Magento soit livré avec tout un tas d'outils pour aider aux tests et je ne peux pas les utiliser parce que j'utilise PHP7. Je sais qu'il existe des tickets sur GitHub qui résolvent ce problème, mais je me demande comment la communauté écrit actuellement ses tests.
Existe-t-il un moyen d'écrire des tests unitaires dans Magento 2 afin que je n'aie pas à «rétrograder» mon code et que je puisse toujours utiliser les assistants intégrés de Magentos pour se moquer de tout ce que le gestionnaire d'objets touche? Ou est-ce même une mauvaise pratique d'utiliser le gestionnaire d'objets même dans vos tests unitaires?
Il me manque beaucoup de conseils / d'exemples sur la manière appropriée de tester à l'unité vos propres modules personnalisés.