Testes e Depuração
  de Código com
      Python
        CONSEGI, Brasília
      20 de Agosto de 2010

     http://www.pyth...
Agenda
‣ Visão geral sobre testes de software
‣ Técnicas, processos e ferramentas
  de testes

‣ Visão geral sobre depuraç...
O que esta oficina
‣ 100% prática
‣ Uma referência completa sobre o
  assunto

‣ Algo muito útil para
  desenvolvedores já ...
Testes:

‣ Unidade / Integração / Sistema
‣ Carga / Desempenho
‣ Confiabilidade / Recuperação
‣ Aceitação / Usabilidade
Testes de Unidade
 e de Integração
Testes: Princípios
‣ Para cada entrada, definir a saída
  esperada

‣ Deve testar uma entrada por vez
‣ Deve testar entrada...
Testes:
‣ Devem rodar sem interação humana
  na entrada de dados

‣ Devem verificar os resultados sem
  interação humana

‣...
Testes: Vantagens
‣ Garante que o código funcione da
  forma esperada, para as situações
  testadas

‣ Serve como exemplo/...
Testes:
‣ Alguns testes podem demandar
  bastante tempo para serem escritos

‣ O desenvolvedor passa a ter que
  manter o ...
Martin Fowler Rules
‣ Não tenha medo de modificar o
  código

‣ Integre cedo, integre
  frequentemente

‣ Sempre escreva te...
Testes: Golden
‣ Os testes devem ser reproduzíveis
  em todos os aspectos: atenção
  especial quando usar data, hora,
  fu...
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), introduz...
Nomenclatura
‣ Test: teste propriamente dito
‣ Test Fixture: preparação necessária
  para rodar um ou mais testes

‣ Test ...
Testes: Fixture

‣ setUp: método executado antes de
  cada teste, usado para fornecer
  qualquer inicialização necessária
...
Testes: TestCase
 1   import unittest
 2   import calculadora
 3
 4   class CalculadoraTestCase(unittest.TestCase):
 5
 6 ...
Testes: TestSuite
 1   import unittest
 2   import calculadora
 3
 4   class BasicoTestCase(unittest.TestCase):
 5       ....
Preparação
‣ virtualenv está instalado?
 ‣ Não?
   ‣ wget http://tinyurl.com/
     virtualenv-trunk

   ‣ python virtualen...
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 devel...
Adicionando Pacote

‣ cd oficina
‣ cd src/consegi.exemplo/consegi/
  exemplo

‣ mkdir tests
‣ touch tests/__init__.py
Primeiro Teste
Módulo: oficina/src/consegi.exemplo/
consegi/exemplo/tests/test_basic.py
 1 import unittest
 2
 3
 4 class B...
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
   ‣ n...
Adicionando
‣ Módulo: oficina/src/
  consegi.exemplo/setup.py
  setup(...
     ...
     test_suite = 'nose.collector',
    ...
Módulo doctest 1/2
‣ Módulo: oficina/src/
     consegi.exemplo/consegi/exemplo/
     __init__.py
 1   def soma(a, b):
 2   ...
Módulo doctest 2/2
     ...
11 if __name__ == "__main__":
12     import doctest
13     doctest.testmod()



‣ http://docs....
Code Test Coverage
‣ coverage / pytest-coverage / nose-
  cov

  ‣ coverage run program.py arg1
    arg2

  ‣ coverage rep...
Testivus: Coverage
Numa manhã bem cedo um jovem
programador perguntou ao Grande
Mestre:
- “Estou pronto para escrever algu...
Testivus: Coverage
Mais tarde naquele dia, um segundo
programador perguntou a mesma
coisa.
O Grande Mestre então apontou p...
Testivus: Coverage
O programador, perplexo, respondeu:
- “Como poderei dizer? Depende de
quantas pessoas você pretende
ali...
Testivus: Coverage
Perto do fim do dia, um terceiro
programador veio e fez a mesma
pergunta sobre cobertura de código.
“Oit...
Testivus: Coverage
Após essa última resposta, um jovem
aprendiz aproximou-se do Grande
Mestre e perguntou:
- “Grande mestr...
Testivus: Coverage
Depois deles encherem suas xícaras
com o chá verde quente e fumegante, o
Grande Mestre começou:
- “O pr...
Testivus: Coverage
- “É melhor ele apenas se acostumar a
escrever e executar alguns testes. Ele
pode se preocupar com a co...
Testivus: Coverage
- “Ele conhece esse fatores melhor do
que eu, afinal é seu código. Não existe
uma única, simples, respos...
Testivus: Coverage
O Grande Mestre caiu na gargalhada e
completou:
- “O terceiro programador só quer
respostas simples, me...
Depuração de
‣ Nem sempre é possível escrever
  código do zero, com testes como
  deveria ser

‣ Muitas vezes precisamos i...
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()
...
Referências 1/2
‣   http://diveintopython.org/unit_testing/diving_in.html

‣   http://revista.python.org.ar/1/html/revista...
Referências 2/2
‣   http://pythonconquerstheuniverse.wordpress.com/category/the-python-
    debugger/

‣   http://aymanh.c...
Contato
‣ Muito obrigado!
‣ Dorneles Treméa
  <deo@python.org.br>

‣ APyB / X3ng / Enfold / GTiC
‣ Twitter: @dorneles, @ap...
Testes e depuração de código com Python
Testes e depuração de código com Python
Testes e depuração de código com Python
Testes e depuração de código com Python
Testes e depuração de código com Python
Próximos SlideShares
Carregando em…5
×

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

3.296 visualizações

Publicada em

Publicada em: Tecnologia
0 comentários
3 gostaram
Estatísticas
Notas
  • Seja o primeiro a comentar

Sem downloads
Visualizações
Visualizações totais
3.296
No SlideShare
0
A partir de incorporações
0
Número de incorporações
6
Ações
Compartilhamentos
0
Downloads
54
Comentários
0
Gostaram
3
Incorporações 0
Nenhuma incorporação

Nenhuma nota no 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

    ×