Ho scritto una classe che gestisce i destinatari in un elenco MailChimp, chiamato MailChimpRecipient. Utilizza la classe MCAPI, che è un wrapper API di terze parti.
http://apidocs.mailchimp.com/api/1.3/ http://apidocs.mailchimp.com/api/downloads/
Passo l'oggetto MCAPI nel costruttore dell'oggetto MailChimpRecipient, quindi ho scritto test unitari usando PHPUnit che testano tutta la logica della mia classe (non sto testando la classe MCAPI). Ho una copertura del codice del 100% e tutti i test superano. Questo viene fatto deridendo e stubbing l'oggetto MCAPI.
Il mio prossimo passo è stato scrivere un test di integrazione, usando anche PHPUnit, dove avrei costruito l'apparecchiatura MailChimpRecipient usando un vero oggetto MCAPI, impostato per usare un vero elenco MailChimp.
Ho scritto quello che penso sia un test di integrazione, che fondamentalmente esegue test sull'interfaccia pubblica dell'oggetto, come:
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));
}
Il test di "integrazione" non verifica nessuno degli interni della classe, ma si assicura solo che, dato un vero oggetto MCAPI, si comporti come pubblicizzato.
È corretto? È questo il modo migliore per eseguire un test di intergazione? Dopotutto, gli interni sono stati testati con un test unitario. Ho ragione nel pensare che il test di integrazione sia lì per verificare che funzioni davvero, in base al modo in cui viene pubblicizzato il suo comportamento?
Per fare un ulteriore passo avanti, la classe MailChimpRecipient implementa un'interfaccia, che sarà implementata anche da altre classi. L'idea è quella di utilizzare una fabbrica per passare diversi tipi di oggetti destinatario della mailing list al mio codice, che fanno tutti la stessa cosa, anche se usando diversi provider di mailing list. Dato che i miei test di integrazione testano quell'interfaccia, che ne dici di usarla per tutte le classi che implementano l'interfaccia? Quindi, in futuro, se progetto una nuova classe da utilizzare in modo intercambiabile, posso eseguire lo stesso test di integrazione prima di inserirlo in un progetto.
Sembra ragionevole? I test unitari testano gli interni di un oggetto, i test di intergrazione assicurano che si comporti come pubblicizzato?
setUp
funzione per stabilire i motivi per eseguire i test. Se l'input non è definito, non puoi davvero testarlo. L'input deve essere preciso, rigoroso e sempre lo stesso. Se non è soddisfatta una condizione preliminare di un test, saltare invece il test. Quindi analizzare perché salta e se è necessario aggiungere ulteriori test e / o il setUp
non è fatto correttamente.
DataProvider
(questa è una funzione che offre input come parametri per un test).