Ich habe eine Klasse namens MailChimpRecipient geschrieben, die Empfänger in einer MailChimp-Liste verwaltet. Es wird die MCAPI-Klasse verwendet, bei der es sich um einen API-Wrapper eines Drittanbieters handelt.
http://apidocs.mailchimp.com/api/1.3/ http://apidocs.mailchimp.com/api/downloads/
Ich übergebe das MCAPI-Objekt an den Konstruktor des MailChimpRecipient-Objekts, daher habe ich Unit-Tests mit PHPUnit geschrieben, die die gesamte Logik in meiner eigenen Klasse testen (ich teste nicht die MCAPI-Klasse). Ich habe 100% Codeabdeckung und alle Tests bestehen. Dies erfolgt durch Verspotten und Stoppen des MCAPI-Objekts.
Mein nächster Schritt war das Schreiben eines Integrationstests, ebenfalls mit PHPUnit, bei dem ich das MailChimpRecipient-Fixture unter Verwendung eines echten MCAPI-Objekts konstruierte, das für die Verwendung einer echten MailChimp-Liste eingerichtet war.
Ich habe geschrieben, was ich für einen Integrationstest halte, der im Grunde genommen Tests gegen die öffentliche Schnittstelle des Objekts ausführt, wie:
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));
}
Der "Integration" -Test testet keine der Interna der Klasse - er stellt nur sicher, dass sich ein reales MCAPI-Objekt so verhält, wie es angekündigt wurde.
Ist das richtig? Ist dies der beste Weg, um einen Intergationstest durchzuführen? Immerhin wurden die Einbauten mit einem Unit-Test geprüft. Habe ich Recht, wenn ich denke, dass der Integrationstest dazu da ist, zu testen, ob er wirklich funktioniert, je nachdem, wie für sein Verhalten geworben wird?
Um noch einen Schritt weiter zu gehen, implementiert die MailChimpRecipient-Klasse eine Schnittstelle, die auch von anderen Klassen implementiert wird. Die Idee ist, eine Factory zu verwenden, um verschiedene Arten von Empfängerobjekten für Mailinglisten an meinen Code zu übergeben, die alle dasselbe tun, obwohl sie verschiedene Mailinglistenanbieter verwenden. Da meine Integrationstests diese Schnittstelle testen, können Sie sie dann für alle Klassen verwenden, die die Schnittstelle implementieren. Wenn ich dann in Zukunft eine neue Klasse entwerfe, die austauschbar verwendet werden soll, kann ich denselben Integrationstest ausführen, bevor ich sie in ein Projekt einfüge.
Hört sich das vernünftig an? Die Unit-Tests testen die Interna eines Objekts. Integrations-Tests stellen sicher, dass es sich wie angekündigt verhält.
setUp
Funktion nutzen, um die Gründe für die Durchführung Ihrer Tests zu ermitteln. Wenn die Eingabe undefiniert ist, können Sie sie nicht wirklich testen. Die Eingabe muss präzise, streng und immer gleich sein. Wenn eine Testvoraussetzung nicht erfüllt ist, überspringen Sie stattdessen den Test. Analysieren Sie dann, warum es überspringt und ob Sie zusätzliche Tests hinzufügen müssen und / oder ob das setUp
nicht richtig gemacht wurde.
DataProvider
(dies ist eine Funktion, die Eingaben als Parameter für einen Test bietet).