Bem, demorei mais do que havia planejado para escrever esse post. Nesse post eu vou falar sobre TDD com Test Doubles.
Para começar a apresentar os conceitos de Test Doubles, pedi para eles desenvolverem uma aplicação simples que deveria se conectar a um web-service que eu estava disponibilizando. Todos desenvolveram a aplicação utilizando TDD, so far so good. Então eu alterei o código do meu web-service, em um momento dei um sleep de 180 segundos e depois fiz ele lançar uma exceção.
Utilizei essas duas situações para mostrar um exemplo onde a utilização de Test Doubles: quando o sistema/classe depende de um recurso externo e/ou lento (acesso a rede ou disco por exemplo). Em seguida, eles fizeram outros testes, agora utilizando um mock e outro utlizando um stub que nós criamos.
Continuando comentei com eles outros benefícios de se utilizar Test Doubles, como o fato de você poder testar uma classe, sem que todas as classes do qual ela depende já estejam implementadas. Por exemplo, utilizando a idéia do web-service, se você está implementando uma classe que irá utilizar um cliente do web-service para pegar uma lista de tags para apresentar quais são as tags mais utilizadas. Abaixo um pedaço de código, demonstrando como a classe utiliza o cliente do web-service.
class TagsGenerator { private $client; public function __construct(WebServiceClient $client){ $this->client = $client; } private function buildTagList(){ $list = $this->client->getTagList(); // código omitido } // demais métodos omitidos }
Claro que você está sempre programando para a interface, então WebServiceClient é uma interface e não uma classe. Veja então que eu vou poder testar essa minha classe, antes mesmo que haja alguma implementação para a interface WebServiceClient. Aproveitei também esse exemplo para comentar mais sobre inversão de controle(IoC). Abaixo um exemplo de um método de teste.
public function testShouldReturnMusicAsTopOneTag(){ $stub = $this->getMock('WebServiceClient'); $stub->expects($this->any()) ->method('getTagList') ->will($this->returnValue(array('Music','Games','Videos'))); // aqui, usando IoC e um stub eu posso testar // minha classe que constrói a lista de tags $generator = new TagsGenerator($stub); // resto do teste abaixo }
Outro benefício que pode ser alcançado com uma boa OO e test doubles é o isolamento entre testes. Além disso, comentei sobre o Mocks Aren’t Stubs do Fowler, que fala sobre as diferentes formas de se utilizar TDD, classicist ou mockist e citei que na minha opinião a melhor abordagem é saber utilizar bem as duas formas de TDD.
Final se semana escreverei outro post, comentando como foi feito o TDD com banco de dados.
Muito bom, aguardo o próximo capítulo.
Porra eu queria comentar algo legal sobre esse post, mas não entendi nada.
=/
valeu…
boa iniciativa..
estou pesqisando sobre gestô de qualidade total