He escrito una clase que administra destinatarios en una lista de MailChimp, llamada MailChimpRecipient. Utiliza la clase MCAPI, que es un contenedor de API de terceros.
http://apidocs.mailchimp.com/api/1.3/ http://apidocs.mailchimp.com/api/downloads/
Paso el objeto MCAPI al constructor del objeto MailChimpRecipient, así que escribí pruebas unitarias usando PHPUnit que prueban toda la lógica en mi propia clase (no estoy probando la clase MCAPI). Tengo una cobertura de código del 100% y todas las pruebas pasan. Esto se hace burlándose y tropezando con el objeto MCAPI.
Mi siguiente paso fue escribir una prueba de integración, también usando PHPUnit, donde construiría el accesorio MailChimpRecipient usando un objeto MCAPI real, configurado para usar una lista real de MailChimp.
He escrito lo que creo que es una prueba de integración, que básicamente ejecuta pruebas contra la interfaz pública del objeto, como:
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));
}
La prueba de "integración" no prueba ninguno de los elementos internos de la clase, solo se asegura de que, dado un objeto MCAPI real, se comporte como se anuncia.
¿Es esto correcto? ¿Es esta la mejor manera de ejecutar una prueba de interposición? Después de todo, las partes internas han sido probadas con una prueba unitaria. ¿Estoy en lo cierto al pensar que la prueba de integración está ahí para probar que realmente funciona, de acuerdo con la forma en que se anuncia su comportamiento?
Para ir un paso más allá, la clase MailChimpRecipient implementa una interfaz, que también será implementada por otras clases. La idea es usar una fábrica para pasar diferentes tipos de objetos de destinatario de la lista de correo a mi código, que hacen lo mismo, aunque usan diferentes proveedores de listas de correo. Dado que mis pruebas de integración prueban esa interfaz, ¿qué tal si la usamos para todas las clases que implementan la interfaz? Luego, en el futuro, si diseño una nueva clase para ser utilizada de manera intercambiable, puedo ejecutar la misma prueba de integración antes de insertarla en un proyecto.
¿Suena esto razonable? Las pruebas unitarias prueban las partes internas de un objeto, las pruebas de integración aseguran que se comporte como se anuncia.
setUpfunción para establecer los motivos para ejecutar sus pruebas. Si la entrada no está definida, bueno, realmente no puede probar. La entrada debe ser precisa, estricta y siempre la misma. Si no se cumple una condición previa de una prueba, omita la prueba. Luego, analice por qué se salta y si necesita agregar pruebas adicionales y / o setUpno se hace correctamente.
DataProvider(esa es una función que ofrece entradas como parámetros para una prueba).