Pirâmide de testes, escrevendo testes com qualidade @ RubyConf 2015
- parâmetros para avaliar a qualidade de um teste e de uma suite de testes
- pirâmide de testes
- mocks não são apenas para testes, são para design
- cucumber não é uma ferramenta de testes, mas sim de documentação
- testing iceberg
suíte está com qualidade? • Corretude ◦ "o teste está verificando o comportamento correto do código?" • Adequação do tipo de teste ◦ "o teste foi feito com o tipo mais adequado?" • Clareza ◦ "está fácil de entender sobre o que é o teste?"
• Unitário ◦ testa o comportamento de 1 objeto • Integração ◦ teste entre aceitação e unitário, testando comportamento de 2 ou mais objetos juntos Tipos de teste Para cada comportamento a ser testado, deve ser avaliado o tipo de teste mais adequado
Unitário: testa o comportamento de 1 objeto • Integração: teste entre aceitação e unitário, testando comportamento de 2 ou mais objetos juntos Adequação do tipo de teste Para cada comportamento a ser testado, deve ser avaliado o tipo de teste mais adequado
para estratégia de testes, baseado na natureza do tipo de teste aceitação integração unitário (+) frágil (+) lento (+) garantia qualidade externa (-) frágil (+) rápido (-) garantia qualidade externa
fazer poucos testes de acceptance, e vários de unidade - Podemos usar teste unitário de view, pois teste de acceptance não é para especificação de tela e sim para spec de regras do domínio do negócio
as 4 fases padrão do xUnit: 1. Setup: coloca o sistema no estado necessário 2. Exercise: interage com o objeto sob teste 3. Verify: verifica o comportamento esperado 4. Teardown: coloca o sistema no estado antes do teste
é fácil de entender a relação de causa e consequência entre as fases do xUnit dado o seguinte estado do meu sistema quando exercito tal ação nele então consigo verificar tal comportamento esperado setup exercise verify
está claro? - em que estado o objeto game precisa estar para ser setado como 100? - o que tem ser feito no objeto game para que ele sete o score para 100?
double usado na fase de verify • Mockar um objeto é programá-lo para verificar se ele recebeu as mensagens corretas do SUT • Criado originalmente para ser usado com a técnica de interface discovery
complexo ◦ o domínio do negócio tem muitos termos que não são de conhecimento público • Para algum comportamento do sistema que for muito complexo e houver valor em documentá-lo com linguagem natural ◦ difícil de entender o propósito do código apenas através da leitura código • Quando houver pessoas que precisam saber o comportamento do sistema mas que não consigam ler o código-fonte ◦ suporte, analistas de negócio e outros stakeholders • Para documentar um overview do comportamento do sistema ◦ exemplo da documentação do RSpec e VCR
problema, não a de interface com usuário • escreva documentação, não apenas automação de testes • não precisa usar para todos os testes end-to-end, só para os que envolvem a necessidade de documentação
nos testes • Organize sua suite segundo a pirâmide de testes • Substitua "testes de aceitacão" por testes de view ou testes unitários de Javascript • Testes de aceitação são sobre regras de negócio, não sobre especificação da UI Concluindo
mocks são para a de verify • Quando alguém fala "mockar", provavelmente ele/ela quer dizer "stubar" • Mocks foram feitos com o propósito de fazer design com a técnica de interface discovery Concluindo
de testes (especificação por exemplos) • Você não precisa usar Cucumber para todos os testes end-to-end da sua aplicação • É possível fazer business-readable tests sem ser end-to-end
sobre pirâmide de testes: http://bit.ly/em-foco-testes • Paper para entender origem de mocks: Mock roles, not Objects • Livro sobre BDD com Cucumber e RSpec, do Hugo Baraúna • Livro sobre testes avançado: Growing object-oriented software guided by tests • Livro sobre a metodologia por trás do Cucumber: Specification by Example