Qualidade no Código do Teste
61
6.1
Repetição de código entre testes . . . . . . . . . . . . . . . . . . . . . .
62
6.2
Nomenclatura dos testes . . . . . . . . . . . . . . . . . . . . . . . . . .
65
6.3
Test Data Builders . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
67
6.4
Testes Repetidos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 69
6.5
Escrevendo boas asserções . . . . . . . . . . . . . . . . . . . . . . . . .
72
6.6
Testando listas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
74
6.7
Separando as Classes de Teste . . . . . . . . . . . . . . . . . . . . . . .
75
6.8
Conclusão . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
76
7
TDD e a Coesão
77
7.1
Novamente o Problema do Cálculo de Salário . . . . . . . . . . . . . .
77
7.2
Ouvindo o feedback dos testes . . . . . . . . . . . . . . . . . . . . . . .
82
7.3
Testes em métodos privados? . . . . . . . . . . . . . . . . . . . . . . . .
84
7.4
Resolvendo o Problema da Calculadora de Salário . . . . . . . . . . .
85
7.5
O que olhar no teste em relação a coesão? . . . . . . . . . . . . . . . . 89
7.6
Conclusão . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 90
8
TDD e o Acoplamento
91
8.1
O Problema da Nota Fiscal . . . . . . . . . . . . . . . . . . . . . . . . .
91
8.2
Mock Objects . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 94
8.3
Dependências explícitas . . . . . . . . . . . . . . . . . . . . . . . . . . . 98
8.4
Ouvindo o feedback dos testes . . . . . . . . . . . . . . . . . . . . . . . 99
8.5
Classes estáveis . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 100
viii
Casa do Código
Sumário
8.6
Resolvendo o Problema da Nota Fiscal . . . . . . . . . . . . . . . . . . 103
8.7
Testando métodos estáticos . . . . . . . . . . . . . . . . . . . . . . . . . 105
8.8
TDD e a constante criação de interfaces . . . . . . . . . . . . . . . . . 107
8.9
O que olhar no teste em relação ao acoplamento? . . . . . . . . . . . . 110
8.10 Conclusão . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 111
9
TDD e o Encapsulamento
113
9.1
O Problema do Processador de Boleto . . . . . . . . . . . . . . . . . . 113
9.2
Ouvindo o feedback dos testes
. . . . . . . . . . . . . . . . . . . . . . . 118
9.3
Tell, Dont Ask e Lei de Demeter . . . . . . . . . . . . . . . . . . . . . . 119
9.4
Resolvendo o Problema do Processador de Boletos . . . . . . . . . . . 120
9.5
O que olhar no teste em relação ao encapsulamento? . . . . . . . . . . 121
9.6
Conclusão . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 122
10 Testes de Integração e TDD
123
10.1
Testes de unidade, integração e sistema . . . . . . . . . . . . . . . . . . 123
10.2 Quando não usar mocks? . . . . . . . . . . . . . . . . . . . . . . . . . . 125
10.3 Testes em DAOs . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 127
10.4 Devo usar TDD em testes de integração? . . . . . . . . . . . . . . . . . 132
10.5 Testes em aplicações Web . . . . . . . . . . . . . . . . . . . . . . . . . . 132
10.6 Conclusão . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 134
11 Quando não usar TDD?
137
11.1
Quando não praticar TDD?
. . . . . . . . . . . . . . . . . . . . . . . . 137
11.2
100% de cobertura de código? . . . . . . . . . . . . . . . . . . . . . . . 138
11.3
Devo testar códigos simples? . . . . . . . . . . . . . . . . . . . . . . . . 140
11.4
Erros comuns durante a prática de TDD . . . . . . . . . . . . . . . . . 141
11.5
Como convencer seu chefe sobre TDD?
. . . . . . . . . . . . . . . . . 141
11.6
TDD em Sistemas Legados . . . . . . . . . . . . . . . . . . . . . . . . . 144
11.7
Conclusão . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 144
12 E agora?
147
12.1
O que ler agora? . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 147
12.2
Dificuldade no aprendizado . . . . . . . . . . . . . . . . . . . . . . . . 148
12.3
Como interagir com outros praticantes? . . . . . . . . . . . . . . . . . 149
12.4 Conclusão Final . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 149
ix
Sumário
Casa do Código
13 Apêndice: Princípios SOLID
151
13.1
Sintomas de Projetos de Classes em Degradação . . . . . . . . . . . . 151
13.2
Princípios de Projeto de Classes . . . . . . . . . . . . . . . . . . . . . . 154
13.3
Conclusão . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 157
Índice Remissivo
158
Bibliografia
161
x
Capítulo 1
Introdução
Será que testar software é realmente importante? Neste capítulo, discutimos um
pouco sobre as consequências de software não testado e uma possível solução para
isso, que hoje é um problema para a sociedade como um todo, já que softwares estão
em todos os lugares.
1.1
Era uma vez um projeto sem testes...
Durante os anos de 2005 e 2006, trabalhei em um projeto cujo objetivo era automa-