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 = '[email protected]';
$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.
quelle
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 dassetUp
nicht richtig gemacht wurde.DataProvider
(dies ist eine Funktion, die Eingaben als Parameter für einen Test bietet).Antworten:
Beim Testen Ihres Codes sollten Sie auf drei Bereiche achten:
Normalerweise hat die Testmenge, die Sie in jeder Kategorie haben, die Form einer Pyramide, was bedeutet, dass unten viele Einheitentests, in der Mitte einige Funktionstests und nur einige Szenarientests ausgeführt werden.
Mit einem Komponententest verspotten Sie alles, was die getestete Klasse verwendet, und testen es in reiner Isolation (aus diesem Grund ist es wichtig, sicherzustellen, dass Sie in Ihrer Klasse alle Abhängigkeiten durch Injection abrufen, damit sie im Test ersetzt werden können).
Mit Unit-Tests testen Sie alle Möglichkeiten, also nicht nur den "Happy Path", sondern auch alle Fehlerzustände.
Wenn Sie völlig sicher sind, dass alle Einheiten isoliert arbeiten, schreiben Sie einige Tests (Funktionstests), um sicherzustellen, dass die Einheiten auch in Kombination funktionieren. Dann schreiben Sie einen Szenariotest, der die Verdrahtung zwischen allen Funktionsmodulen testet.
Angenommen, Sie testen ein Auto.
Sie könnten das ganze Auto zusammenbauen und als Fahrer jeden möglichen Zustand überprüfen, aber das wäre wirklich schwer zu tun.
Stattdessen würden Sie einen kleinen Teil des Motors mit allen Möglichkeiten testen (Unit Test)
Dann testen Sie den gesamten Motor (getrennt vom Auto), was eine Funktionsprüfung wäre.
Als letzten Test geben Sie Ihren Schlüssel ein, starten das Auto und fahren es zum Parkplatz. Wenn das funktioniert, wissen Sie, dass alle Teile (Batterie, Kraftstoff, Motor usw.) verbunden sind, und da Sie sie isoliert getestet haben, können Sie sich ziemlich sicher sein, dass das gesamte Auto ordnungsgemäß funktioniert.
In Ihrem Fall haben Sie also alle Fehlerbedingungen und den fehlerfreien Pfad in Ihrem Komponententest getestet und wissen, dass Sie nur einen End-to-End-Test mit den „echten Komponenten“ durchführen müssen, um zu überprüfen, ob die Verkabelung korrekt ist.
Ein paar andere Punkte,
quelle