Download - Testes e depuração de código com Python
Testes e Depuraçãode Código com
PythonCONSEGI, Brasília
20 de Agosto de 2010
http://www.python.org.brhttp://associacao.python.org.br
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
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...
Testes:
‣ Unidade / Integração / Sistema
‣ Carga / Desempenho
‣ Confiabilidade / Recuperação
‣ Aceitação / Usabilidade
Testes de Unidadee de Integração
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...
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...
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
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...
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
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
Testivus
‣ Livreto “A Maneira de Testivus”
‣ http://tinyurl.com/testivus
‣ http://tinyurl.com/testivus-pt-br
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, ...
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
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
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)
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
Preparação ‣ virtualenv está instalado?
‣ Não?
‣ wget http://tinyurl.com/virtualenv-trunk
‣ python virtualenv.py oficina
‣ Sim?
‣ virtualenv oficina
Preparação
‣ cd oficina
‣ source bin/activate
‣ easy_install pip
‣ pip install ZopeSkel
‣mkdir src
Criando Pacote
‣ cd oficina/src
‣ zopeskel basic_namespace consegi.exemplo
‣ cd consegi.exemplo
‣ python setup.py develop
Adicionando Pacote
‣ cd oficina
‣ cd src/consegi.exemplo/consegi/exemplo
‣mkdir tests
‣ touch tests/__init__.py
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()
Rodando o teste
‣ cd oficina
‣ cd src/consegi.exemplo/consegi/exemplo
‣ python tests/test_basic.py
Utilizando Test ‣ cd oficina/src/consegi.exemplo
‣ py.test
‣ pip install py
‣ py.test
‣ nose
‣ pip install nose
‣ nosetests
Adicionando ‣ Módulo: oficina/src/
consegi.exemplo/setup.pysetup(... ... test_suite = 'nose.collector', ... )
‣ cd oficina/src/consegi.exemplo
‣ python setup.py test
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
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
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
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.”
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?”
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.
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.
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:
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
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
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!”?
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.
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
Técnicas Depuração
‣ achômetro / tentativa-e-erro
‣ print / pprint
‣ logging
‣ real debuggers
Ferramentas
‣ import code; code.interact(local=locals())
‣ import pdb; pdb.set_trace()
‣ import ipdb; ipdb.set_trace()
‣ winpdb
‣ E se tudo mais der errado...
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/
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
Contato
‣ Muito obrigado!
‣ Dorneles Treméa <[email protected]>
‣ APyB / X3ng / Enfold / GTiC
‣ Twitter: @dorneles, @apyb, @pythonbrasil