Eu escrevi uma classe que gerencia destinatários em uma lista do MailChimp, chamada MailChimpRecipient. Ele usa a classe MCAPI, que é um wrapper de API de terceiros.
http://apidocs.mailchimp.com/api/1.3/ http://apidocs.mailchimp.com/api/downloads/
Como passo o objeto MCAPI no construtor do objeto MailChimpRecipient, escrevi testes de unidade usando o PHPUnit que testam toda a lógica da minha própria classe (não estou testando a classe MCAPI). Tenho 100% de cobertura de código e todos os testes são aprovados. Isso é feito zombando e stubbing do objeto MCAPI.
Meu próximo passo foi escrever um teste de integração, também usando o PHPUnit, onde eu construía o dispositivo MailChimpRecipient usando um objeto MCAPI real, configurado para usar uma lista real do MailChimp.
Escrevi o que considero um teste de integração, que basicamente executa testes contra a interface pública do 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));
}
O teste de "integração" não testa nenhum elemento interno da classe - apenas garante que, dado um objeto MCAPI real, ele se comporte como anunciado.
Isso está correto? Essa é a melhor maneira de executar um teste de intergação? Afinal, os internos foram testados com um teste de unidade. Estou certo ao pensar que o teste de integração existe para testar se ele realmente funciona, de acordo com a forma como seu comportamento é anunciado?
Para dar um passo adiante, a classe MailChimpRecipient implementa uma interface, que também será implementada por outras classes. A idéia é usar uma fábrica para passar diferentes tipos de objetos de destinatários da lista de endereçamento para o meu código, que fazem a mesma coisa, embora usando diferentes fornecedores de lista de endereçamento. Como meus testes de integração testam a interface, que tal usá-la para todas as classes que implementam a interface? Então, no futuro, se eu criar uma nova classe para ser usada de forma intercambiável, eu posso executar o mesmo teste de integração antes de inseri-lo em um projeto.
Isso soa razoável? Os testes de unidade testam as partes internas de um objeto, os testes de integração garantem que ele se comporte como anunciado?
setUp
função para estabelecer os motivos para executar seus testes. Se a entrada for indefinida, bem, você realmente não pode testar. A entrada precisa ser precisa, rigorosa e sempre a mesma. Se uma pré-condição de um teste não for atendida, pule o teste. Em seguida, analise por que ele ignora e se você precisa adicionar testes adicionais e / ou setUp
se não foi feito corretamente.
DataProvider
(essa é uma função que oferece entrada como parâmetros para um teste).