Download - Testes e depuração de código com Python
![Page 1: Testes e depuração de código com Python](https://reader034.vdocuments.site/reader034/viewer/2022050613/5491f5dfb47959c92b8b4713/html5/thumbnails/1.jpg)
Testes e Depuraçãode Código com
PythonCONSEGI, Brasília
20 de Agosto de 2010
http://www.python.org.brhttp://associacao.python.org.br
![Page 2: Testes e depuração de código com Python](https://reader034.vdocuments.site/reader034/viewer/2022050613/5491f5dfb47959c92b8b4713/html5/thumbnails/2.jpg)
Agenda‣ Visão geral sobre testes de software
‣ Técnicas, processos e ferramentas de testes
‣ Visão geral sobre depuração de software
‣ Técnicas, processos e ferramentas de depuração
![Page 3: Testes e depuração de código com Python](https://reader034.vdocuments.site/reader034/viewer/2022050613/5491f5dfb47959c92b8b4713/html5/thumbnails/3.jpg)
O que esta oficina ‣ 100% prática
‣ Uma referência completa sobre o assunto
‣ Algo muito útil para desenvolvedores já experientes
‣ A solução para todos os seus problemas
‣ Então para começar descontraído...
![Page 4: Testes e depuração de código com Python](https://reader034.vdocuments.site/reader034/viewer/2022050613/5491f5dfb47959c92b8b4713/html5/thumbnails/4.jpg)
![Page 5: Testes e depuração de código com Python](https://reader034.vdocuments.site/reader034/viewer/2022050613/5491f5dfb47959c92b8b4713/html5/thumbnails/5.jpg)
Testes:
‣ Unidade / Integração / Sistema
‣ Carga / Desempenho
‣ Confiabilidade / Recuperação
‣ Aceitação / Usabilidade
![Page 6: Testes e depuração de código com Python](https://reader034.vdocuments.site/reader034/viewer/2022050613/5491f5dfb47959c92b8b4713/html5/thumbnails/6.jpg)
Testes de Unidadee de Integração
![Page 7: Testes e depuração de código com Python](https://reader034.vdocuments.site/reader034/viewer/2022050613/5491f5dfb47959c92b8b4713/html5/thumbnails/7.jpg)
Testes: Princípios‣ Para cada entrada, definir a saída
esperada
‣ Deve testar uma entrada por vez
‣ Deve testar entradas válidas e inválidas
‣ Deve agregar valor ao software
‣ E se você falhar...
![Page 8: Testes e depuração de código com Python](https://reader034.vdocuments.site/reader034/viewer/2022050613/5491f5dfb47959c92b8b4713/html5/thumbnails/8.jpg)
![Page 9: Testes e depuração de código com Python](https://reader034.vdocuments.site/reader034/viewer/2022050613/5491f5dfb47959c92b8b4713/html5/thumbnails/9.jpg)
Testes: ‣ Devem rodar sem interação humana
na entrada de dados
‣ Devem verificar os resultados sem interação humana
‣ Devem rodar de forma independente, sem que um teste cause efeitos colaterais em outros
‣ Se causar...
![Page 10: Testes e depuração de código com Python](https://reader034.vdocuments.site/reader034/viewer/2022050613/5491f5dfb47959c92b8b4713/html5/thumbnails/10.jpg)
![Page 11: Testes e depuração de código com Python](https://reader034.vdocuments.site/reader034/viewer/2022050613/5491f5dfb47959c92b8b4713/html5/thumbnails/11.jpg)
Testes: Vantagens‣ Garante que o código funcione da
forma esperada, para as situações testadas
‣ Serve como exemplo/modelo de como o código desenvolvido pode/deve ser usado
‣ Dá segurança ao desenvolvedor (ou a outros membos da equipe de desenvolvimento) para efetuar
![Page 12: Testes e depuração de código com Python](https://reader034.vdocuments.site/reader034/viewer/2022050613/5491f5dfb47959c92b8b4713/html5/thumbnails/12.jpg)
Testes: ‣ Alguns testes podem demandar
bastante tempo para serem escritos
‣ O desenvolvedor passa a ter que manter o código e os testes do código
‣ Testes não garantem código sem bugs
‣ Obviamente tinha que existir algo ruim...
![Page 13: Testes e depuração de código com Python](https://reader034.vdocuments.site/reader034/viewer/2022050613/5491f5dfb47959c92b8b4713/html5/thumbnails/13.jpg)
![Page 14: Testes e depuração de código com Python](https://reader034.vdocuments.site/reader034/viewer/2022050613/5491f5dfb47959c92b8b4713/html5/thumbnails/14.jpg)
Martin Fowler Rules‣ Não tenha medo de modificar o
código
‣ Integre cedo, integre frequentemente
‣ Sempre escreva testes
‣ Sempre rode seus testes
‣ Sempre preste atenção quando os seus testes falharem
![Page 15: Testes e depuração de código com Python](https://reader034.vdocuments.site/reader034/viewer/2022050613/5491f5dfb47959c92b8b4713/html5/thumbnails/15.jpg)
Testes: Golden ‣ Os testes devem ser reproduzíveis
em todos os aspectos: atenção especial quando usar data, hora, fuso horário, arredondamento, variáveis de ambiente, ...
‣ Sempre teste as condições de borda/limite: minuto e segundo antes e depois da meia-noite, primeiro/último elementos
![Page 16: Testes e depuração de código com Python](https://reader034.vdocuments.site/reader034/viewer/2022050613/5491f5dfb47959c92b8b4713/html5/thumbnails/16.jpg)
Testivus
‣ Livreto “A Maneira de Testivus”
‣ http://tinyurl.com/testivus
‣ http://tinyurl.com/testivus-pt-br
![Page 17: Testes e depuração de código com Python](https://reader034.vdocuments.site/reader034/viewer/2022050613/5491f5dfb47959c92b8b4713/html5/thumbnails/17.jpg)
Módulo unittest‣ Baseado no JUnit do Java (que por
sua vez foi baseado no framework de testes do Smalltalk), introduzido na versão 2.1 do Python
‣ http://docs.python.org/library/unittest.html
‣ assertEqual, assertNotEqual, assertRaises, assertTrue, assertFalse, ...
![Page 18: Testes e depuração de código com Python](https://reader034.vdocuments.site/reader034/viewer/2022050613/5491f5dfb47959c92b8b4713/html5/thumbnails/18.jpg)
Nomenclatura‣ Test: teste propriamente dito
‣ Test Fixture: preparação necessária para rodar um ou mais testes
‣ Test Case: agrupamento diferentes testes sobre um mesmo assunto
‣ Test Suite: agrupamento diferentes testes ou Test Cases que devem ser executados juntos
![Page 19: Testes e depuração de código com Python](https://reader034.vdocuments.site/reader034/viewer/2022050613/5491f5dfb47959c92b8b4713/html5/thumbnails/19.jpg)
Testes: Fixture
‣ setUp: método executado antes de cada teste, usado para fornecer qualquer inicialização necessária
‣ tearDown: método executado após cada teste, usado para limpar a inicialização utilizada
![Page 20: Testes e depuração de código com Python](https://reader034.vdocuments.site/reader034/viewer/2022050613/5491f5dfb47959c92b8b4713/html5/thumbnails/20.jpg)
Testes: TestCase 1 import unittest 2 import calculadora 3 4 class CalculadoraTestCase(unittest.TestCase): 5 6 def setUp(self): 7 self.calc = calculadora.Calc() 8 9 def test_soma(self):10 self.assertEqual(self.calc.soma(1, 1), 2)11 12 def test_divide(self):13 self.assertEqual(self.calc.divide(8, 2), 4)
![Page 21: Testes e depuração de código com Python](https://reader034.vdocuments.site/reader034/viewer/2022050613/5491f5dfb47959c92b8b4713/html5/thumbnails/21.jpg)
Testes: TestSuite 1 import unittest 2 import calculadora 3 4 class BasicoTestCase(unittest.TestCase): 5 ...
23 class AvancadoTestCase(unittest.TestCase):24 ...
38 def suite():39 suite = unittest.TestSuite()40 suite.addTest(unittest.makeSuite(BasicoTestCase))41 suite.addTest(unittest.makeSuite(AvancadoTestCase))42 return suite
![Page 22: Testes e depuração de código com Python](https://reader034.vdocuments.site/reader034/viewer/2022050613/5491f5dfb47959c92b8b4713/html5/thumbnails/22.jpg)
Preparação ‣ virtualenv está instalado?
‣ Não?
‣ wget http://tinyurl.com/virtualenv-trunk
‣ python virtualenv.py oficina
‣ Sim?
‣ virtualenv oficina
![Page 23: Testes e depuração de código com Python](https://reader034.vdocuments.site/reader034/viewer/2022050613/5491f5dfb47959c92b8b4713/html5/thumbnails/23.jpg)
Preparação
‣ cd oficina
‣ source bin/activate
‣ easy_install pip
‣ pip install ZopeSkel
‣mkdir src
![Page 24: Testes e depuração de código com Python](https://reader034.vdocuments.site/reader034/viewer/2022050613/5491f5dfb47959c92b8b4713/html5/thumbnails/24.jpg)
Criando Pacote
‣ cd oficina/src
‣ zopeskel basic_namespace consegi.exemplo
‣ cd consegi.exemplo
‣ python setup.py develop
![Page 25: Testes e depuração de código com Python](https://reader034.vdocuments.site/reader034/viewer/2022050613/5491f5dfb47959c92b8b4713/html5/thumbnails/25.jpg)
Adicionando Pacote
‣ cd oficina
‣ cd src/consegi.exemplo/consegi/exemplo
‣mkdir tests
‣ touch tests/__init__.py
![Page 26: Testes e depuração de código com Python](https://reader034.vdocuments.site/reader034/viewer/2022050613/5491f5dfb47959c92b8b4713/html5/thumbnails/26.jpg)
Primeiro TesteMódulo: oficina/src/consegi.exemplo/consegi/exemplo/tests/test_basic.py 1 import unittest 2 3 4 class BasicTestCase(unittest.TestCase): 5 6 def test_true_is_one(self): 7 self.assertEqual(True, 1) 8 9 10 if __name__ == '__main__':11 unittest.main()
![Page 27: Testes e depuração de código com Python](https://reader034.vdocuments.site/reader034/viewer/2022050613/5491f5dfb47959c92b8b4713/html5/thumbnails/27.jpg)
Rodando o teste
‣ cd oficina
‣ cd src/consegi.exemplo/consegi/exemplo
‣ python tests/test_basic.py
![Page 28: Testes e depuração de código com Python](https://reader034.vdocuments.site/reader034/viewer/2022050613/5491f5dfb47959c92b8b4713/html5/thumbnails/28.jpg)
Utilizando Test ‣ cd oficina/src/consegi.exemplo
‣ py.test
‣ pip install py
‣ py.test
‣ nose
‣ pip install nose
‣ nosetests
![Page 29: Testes e depuração de código com Python](https://reader034.vdocuments.site/reader034/viewer/2022050613/5491f5dfb47959c92b8b4713/html5/thumbnails/29.jpg)
Adicionando ‣ Módulo: oficina/src/
consegi.exemplo/setup.pysetup(... ... test_suite = 'nose.collector', ... )
‣ cd oficina/src/consegi.exemplo
‣ python setup.py test
![Page 30: Testes e depuração de código com Python](https://reader034.vdocuments.site/reader034/viewer/2022050613/5491f5dfb47959c92b8b4713/html5/thumbnails/30.jpg)
Módulo doctest 1/2‣ Módulo: oficina/src/
consegi.exemplo/consegi/exemplo/__init__.py
1 def soma(a, b): 2 """Soma dois valores. 3 4 >>> soma(1, 1) 5 2 6 >>> soma(2, 3) 7 5 8 """ 9 10 return a + b
![Page 31: Testes e depuração de código com Python](https://reader034.vdocuments.site/reader034/viewer/2022050613/5491f5dfb47959c92b8b4713/html5/thumbnails/31.jpg)
Módulo doctest 2/2 ...
11 if __name__ == "__main__":12 import doctest13 doctest.testmod()
‣ http://docs.python.org/library/doctest.html
‣ cd oficina/src/consegi.exemplo
‣ python __init__.py
‣ nosetests --with-doctest
![Page 32: Testes e depuração de código com Python](https://reader034.vdocuments.site/reader034/viewer/2022050613/5491f5dfb47959c92b8b4713/html5/thumbnails/32.jpg)
Code Test Coverage‣ coverage / pytest-coverage / nose-
cov
‣ coverage run program.py arg1 arg2
‣ coverage report -m
‣ coverage html
‣ py.test --cover=consegi.exemplo
‣ nosetests --with-cov --cov
![Page 33: Testes e depuração de código com Python](https://reader034.vdocuments.site/reader034/viewer/2022050613/5491f5dfb47959c92b8b4713/html5/thumbnails/33.jpg)
Testivus: Coverage Numa manhã bem cedo um jovem programador perguntou ao Grande Mestre:- “Estou pronto para escrever alguns testes de unidade. Qual a cobertura que devo buscar?”O Grande Mestre respondeu: “Não se preocupe com a cobertura, apenas escreva bons testes.”
![Page 34: Testes e depuração de código com Python](https://reader034.vdocuments.site/reader034/viewer/2022050613/5491f5dfb47959c92b8b4713/html5/thumbnails/34.jpg)
Testivus: Coverage Mais tarde naquele dia, um segundo programador perguntou a mesma coisa.O Grande Mestre então apontou para uma panela com água fervente e disse:- “Quantos grãos de arroz devo colocar na panela?”
![Page 35: Testes e depuração de código com Python](https://reader034.vdocuments.site/reader034/viewer/2022050613/5491f5dfb47959c92b8b4713/html5/thumbnails/35.jpg)
Testivus: Coverage O programador, perplexo, respondeu:- “Como poderei dizer? Depende de quantas pessoas você pretende alimentar, de quão famintas elas estão, que outras comidas serão servidas, quanto arroz está disponível e assim por diante!”- “Exatamente!”, disse o Grande Mestre.
![Page 36: Testes e depuração de código com Python](https://reader034.vdocuments.site/reader034/viewer/2022050613/5491f5dfb47959c92b8b4713/html5/thumbnails/36.jpg)
Testivus: Coverage Perto do fim do dia, um terceiro programador veio e fez a mesma pergunta sobre cobertura de código.“Oitenta porcento, no mínimo!”, respondeu o Grande Mestre em voz firme, batendo o punho na mesa!O terceiro programador sorriu, curvou-se e saiu.
![Page 37: Testes e depuração de código com Python](https://reader034.vdocuments.site/reader034/viewer/2022050613/5491f5dfb47959c92b8b4713/html5/thumbnails/37.jpg)
Testivus: Coverage Após essa última resposta, um jovem aprendiz aproximou-se do Grande Mestre e perguntou:- “Grande mestre, hoje eu ouvi o senhor responder a mesma pergunta sobre cobertura de código com 3 diferentes respostas. Por quê?”O Grande mestre levantou-se de sua cadeira:
![Page 38: Testes e depuração de código com Python](https://reader034.vdocuments.site/reader034/viewer/2022050613/5491f5dfb47959c92b8b4713/html5/thumbnails/38.jpg)
Testivus: Coverage Depois deles encherem suas xícaras com o chá verde quente e fumegante, o Grande Mestre começou:- “O primeiro programador é novo e está apenas iniciando com os testes. No momento ele tem um monte de código e nenhum teste. Ele tem um longo caminho a percorrer; focando na cobertura de código neste momento seria deprimente e completamente
![Page 39: Testes e depuração de código com Python](https://reader034.vdocuments.site/reader034/viewer/2022050613/5491f5dfb47959c92b8b4713/html5/thumbnails/39.jpg)
Testivus: Coverage - “É melhor ele apenas se acostumar a escrever e executar alguns testes. Ele pode se preocupar com a cobertura do código mais tarde.”- “O segundo programador, por outro lado, é bastante experiente tanto na programação quanto nos testes. Quando eu respondi, pedindo-lhe quantos grãos de arroz deveriam ser colocados na panela, ajudei-o a
![Page 40: Testes e depuração de código com Python](https://reader034.vdocuments.site/reader034/viewer/2022050613/5491f5dfb47959c92b8b4713/html5/thumbnails/40.jpg)
Testivus: Coverage - “Ele conhece esse fatores melhor do que eu, afinal é seu código. Não existe uma única, simples, resposta, e ele é inteligente o suficiente para lidar com a verdade e trabalhar com isso."- “Eu compreendo”, disse o jovem aprendiz, mas se não há uma resposta simples e única, então por que o senhor disse ao terceiro programador: “Oitenta porcento, no mínimo!”?
![Page 41: Testes e depuração de código com Python](https://reader034.vdocuments.site/reader034/viewer/2022050613/5491f5dfb47959c92b8b4713/html5/thumbnails/41.jpg)
Testivus: Coverage O Grande Mestre caiu na gargalhada e completou:- “O terceiro programador só quer respostas simples, mesmo quando não existem essas respostas simples... e no fim ele ainda acaba não seguindo elas!”O jovem aprendiz e o Grande Mestre grisalho terminaram de beber o chá, contemplando, em silêncio.
![Page 42: Testes e depuração de código com Python](https://reader034.vdocuments.site/reader034/viewer/2022050613/5491f5dfb47959c92b8b4713/html5/thumbnails/42.jpg)
Depuração de ‣ Nem sempre é possível escrever
código do zero, com testes como deveria ser
‣ Muitas vezes precisamos integrar aplicações com bases de código desconhecidas, não documentadas esem testes...
‣ Pior ainda: quando você tiver que
![Page 43: Testes e depuração de código com Python](https://reader034.vdocuments.site/reader034/viewer/2022050613/5491f5dfb47959c92b8b4713/html5/thumbnails/43.jpg)
Técnicas Depuração
‣ achômetro / tentativa-e-erro
‣ print / pprint
‣ logging
‣ real debuggers
![Page 44: Testes e depuração de código com Python](https://reader034.vdocuments.site/reader034/viewer/2022050613/5491f5dfb47959c92b8b4713/html5/thumbnails/44.jpg)
Ferramentas
‣ import code; code.interact(local=locals())
‣ import pdb; pdb.set_trace()
‣ import ipdb; ipdb.set_trace()
‣ winpdb
‣ E se tudo mais der errado...
![Page 45: Testes e depuração de código com Python](https://reader034.vdocuments.site/reader034/viewer/2022050613/5491f5dfb47959c92b8b4713/html5/thumbnails/45.jpg)
![Page 46: Testes e depuração de código com Python](https://reader034.vdocuments.site/reader034/viewer/2022050613/5491f5dfb47959c92b8b4713/html5/thumbnails/46.jpg)
Referências 1/2‣ http://diveintopython.org/unit_testing/diving_in.html
‣ http://revista.python.org.ar/1/html/revista.html#introduccion-a-unit-testing-con-python
‣ http://www.zdnet.com/blog/burnette/three-rules-for-writing-good-unit-tests/179
‣ http://bryanpendleton.blogspot.com/2010/08/bug-fixing-and-broken-windows.html
‣ http://www.makinggoodsoftware.com/2009/08/05/how-to-write-good-tests/
‣ http://googletesting.blogspot.com/
‣ http://blog.stevensanderson.com/2009/08/24/writing-great-unit-tests-best-and-worst-practises/
‣ http://www.scribd.com/doc/69769/TheWayOfTestivus
‣ http://mfandrade.wordpress.com/2009/06/27/a-maneira-de-testivus/
![Page 47: Testes e depuração de código com Python](https://reader034.vdocuments.site/reader034/viewer/2022050613/5491f5dfb47959c92b8b4713/html5/thumbnails/47.jpg)
Referências 2/2‣ http://pythonconquerstheuniverse.wordpress.com/category/the-python-
debugger/
‣ http://aymanh.com/python-debugging-techniques
‣ http://stackoverflow.com/questions/1623039/python-debugging-tips
‣ http://stackoverflow.com/questions/81584/what-ide-to-use-for-python
‣ http://wiki.python.org/moin/PythonDebuggers
‣ http://wiki.python.org/moin/IntegratedDevelopmentEnvironments
‣ http://winpdb.org/tutorial/WinpdbTutorial.html
‣ http://asmeurersympy.wordpress.com/2010/06/04/pudb-a-better-python-debugger/
‣ http://appengine-cookbook.appspot.com/recipe/firepython-logger-console-inside-firebug/
‣ http://gilesbowkett.blogspot.com/2007/10/debugger-support-considered-harmful.html
![Page 48: Testes e depuração de código com Python](https://reader034.vdocuments.site/reader034/viewer/2022050613/5491f5dfb47959c92b8b4713/html5/thumbnails/48.jpg)
Contato
‣ Muito obrigado!
‣ Dorneles Treméa <[email protected]>
‣ APyB / X3ng / Enfold / GTiC
‣ Twitter: @dorneles, @apyb, @pythonbrasil