Testes e depuração de código com Python

2,984 views
2,825 views

Published on

Published in: Technology
0 Comments
3 Likes
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total views
2,984
On SlideShare
0
From Embeds
0
Number of Embeds
2
Actions
Shares
0
Downloads
46
Comments
0
Likes
3
Embeds 0
No embeds

No notes for slide
















































  • Testes e depuração de código com Python

    1. 1. Testes e Depuração de Código com Python CONSEGI, Brasília 20 de Agosto de 2010 http://www.python.org.br http://associacao.python.org.br
    2. 2. 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
    3. 3. 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...
    4. 4. Testes: ‣ Unidade / Integração / Sistema ‣ Carga / Desempenho ‣ Confiabilidade / Recuperação ‣ Aceitação / Usabilidade
    5. 5. Testes de Unidade e de Integração
    6. 6. 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...
    7. 7. 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...
    8. 8. 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
    9. 9. 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...
    10. 10. 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
    11. 11. 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
    12. 12. Testivus ‣ Livreto “A Maneira de Testivus” ‣ http://tinyurl.com/testivus ‣ http://tinyurl.com/testivus-pt-br
    13. 13. 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, ...
    14. 14. 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
    15. 15. 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
    16. 16. 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)
    17. 17. 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
    18. 18. Preparação ‣ virtualenv está instalado? ‣ Não? ‣ wget http://tinyurl.com/ virtualenv-trunk ‣ python virtualenv.py oficina ‣ Sim? ‣ virtualenv oficina
    19. 19. Preparação ‣ cd oficina ‣ source bin/activate ‣ easy_install pip ‣ pip install ZopeSkel ‣ mkdir src
    20. 20. Criando Pacote ‣ cd oficina/src ‣ zopeskel basic_namespace consegi.exemplo ‣ cd consegi.exemplo ‣ python setup.py develop
    21. 21. Adicionando Pacote ‣ cd oficina ‣ cd src/consegi.exemplo/consegi/ exemplo ‣ mkdir tests ‣ touch tests/__init__.py
    22. 22. Primeiro Teste Mó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()
    23. 23. Rodando o teste ‣ cd oficina ‣ cd src/consegi.exemplo/consegi/ exemplo ‣ python tests/test_basic.py
    24. 24. Utilizando Test ‣ cd oficina/src/consegi.exemplo ‣ py.test ‣ pip install py ‣ py.test ‣ nose ‣ pip install nose ‣ nosetests
    25. 25. Adicionando ‣ Módulo: oficina/src/ consegi.exemplo/setup.py setup(... ... test_suite = 'nose.collector', ... ) ‣ cd oficina/src/consegi.exemplo ‣ python setup.py test
    26. 26. 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
    27. 27. Módulo doctest 2/2 ... 11 if __name__ == "__main__": 12     import doctest 13     doctest.testmod() ‣ http://docs.python.org/library/ doctest.html ‣ cd oficina/src/consegi.exemplo ‣ python __init__.py ‣ nosetests --with-doctest
    28. 28. 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
    29. 29. 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.”
    30. 30. 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?”
    31. 31. 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.
    32. 32. 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.
    33. 33. 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:
    34. 34. 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
    35. 35. 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
    36. 36. 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!”?
    37. 37. 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.
    38. 38. 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 e sem testes... ‣ Pior ainda: quando você tiver que
    39. 39. Técnicas Depuração ‣ achômetro / tentativa-e-erro ‣ print / pprint ‣ logging ‣ real debuggers
    40. 40. Ferramentas ‣ import code; code.interact(local=locals()) ‣ import pdb; pdb.set_trace() ‣ import ipdb; ipdb.set_trace() ‣ winpdb ‣ E se tudo mais der errado...
    41. 41. 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/
    42. 42. 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
    43. 43. Contato ‣ Muito obrigado! ‣ Dorneles Treméa <deo@python.org.br> ‣ APyB / X3ng / Enfold / GTiC ‣ Twitter: @dorneles, @apyb, @pythonbrasil

    ×