Este documento fornece padrões e técnicas para desenvolvimento de software guiado por testes, incluindo escrever testes primeiro, usar dados de teste realistas, e isolar testes. Os padrões ajudam a responder perguntas como quanto testar e como escolher o que testar.
Padrões para Desenvolvimento de Software Guiado por Testes
1. Padrões para Desenvolvimento
de Software Guiado por Testes
Tech Talk Coquelux
Mantra
Vermelho/verde/refatorar
Everton Rodrigues
2. "TDD é uma forma de administrar o
medo durante a programação"
Quanto mais estresse voce sentir,
menos vai testar.
Quanto menos voce testar, mais
erros vai acontecer.
Quanto mais erros voce cometer,
mais estresse vai sentir.
4. Padrões para TDD ajudam a
responder as perguntas:
- O que queremos dizer com
testar?
- Quanto testamos?
- Como escolhemos que logica
testar?
- Como escolhemos quais dados
testar?
5. Testes isolados
"Faça testes tão rapidos de executar que
possa roda-los sozinho e roda-los
frequentemente"
"Busque testes em pequena escala em vez
de buscar na aplicação inteira"
6. Lista de testes
Antes de começar, escreva uma lista de
todos os testes que sabe que tera que
escrever.
Se eu conseguir pensar em um teste que
pode não funcionar, faze-lo funcionar é
mais importante que liberar meu codigo.
7. Teste primeiro
Quando voce deveria escrever seus
testes?
Antes de escrever o codigo que vai ser
testado.
8. A asserção deve vir primeiro
(Assert first)
Quando eu deveria escrever as asserções?
Escreva-as primeiro pensando:
Qual é a resposta certa?
Como eu vou verificar?
Ex: assertTrue, assertEquals.
testIfRunBackup, testIfExportArchive
9. Dados de teste
(Test data)
Use dados que façam os testes
faceis de ler e seguir.
A alternativa mais indicada para
Dados de teste é o uso de Dados
realistas.
10. Padrões de Barra Vermelha
quando e onde escreve e para de escrever testes
- One Step Test
- Starter Test
- Explanation Test
- Learning Test
- Another Test
- Regression Test
- Break (Pausa)
- Do Over (Faça de novo)
- Cheap Desk, Nice Chair
11. Teste de aprendizado
(Learning test)
Quando voce escreve testes para
software produzido externamente?
Antes da primeira vez que você vai
usar algum componente deste
pacote externo.
Ex: escreva um teste que verifica
se a API funciona.
12. Teste de regressão
(Regression test)
Qual a primeira coisa que voce faz
quando um defeito é informado?
Escreva o menor teste possivel que falhe
e que, uma vez rodado, sera refatorado.
13. Faça de novo (Do Over)
O que voce faz quando se sente
perdido?
Jogue o codigo fora e comece de novo.
14. Padrões de Teste
são tecnicas mais detalhadas para escrever testes
- Teste filho (child test)
- Objeto simulado (mock object)
- Autodesvio (self shunt)
- String de registro (log string)
- Modelo de teste de acidentes
- Teste quebrado (broken test)
- Check-in limpo (clean check-in)
15. Objeto Simulado (Mock
Object)
Como voce testa um objeto que se
baseia em um recurso caro ou
complicado?
Crie uma versão faz de conta do recurso
que responde com constantes.
Ex: mockar o database
16. String de registro (Log String)
Como você testa se a sequencia em que
as mensagens são chamadas esta correta?
Mantenha um registro em um string (log) e,
quando uma mensagem for chamada,
acrescente-a à string.
Ex: conectou selecionou alterou
desconectou
17. Modelo de teste de acidentes
Como voce testa codigo de erro que
provavelmente sera pouco invocado?
Invoque-o de qualquer forma com um
objeto especial que lança uma exceção em
vez de fazer o trabalho real.
Ex: testar o que acontece com o filesystem
cheio
18. Teste quebrado
Como voce deixa uma sessão de
programação quando esta programando
sozinho?
Deixe o ultimo teste quebrado.
19. Padrões de Barra Verde
padrões para fazer o codigo funcionar
- Fazer de conta (Fake it)
- Triangular (Triangulate)
- Implementação obvia (Obvious
Implementation)
- Um para muitos (One to many)
20. Fazer de conta (Fake it)
Qual é sua primeira implementação uma vez
que tem um teste que não funciona?
Retorne uma constante. Depois de ter o
teste rodando, gradualmente transforme a
constante em uma expressão usando
variaveis.
Ex: validar CSV gerado dinamicamente
21. Triangular
Como você conduz abstração com testes de
forma mais conservadora?
Abstraia apenas quando tiver dois ou mais
exemplos.
Ex: assertEquals(4, soma(1,3))
assertEquals (7, soma(3,4))
Outro exemplo?
22. Padrões xUnit
xUnit frameworks
- Assertion
- Fixture
- Fixture externa
- Test method
- Exception test
All tests
23. Asserção
Como voce verifica que os testes
funcionaram corretamente?
Escreva expressões booleanas que
automatizem seu julgamento sobre se o
codigo funcionou ou não.
Ex: assertTrue, assertFalse,
assertInternalType, assertEquals
Outro exemplo?
24. Fixture
Como voce cria objetos comuns
necessarios para varios testes?
Converta as variaveis locais nos testes em
variaveis de instancia. Sobrescreva
setUp() e inicialize aquelas variaveis.
Ex: Dados especificos no banco dados
25. Fixture externa
Como voce libera recursos externos na
fixture?
Sobrescreva tearDown() e libere os
recursos.
Ex: fopen.close()
Outro exemplo?
26. Metodo de teste
Como voce representa um unico caso de
teste?
Como um metodo cujo nome começa com
"test".
Ex: testIfArrayGreaterThanOne(),
testIsString()
Outro exemplo?
27. Teste de exceção
Como voce testa exceções inesperadas?
Pegue exceções esperadas e ignore-as,
falhando apenas se a exceção não é lançada.
1. exchange->addRate("USD","GBP",2);
2. function testMissingRate() {
try {
exchange->findRate("USD", "GBP");
fail(); //exceção lançada
} catch (Exception $e) {
// exception
}
}
28. Todos os testes
Como rodar todos os testes juntos?
Faça uma suite de todas as suites de testes,
agregando os pacotes de testes da aplicação
inteira.
29. O Programador Sem Medo
"São os testes de unidade que mantem seus
codigos flexiveis, reutilizaveis e passiveis de
manutenção. A razão é simples. Se você tiver
testes, não tera medo de alterar codigo! Sem
os testes, cada modificação pode gerar um
bug! Com os testes esse medo praticamente
some" Robert C. Martin
30.
31. Referencias
Test Driven Development: By
Example - Kent Beck
Clean Code - Robert C. Martin
A Relação Entre TDD e Qualidade de
Software - InfoQ
www.infoq.com/br/articles/relacao-tdd-qualidade