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 = '[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));
}
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?
fonte
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 / ousetUp
se não foi feito corretamente.DataProvider
(essa é uma função que oferece entrada como parâmetros para um teste).Respostas:
Ao testar seu código, você deve prestar atenção em três áreas:
Normalmente, a quantidade de teste que você tem em cada categoria teria o formato de uma pirâmide, significando muitos testes de unidade na parte inferior, alguns testes funcionais no meio e apenas alguns testes de cenário.
Com um teste de unidade, você zomba de tudo o que a classe em teste usa e você a examina em puro isolamento (é por isso que é importante garantir que, dentro da sua classe, você recupere todas as dependências através da injeção para que possam ser substituídas em teste).
Com o teste de unidade, você testa todas as possibilidades, não apenas o 'caminho feliz', mas também todas as condições de erro.
Se você tiver certeza absoluta de que todas as suas unidades funcionam isoladamente, escreva alguns testes (testes funcionais) para garantir que as unidades também funcionem quando combinadas. Em seguida, você escreve um teste de cenário, que testa a fiação entre todos os módulos funcionais.
Por exemplo, suponha que você esteja testando um carro.
Você poderia montar o carro inteiro e, como motorista, verificar todas as condições possíveis, mas isso seria realmente difícil de fazer.
Em vez disso, você testaria uma pequena parte do mecanismo com todas as possibilidades (teste de unidade)
Então você testa o motor inteiro (separado do carro), o que seria um teste funcional.
Como último teste, você coloca a chave, liga o carro e o leva até o estacionamento. Se estiver funcionando, você saberá que todas as peças (bateria, combustível, motor, etc.) estão conectadas e, desde que você as testou isoladamente, pode ter certeza de que todo o carro está funcionando corretamente.
Portanto, no seu caso, você testou todas as condições de erro e o caminho feliz em seu teste de unidade e sabe que só precisa fazer um teste de ponta a ponta com os 'componentes reais' para verificar se a fiação está correta.
Alguns outros pontos,
fonte