7/25/2019 Testando Cdigo Em Python
1/39
Testando cdigo em PythonElias Dorneles@eliasdorneles
7/25/2019 Testando Cdigo Em Python
2/39
Ouvi falar de TDDp
1a vez em 2009
7/25/2019 Testando Cdigo Em Python
3/39
Mas levei anos
para ver vantagem.
7/25/2019 Testando Cdigo Em Python
4/39
YMMVSua experincia pode ser difere
7/25/2019 Testando Cdigo Em Python
5/39
Com dez anos deexperincia, a gente
ainda adolescente=)
7/25/2019 Testando Cdigo Em Python
6/39
Complexidade pode te deixar decorao partido
7/25/2019 Testando Cdigo Em Python
7/39
Consigo ir mais longe Reduz a quantidade de adivinhao Por conseguinte, reduz minha ansiedade
PORM: no ajuda se falta feedback para mais amplas (tipo: estou criando o produto
Por que legal escrever testes?
7/25/2019 Testando Cdigo Em Python
8/39
TDD is cool.Porm, mais comum m
encontrar escrevendotestes para cdigo lega
7/25/2019 Testando Cdigo Em Python
9/39
Bugstendemreaparecer
i nis qui traveiz...
7/25/2019 Testando Cdigo Em Python
10/39
Regra de ouro:quando encontrar bug,
adicione um caso parapeg-lo.
7/25/2019 Testando Cdigo Em Python
11/39
Cheap trick
$ python meu_script.py out.t
$ diff
7/25/2019 Testando Cdigo Em Python
12/39
Cheap trick
$ python meu_script.py out.t
$ diff
7/25/2019 Testando Cdigo Em Python
13/39
Para cobrir maiscasos, basta usar
outros arquivos.
7/25/2019 Testando Cdigo Em Python
14/39
Sute de testes
$ cat run_tests.sh
#!/bin/bash
set-e
diff
7/25/2019 Testando Cdigo Em Python
15/39
Sute de testes
$ cat run_tests.sh
#!/bin/bash
set-e
diff
7/25/2019 Testando Cdigo Em Python
16/39
Sute de testes
$ cat run_tests.sh
#!/bin/bash
set-e
diff
7/25/2019 Testando Cdigo Em Python
17/39
Sute de testes
$ cat run_tests.sh
#!/bin/bash
set-e
diff
7/25/2019 Testando Cdigo Em Python
18/39
Sute de testes
$ cat run_tests.sh
#!/bin/bash
set-e
diff
7/25/2019 Testando Cdigo Em Python
19/39
Having a test suite i
swee
7/25/2019 Testando Cdigo Em Python
20/39
Estrutura de um teste
Dado: fixtures, inicializando cdigo a ser te Quando: exercitar cdigo a ser testado
Ento: verifica se resultado o esperado
7/25/2019 Testando Cdigo Em Python
21/39
Show me some code!
importunittest
classExampleCase(unittest.TestCase):
deftest_something(self):
# given:
fixture = self.build_fixture(...)
# when: resultado = codigo_a_testar(fixture)
# then:
self.assertEqual(esperado, resultado)
7/25/2019 Testando Cdigo Em Python
22/39
Estrutura de um teste
Dado: fixtures, inicializando cdigo a ser te Quando: exercitar cdigo a ser testado
Ento: verifica se resultado o esperado
Parte mais
7/25/2019 Testando Cdigo Em Python
23/39
Estrutura de um teste
Dado: fixtures, inicializando cdigo a ser te Quando: exercitar cdigo a ser testado
Ento: verifica se resultado o esperado
Parte mais importante e mais fcil d
7/25/2019 Testando Cdigo Em Python
24/39
Verificar a coisa
erradaatrapalhamais do que ajuda
7/25/2019 Testando Cdigo Em Python
25/39
Exemplo com bug na verificao
deftest_device_should_be_connected(self):
# when:
report = get_status_report(self.device)
# then: self.assertTrue('connected'inreport)
7/25/2019 Testando Cdigo Em Python
26/39
Para ter certeza que eschecando a coisa certa
faa o teste falhar
7/25/2019 Testando Cdigo Em Python
27/39
Fazendo o teste falhar
deftest_device_should_be_connected(self):
# when:
report = get_status_report(self.offline_de
# then: self.assertTrue('connected'inreport)
OOOPS! Teste continua pas
7/25/2019 Testando Cdigo Em Python
28/39
Dubls de teste(test doubles)Para quando voc
quiser poupar o oficial
7/25/2019 Testando Cdigo Em Python
29/39
Corrigindo...
deftest_device_should_be_connected(self):
# when:
report = get_status_report(self.offline_de
# then: self.assertRegexpMatches(report, r'\bconne
Agora o teste falha, como es
7/25/2019 Testando Cdigo Em Python
30/39
Agora, sim!
deftest_device_should_be_connected(self):
# when:
report = get_status_report(self.device)
# then: self.assertRegexpMatches(report, r'\bconne
7/25/2019 Testando Cdigo Em Python
31/39
Tipos de dubls de teste
Dummy s para preencher argumentos (geralmente vazios, tipo None,
Fakes implementao leve duma dependncia (exemplo: DB em mem
Stubs simulam respostas prontas para chamadas feitas pelo cdigo
Mocks especificam contrato com cdigo sendo testado (possuem asse
7/25/2019 Testando Cdigo Em Python
32/39
Biblioteca mock:use para stubsou
para mocks
https://pypi.python.org/pypi/mockhttps://pypi.python.org/pypi/mock7/25/2019 Testando Cdigo Em Python
33/39
(demo rpida da
classe mock.Mock)
7/25/2019 Testando Cdigo Em Python
34/39
Python context manag
ro
7/25/2019 Testando Cdigo Em Python
35/39
Context managers ajudam com captura/c
@contextmanager
defscript_args(argv):
old_argv = sys.argv
try:
sys.argv = ['fake_script.py'] + argv
yieldsys.argv
finally:
sys.argv = old_argv
7/25/2019 Testando Cdigo Em Python
36/39
Context managers ajudam com captura/c
# USANDO:
withscript_args(['--opcao1', '--opcao2']):
print(sys.argv)
# vai mostrar:
# ['fake_script.py', '--opcao1', '--opcao2']
7/25/2019 Testando Cdigo Em Python
37/39
Mais ferramentas legais
VCR.py https://pypi.python.org/pypi/v Tox: https://tox.readthedocs.org py.test http://pytest.org/ Nose: https://nose.readthedocs.org
Wishlist: RSpec para Python (http://rspec
http://rspec.info/https://nose.readthedocs.org/https://nose.readthedocs.org/http://pytest.org/https://pypi.python.org/pypi/vcrpyhttps://pypi.python.org/pypi/vcrpyhttp://rspec.info/https://nose.readthedocs.org/http://pytest.org/http://tox.readthedocs.org/https://pypi.python.org/pypi/vcrpy7/25/2019 Testando Cdigo Em Python
38/39
ltimos pensamentos...
Testar a coisa certa, na camada correta, s vezes
de descobrir. Idia: pensar o que mais provvel Bom design recebe bem as mudanas- Jos Ric
Isto vale para o cdigo dos testes tambm, made coisas que causam mudanas so diferentes
Geralmente, cdigo de teste melhor bem dire(mnima indireo, sem muita herana e/ou O
Al f
7/25/2019 Testando Cdigo Em Python
39/39
FIMThanks!
Algumas refernc
http://blog.solidcraeu/2012/09/test-d
part-1.html http://martinfowle
com/articles/mockshtml
https://www.destr
com/screencasts/ca https://www.faceb
com/notes/kent-becdoesnt-matter/797644973
Livro do Michael F
Elias Dorneles
@eliasdorneles
https://www.facebook.com/notes/kent-beck/when-tdd-doesnt-matter/797644973601702https://www.facebook.com/notes/kent-beck/when-tdd-doesnt-matter/797644973601702https://www.facebook.com/notes/kent-beck/when-tdd-doesnt-matter/797644973601702https://www.facebook.com/notes/kent-beck/when-tdd-doesnt-matter/797644973601702https://www.destroyallsoftware.com/screencasts/cataloghttps://www.destroyallsoftware.com/screencasts/cataloghttp://martinfowler.com/articles/mocksArentStubs.htmlhttp://martinfowler.com/articles/mocksArentStubs.htmlhttp://martinfowler.com/articles/mocksArentStubs.htmlhttp://blog.solidcraft.eu/2012/09/test-driven-traps-part-1.htmlhttp://blog.solidcraft.eu/2012/09/test-driven-traps-part-1.htmlhttp://blog.solidcraft.eu/2012/09/test-driven-traps-part-1.htmlTop Related