testes e depuração de código com python

48
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

Upload: dorneles-tremea

Post on 29-Jan-2018

3.326 views

Category:

Technology


0 download

TRANSCRIPT

Page 1: 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

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

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

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
Page 5: Testes e depuração de código com Python

Testes:

‣ Unidade / Integração / Sistema

‣ Carga / Desempenho

‣ Confiabilidade / Recuperação

‣ Aceitação / Usabilidade

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

Testes de Unidadee de Integração

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

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
Page 9: Testes e depuração de código com Python

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
Page 11: Testes e depuração de código com Python

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

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
Page 14: Testes e depuração de código com Python

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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
Page 46: Testes e depuração de código com Python

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

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

Contato

‣ Muito obrigado!

‣ Dorneles Treméa <[email protected]>

‣ APyB / X3ng / Enfold / GTiC

‣ Twitter: @dorneles, @apyb, @pythonbrasil