Mocks VS Stubs

Mocks VS Stubs


Já respiro novos ares profissionais e me deparei com novos conceitos, metodologias e desafios.

Em outras experiências na minha carreira não havia trabalhando tanto com testes de integração no projetos que participei. No meu contexto atual faz parte dos testes da solução da empresa, integração com operadoras de telefonia entre outros parceiros.

Portanto o uso de mocks e stubs são constantes, resolvi escrever um post sobre essa "dupla", com o intuito de entender a diferença entre eles, além de tentar esclarecer para nossa comunidade o que são e em quais situações podemos cada um.

De forma resumida concluí que Mocks são utilizados para testar interação e Stubs para esboçar estados, entendi que ambos são Fakes, mas são muito úteis em um ambiente de desenvolvimento, que se trabalha com integração com outras plataformas, parceiros, Web Services e etc.

No meu contexto atual utilizo com maior frequência os Stubs, principalmente para testar integração com operadoras de telefonia.
Para criar um novo Stub é feita uma conexão via WebService (ServiceReference) com o parceiro, afim de buscar informações WSDL sobre o funcionamento dos seus serviços. A partir dessas informações é possível simular todos os possíveis comportamentos desta integração, gerando o que chamamos de DataCases.

DataCases são possíveis comportamentos que podem ocorrer durante uma integração. Todos os possíveis comportamentos são cadastrados em um XML de configuração e a partir deste o Stub realiza os tratamentos necessários para uma simulação. Neste XML também encontramos os DataRules que são "as regras" que definem o comportamento, ou podemos dizer que contém informações necessárias para a simulação de um comportamento.
Segue abaixo um exemplo:

No exemplo acima, temos um arquivo de configuração de um Stub que simula para o retorno para todos número de celulares consultados da operadora Claro com o DDD 31, a regra contém o filtro do tipo DDD('TypeFilter-DDD-TypeFilter') e ainda indica que o retorno irá usar as informações presentes no DataCase 0('IdDataCase-0-IdDataCase').

Vendo as informações do DataCase 0 podemos ver que o Stub retornará que o número é do tipo Pós-Pago('SubscriberType-POS-SubscriberType') e ainda que o número está Ativo('Status-A-Status') para um certo cenário de teste, onde iríamos consultar se um número é válido na operadora seriam suficientes estas informações configuradas no arquivo de configuração de um Stub.

Relacionando o Mocks e Stubs na pirâmide de automação de testes de Mike Cohn, digamos que os Mocks estão no nível de unidade principalmente para times que utilizam TDD, já os Stubs estão mais próximos do nível serviços.

[1]

Espero ter conseguido clarear os conceitos e informações sobre Mocks Stubs.

Em outras palavras, segundo Robson Castilho:

"Mocks são fakes assim como os stubs, porém um mock decide se um teste passou ou falhou. Outra forma de dizer isso é que stubs são usados em testes de estado, isto é, testes orientados ao resultado. Um método é testado e espera-se que algum resultado seja “X” ou verdadeiro ou não nulo, geralmente checando o valor retornado pelo método.
Por sua vez, mocks são usados em testes de interação, isto é, testes orientados à ação. O mock verifica se o método sob teste executa uma determinada ação (e não se ele retornou algo)."

Algumas ferramentas de Mock:

Referências:
http://martinfowler.com/bliki/TestPyramid.html
http://martinfowler.com/articles/mocksArentStubs.html
http://robsoncastilho.com.br/2010/11/20/testes-de-interacao-usando-mocks/
http://stackoverflow.com/questions/3459287/whats-the-difference-between-a-mock-stub

[1] Figura retirada do slide 17 do Elias Nogueira
http://pt.slideshare.net/elias.nogueira/todas-as-abordagens-de-testes-dentro-do-gil

Futuramente publicarei um post mais técnico com exemplo de códigos relacionados a Mocks e Stubs.

Obrigado pela visita!

2 comentários: