Tout mot réel exemple de la manière setUp() et tearDown() doit être utilisé dans PHPUnit?
Méthodes setUp()
et tearDown()
sont appelées avant et après chaque test. Mais vraiment, est-il réellement des mots sur pourquoi j'ai besoin de cela?
Inspecter d'autres personnes de tests, j'ai toujours de voir quelque chose comme:
public function setUp()
{
$this->testsub = new TestSubject();
}
public function tearDown()
{
unset($this->testsub);
}
public function testSomething()
{
$this->assertSame('foo', $this->testsub->getFoo());
}
Bien sûr, il n'y a pratiquement pas de différence entre ce chemin et la "vieille" variable locale manière.
- La différence, c'est que vous avez seulement besoin de mettre le code à la fois, peu importe combien d'essais il y a dans votre classe de test
- alors... juste lors de la création du sujet de test nécessite beaucoup de lignes, par exemple?
- Un bon exemple serait la configuration d'une table de base de données et de le détruire à nouveau lors de la finition du test.
- Gremo -- l'installation et le démontage sont exécutés pour chaque méthode de test de la classe. Donc, si vous modifiez les variables de l'objet, vous voulez une nouvelle objet sur votre prochain test
- - Je l'utiliser dans des scénarios de vie réelle sur 30 à 50 classes de test
Vous devez vous connecter pour publier un commentaire.
Si vous n'chaque méthode de test individuellement, votre code de test permettra de partager un grand nombre de lignes qu'il suffit de créer l'objet à tester. Ce code partagé peut (mais ne DOIT) aller dans la méthode de configuration.
Tout ce qui doit être fait pour créer de l'objet à être testé puis aussi va dans la méthode de configuration, par exemple créer des objets fantaisie qui sont injectés dans le constructeur de l'objet testé.
Rien de ce qui doit être déchiré vers le bas parce que l'appel suivant à l'installation d'initialiser les variables de membre de classe avec un nouvel ensemble d'objets.
La seule chose qui a besoin de la mise à nu est si votre test laisse quelque chose derrière en permanence, comme les fichiers qui l'a créé, ou des entrées de base de données. Il n'est vraiment pas une très bonne idée d'écrire des tests qui font de telles choses, mais à un certain point, vous ne pouvez pas abstraite et plus avoir à toucher à des trucs comme le disque dur, base de données ou du réseau réel.
Il y a donc beaucoup plus de place qu'un démontage nécessaire, et j'ai toujours supprimer le démontage de la méthode si il n'y a pas de travail à faire pour ce test.
Concernant se moque, je fonctionne comme ceci:
tearDown()
...teardown()
est intentionnellement PAS dans mon code, carsetUp()
va écraser quelque chose de toute façon. Il n'est pas nécessaire d'écrire un démontage de la fonction qui écritNULL
à toute propriété privée de la classe de test.Vous pouvez instancier un tas d'appareil des objets et de les avoir à disposition en tant que variables d'instance dans chaque essai, au lieu de les construire individuellement pour chaque test.
Vous pouvez créer des ressources comme un descripteur de fichier dans la configuration alors assurez-vous de fermer dans le démontage. Si vous êtes à l'écriture des fichiers temporaires, vous pouvez vous assurer que vous les supprimiez. Si vous ouvrez une connexion de base de données, vous pouvez la fermer (bien que vous pourriez le faire ailleurs -
setupBeforeClass
/tearDownAfterClass
qui appelée pour chaque fichier de test, pas pour chaque cas de test.)C'est juste un avant/après le crochet qui est groovy chose à avoir en général. L'utiliser pour rendre votre vie plus facile, ou ne l'utilisez pas.
Vous pouvez l'utiliser presque n'importe quand vous avez une dépendance à l'intérieur de la classe à tester. Un exemple classique de ce qui pourrait être une sorte d'objet de stocker l'état de l'application (un objet de session, un panier d'achat, etc.).
Dire que j'ai eu par exemple une classe qui va calculer les frais d'expédition sur le contenu d'un panier d'achat défini par un chariot objet. Et disons que ce panier est passé dans le calcul de l'expédition par l'injection de dépendance. Pour tester la plupart des méthodes de la classe que vous pourriez avoir besoin pour réellement instancier un panier d'objet et de le définir dans la classe pour les tests unitaires de vos différentes méthodes. Vous pourriez aussi avoir besoin d'ajouter des éléments dans le panier cul bien. Donc, vous pourriez peut avoir une telle configuration:
Supposons également que vos méthodes de test peut effectivement modifier le panier les articles, les décorant avec des frais d'expédition de l'information. Vous ne t veulent de l'information à partir d'un test de l'hémorragie de la prochaine, de sorte que vous videz le panier à la fin.
setUp()
ettearDown()
sans avoir à introduire une plus avancés que les tests unitaires concept. Peut-être que je n'ai pas à choisir le meilleur exemple ici 🙂Il y a une fuite de mémoire dans l'exemple fourni par accepté de répondre.
Vous devez ajouter le démontage:
PHPUnit crée de nouveaux cas de test de l'objet pour chaque appel de méthode. Donc si il y a 4 méthode d'essai de l' - il y aura 4 objets, et 4 mockedService sera créé. Et ils n'auraient pas retiré jusqu'à la fin du script (l'ensemble de la suite de tests).
Donc, vous devez supprimer tous les objets et annuler toutes les variables dans le démontage pour éviter les fuites de mémoire.