Professional Documents
Culture Documents
Elias Dorneles
@eliasdorneles
YMMV
Sua experincia pode ser diferente!
TDD is cool.
Porm, mais comum me
encontrar escrevendo
testes para cdigo legado.
Bugs tendem a
reaparecer...
Regra de ouro:
quando encontrar bug,
adicione um caso para
peg-lo.
Cheap trick
$ python meu_script.py <in.txt >out.txt
$ diff <(python meu_script.py) out.txt
Cheap trick
$ python meu_script.py <in.txt >out.txt
$ diff <(python meu_script.py) out.txt
Prs:
1. de graa!
2. se sentir Unx hacker :D
Contras:
1. cobre apenas
o caminho feliz
2. no aponta o problema exato
Sute de testes
$ cat run_tests.sh
#!/bin/bash
set -e
diff <(python meu_script.py < in1.txt) out1.txt
diff <(python meu_script.py < in2.txt) out2.txt
diff <(python meu_script.py < in3.txt) out3.txt
$ ./run_tests.sh
Sute de testes
$ cat run_tests.sh
#!/bin/bash
set -e
Fixtures
Sute de testes
$ cat run_tests.sh
#!/bin/bash
set -e
Fixtures
Expectativas
Sute de testes
$ cat run_tests.sh
#!/bin/bash
Fixtures
set -e
Caso
diff <(python meu_script.py < in1.txt)
diff <(python meu_script.py < in2.txt)
diff <(python meu_script.py < in3.txt)
$ ./run_tests.sh
Expectativas
out1.txt
out2.txt
out3.txt
Sute de testes
$ cat run_tests.sh
#!/bin/bash
Fixtures
set -e
Caso
diff <(python meu_script.py < in1.txt)
diff <(python meu_script.py < in2.txt)
diff <(python meu_script.py < in3.txt)
$ ./run_tests.sh
Sute
Expectativas
out1.txt
out2.txt
out3.txt
Estrutura de um teste
Dado:
fixtures, inicializando cdigo a ser testado
Quando:
exercitar cdigo a ser testado
Ento:
verifica se resultado o esperado
Estrutura de um teste
Dado:
fixtures, inicializando cdigo a ser testado
Quando:
exercitar cdigo a ser testado
Ento:
verifica se resultado o esperado
Estrutura de um teste
Dado:
fixtures, inicializando cdigo a ser testado
Quando:
exercitar cdigo a ser testado
Ento:
verifica se resultado o esperado
Parte mais importante e mais fcil de errar
Verificar a coisa
errada atrapalha
mais do que ajuda
def test_device_should_be_connected(self):
# when:
report = get_status_report(self.device)
# then:
self.assertTrue('connected' in report)
def test_device_should_be_connected(self):
# when:
report = get_status_report(self.offline_device)
# then:
self.assertTrue('connected' in report)
Dubls de teste
(test doubles)
Para quando voc
quiser poupar o oficial
Corrigindo...
def test_device_should_be_connected(self):
# when:
report = get_status_report(self.offline_device)
# then:
self.assertRegexpMatches(report, r'\bconnected')
Agora, sim!
def test_device_should_be_connected(self):
# when:
report = get_status_report(self.device)
# then:
self.assertRegexpMatches(report, r'\bconnected')
s para preencher argumentos (geralmente vazios, tipo None, [], {}, etc)
Fakes
Stubs
simulam respostas prontas para chamadas feitas pelo cdigo sendo testado
Mocks
Biblioteca mock:
use para stubs ou
para mocks
(demo rpida da
classe mock.Mock)
VCR.py https://pypi.python.org/pypi/vcrpy
Tox: https://tox.readthedocs.org
py.test http://pytest.org/
Nose: https://nose.readthedocs.org
ltimos pensamentos...
Testar a coisa certa, na camada correta, s vezes difcil
de descobrir. Idia: pensar o que mais provvel mudar.
Bom design recebe bem as mudanas - Jos Ricardo
Isto vale para o cdigo dos testes tambm, mas os tipos
de coisas que causam mudanas so diferentes.
Geralmente, cdigo de teste melhor bem direto
(mnima indireo, sem muita herana e/ou OO)
Algumas referncias:
FIM
Thanks!
Elias Dorneles
@eliasdorneles
http://blog.solidcraft.
eu/2012/09/test-driven-trapspart-1.html
http://martinfowler.
com/articles/mocksArentStubs.
html
https://www.destroyallsoftware.
com/screencasts/catalog
https://www.facebook.
com/notes/kent-beck/when-tdddoesntmatter/797644973601702
Livro do Michael Feathers