postos na pirâmide para se fazer bons investimentos em automação de testes.
Há também os testes exploratórios, que são executados sempre manualmente
69
4.1. Testes Ágeis
Casa do Código
por um membro do time, com a finalidade de ir além de onde os testes automati-
zados puderam chegar. Eles não seguem um script pré-planejado e se beneficiam
da capacidade de investigação, da observação, da analise e da adaptação do testador.
Através deles os testadores buscam e encontram riscos que extrapolam o universo
de riscos que puderam ser previstos de antemão pela equipe.
Em se falando de prevenção de defeitos de software, TDD (Test-Driven Deve-
lopment) é uma ótima ferramenta na maioria dos contextos. Essa técnica sugere a
escrita de testes de unidade antes mesmo de se codificar a funcionalidade a ser testada. Com isso, é possível garantir alta cobertura de testes [7] e, consequentemente, feedback rápido em caso de alterações que possam gerar efeitos colaterais quebrando outras funcionalidades.
A seguir exploraremos um pouco melhor cada um dos diferentes tipos de tes-
tes. É importante ter em mente que nenhuma abordagem é melhor do que a outra;
na verdade, cada um deles é uma boa ferramenta para resolver certos tipos de pro-
blema e, você, provavelmente, precisará combinar todos para garantir a qualidade
necessária no produto que está desenvolvendo.
Testes de Unidade
Escrever testes de unidade é uma prática essencial para se garantir a qualidade de
um software. Um desenvolvedor ágil evita ao máximo escrever código sem escrever
também um teste de unidade para verificar se tudo está funcionando da forma como
deveria, por isso, no método XP, utiliza-se uma prática conhecida como TDD - Test-
Driven Development ou Desenvolvimento
Guiado por Testes.
Com TDD os testes de unidade são escritos antes mesmo do que as classes e
métodos a serem testados, melhorando assim a garantia de que todo o código está
coberto por testes. É importante ressaltar que o conceito de TDD vai muito além de
apenas escrever testes de unidade, e apresenta, na verdade, uma forma inovadora de
se pensar no design de um software.
É muito raro que um desenvolvedor acredite que possa escrever código que sem-
pre funcionará na primeira vez. Na verdade, muitos ficam surpreendidos quando
isso acontece. Por isso, independente de escrever testes antes ou depois, é preciso testar para garantir que o software está funcionado da maneira que deveria funcionar.
Uma alteração em um determinado trecho de código de uma parte de um sistema
pode causar um problema em outra parte, e os componentes geralmente contêm de-
pendências, que quando alteradas podem modificar seus comportamentos de forma
70
Casa do Código
Capítulo 4. Entregando Valor
inesperada: são os conhecidos efeitos colaterais.
Além de ajudar na melhoria da qualidade, os testes de unidade podem ajudar
o desenvolvedor a entender melhor as regras de negócio do sistema, uma vez que,
provavelmente, haverá um teste para cada regra. Dessa forma, eles poderão ser con-
siderados também uma documentação viva, porque além servir como referência
para compreensão das regras de negócio, servirão também para garantir que essas
regras estejam implementadas corretamente e que o software esteja se comportando
da maneira que se espera.
É importante que os testes sejam fáceis de se executar, porque pouco adiantará
ter testes de unidade que nunca são executados ou que são executados com uma
frequência muito baixa.
Testando antes com Desenvolvimento Guiado por Testes
Desenvolvimento Guiado por Testes (TDD) é um processo em que o desenvolve-
dor começa a implementação de uma nova funcionalidade pelo teste e deve, o tempo
todo, fazer de tudo para que seu código fique simples e com qualidade [7].
TDD é realizado através de um ciclo com os seguintes passos:
Figura 4.2: Ciclo de TDD (Imagem de Maurício Aniche)
1) Adicione um teste rapidamente.
2) Execute todos os testes e observe o novo teste falhar.
71
4.1. Testes Ágeis
Casa do Código
3) Faça uma pequena mudança para fazer o teste passar .
4) Execute todos os teste e observe que foram bem sucedidos.
5) Refatore.
O uso de TDD assegura que todo código adicionado ao repositório seja testado
e, além disso, dá ênfase em se escrever apenas o código necessário para que os tes-
tes passem, evitando que o desenvolvedor escreva mais do que é necessário, contri-
buindo para um código mais simples, enxuto e também mais fácil de se dar manu-
tenção.
Testando de Ponta a ponta com testes de Aceitação
Testes de Unidade não são os únicos tipos de teste que devem ser realizados.
Existem outros tipos que, unidos aos unitários, poderão trazer uma qualidade ainda
melhor ao software. É o caso dos testes de aceitação, também conhecidos como testes funcionais ou testes de usuário final.
Testes de aceitação, diferente dos testes de unidade que verificam apenas o com-
portamento de uma classe ou método, testam o comportamento do sistema de uma
forma mais ampla. Geralmente, representam o contexto completo de uma história