J'ai écrit une classe qui gère les destinataires sur une liste MailChimp, appelée MailChimpRecipient. Il utilise la classe MCAPI, qui est un wrapper d'API tiers.
http://apidocs.mailchimp.com/api/1.3/ http://apidocs.mailchimp.com/api/downloads/
Je passe l'objet MCAPI dans le constructeur de l'objet MailChimpRecipient, j'ai donc écrit des tests unitaires en utilisant PHPUnit qui testent toute la logique de ma propre classe (je ne teste pas la classe MCAPI). J'ai une couverture de code à 100% et tous les tests réussissent. Cela se fait en se moquant et en stubant l'objet MCAPI.
Ma prochaine étape était d'écrire un test d'intégration, également en utilisant PHPUnit, où je construirais le luminaire MailChimpRecipient en utilisant un véritable objet MCAPI, configuré pour utiliser une vraie liste MailChimp.
J'ai écrit ce que je pense être un test d'intégration, qui exécute essentiellement des tests contre l'interface publique de l'objet, comme:
public function testAddedRecipientCanBeFound()
{
$emailAddress = 'fred@fredsdomain.com';
$forename = 'Fred';
$surname = 'Smith';
// First, delete the email address if it is already on the list
$oldRecipient = $this->createRecipient();
if($oldRecipient->find($emailAddress))
{
$oldRecipient->delete();
}
unset($oldRecipient);
// Add the recipient using the test data
$newRecipient = $this->createRecipient();
$newRecipient->setForename($forename);
$newRecipient->setSurname($surname);
$newRecipient->setEmailAddress($emailAddress);
$newRecipient->add();
unset($newRecipient);
// Assert that the recipient can be found using the same email address
$this->assertTrue($this->_recipient->find($emailAddress));
}
Le test «d'intégration» ne teste aucun des éléments internes de la classe - il s'assure simplement que, étant donné un véritable objet MCAPI, il se comporte comme annoncé.
Est-ce correct? Est-ce la meilleure façon d'exécuter un test d'intergation? Après tout, les internes ont été testés avec un test unitaire. Ai-je raison de penser que le test d'intégration est là pour vérifier qu'il fonctionne vraiment, selon la façon dont son comportement est annoncé?
Pour aller plus loin, la classe MailChimpRecipient implémente une interface, qui sera également implémentée par d'autres classes. L'idée est d'utiliser une fabrique pour transmettre différents types d'objets destinataires de liste de diffusion à mon code, qui font tous la même chose, mais en utilisant différents fournisseurs de liste de diffusion. Étant donné que mes tests d'intégration testent cette interface, que diriez-vous de l'utiliser pour toutes les classes qui implémentent l'interface? Ensuite, à l'avenir, si je conçois une nouvelle classe à utiliser de manière interchangeable, je peux exécuter le même test d'intégration avant de l'insérer dans un projet.
Cela vous semble-t-il raisonnable? Les tests unitaires testent les composants internes d'un objet, les tests d'intégration s'assurent qu'il se comporte comme annoncé?
setUp
fonction pour établir les motifs pour exécuter vos tests. Si l'entrée n'est pas définie, vous ne pouvez pas vraiment tester. L'entrée doit être précise, stricte et toujours la même. Si une condition préalable d'un test n'est pas remplie, ignorez le test à la place. Ensuite, analysez pourquoi il saute et si vous devez ajouter des tests supplémentaires et / ou si cela setUp
n'est pas fait correctement.
DataProvider
(c'est une fonction offrant une entrée en tant que paramètres à un test).