SlideShare une entreprise Scribd logo
1  sur  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
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 Unidade
 e 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 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()
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.py
  setup(...
     ...
     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 doctest
13     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 e
  sem 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
  <deo@python.org.br>

‣ APyB / X3ng / Enfold / GTiC
‣ Twitter: @dorneles, @apyb,
  @pythonbrasil

Contenu connexe

Tendances

Django Channels - Aplicações real time com Django
Django Channels - Aplicações real time com DjangoDjango Channels - Aplicações real time com Django
Django Channels - Aplicações real time com DjangoPaula Grangeiro
 
TypeScript - Campus party 2013
TypeScript - Campus party 2013TypeScript - Campus party 2013
TypeScript - Campus party 2013Giovanni Bassi
 
Vagrant você deveria está usando
Vagrant   você deveria está usandoVagrant   você deveria está usando
Vagrant você deveria está usandoHudson Brendon
 
Desenvolvendo mvp com python
Desenvolvendo mvp com pythonDesenvolvendo mvp com python
Desenvolvendo mvp com pythonBruno Rocha
 
Integração contínua - Você não tem dsculpa para não usar
Integração contínua - Você não tem dsculpa para não usarIntegração contínua - Você não tem dsculpa para não usar
Integração contínua - Você não tem dsculpa para não usarThiago Paes
 
Desmistificando web2py - #TDC2011
Desmistificando web2py - #TDC2011Desmistificando web2py - #TDC2011
Desmistificando web2py - #TDC2011Bruno Rocha
 
Testes unitários como ferramentas de design de código
Testes unitários como ferramentas de design de códigoTestes unitários como ferramentas de design de código
Testes unitários como ferramentas de design de códigoPaula Grangeiro
 
Testando Aplicações Django: Quando, Como e Onde?
Testando Aplicações Django: Quando, Como e Onde?Testando Aplicações Django: Quando, Como e Onde?
Testando Aplicações Django: Quando, Como e Onde?Bernardo Fontes
 
De Zero à Web com Python e Django
De Zero à Web com Python e DjangoDe Zero à Web com Python e Django
De Zero à Web com Python e DjangoOsvaldo Santana Neto
 
Por que jenkins se posso usar deployer php
Por que jenkins se posso usar deployer php Por que jenkins se posso usar deployer php
Por que jenkins se posso usar deployer php Michael Douglas
 
Introdução ao framework Django
Introdução ao framework DjangoIntrodução ao framework Django
Introdução ao framework DjangoEduardo Palma
 
Sim, existe vida além do FTP!
Sim, existe vida além do FTP!Sim, existe vida além do FTP!
Sim, existe vida além do FTP!Gustavo Pereira
 
Existe Vida além do FTP!
Existe Vida além do FTP! Existe Vida além do FTP!
Existe Vida além do FTP! Gustavo Pereira
 
Testes de integração em microservices
Testes de integração em microservicesTestes de integração em microservices
Testes de integração em microservicesClaudenir Freitas
 

Tendances (20)

Django Channels - Aplicações real time com Django
Django Channels - Aplicações real time com DjangoDjango Channels - Aplicações real time com Django
Django Channels - Aplicações real time com Django
 
Visão geral type script
Visão geral type scriptVisão geral type script
Visão geral type script
 
TypeScript - Campus party 2013
TypeScript - Campus party 2013TypeScript - Campus party 2013
TypeScript - Campus party 2013
 
Vagrant você deveria está usando
Vagrant   você deveria está usandoVagrant   você deveria está usando
Vagrant você deveria está usando
 
Desenvolvendo mvp com python
Desenvolvendo mvp com pythonDesenvolvendo mvp com python
Desenvolvendo mvp com python
 
Integração contínua - Você não tem dsculpa para não usar
Integração contínua - Você não tem dsculpa para não usarIntegração contínua - Você não tem dsculpa para não usar
Integração contínua - Você não tem dsculpa para não usar
 
Vivendo de hacking
Vivendo de hackingVivendo de hacking
Vivendo de hacking
 
Desmistificando web2py - #TDC2011
Desmistificando web2py - #TDC2011Desmistificando web2py - #TDC2011
Desmistificando web2py - #TDC2011
 
Testes unitários como ferramentas de design de código
Testes unitários como ferramentas de design de códigoTestes unitários como ferramentas de design de código
Testes unitários como ferramentas de design de código
 
Testando Aplicações Django: Quando, Como e Onde?
Testando Aplicações Django: Quando, Como e Onde?Testando Aplicações Django: Quando, Como e Onde?
Testando Aplicações Django: Quando, Como e Onde?
 
De Zero à Web com Python e Django
De Zero à Web com Python e DjangoDe Zero à Web com Python e Django
De Zero à Web com Python e Django
 
Por que jenkins se posso usar deployer php
Por que jenkins se posso usar deployer php Por que jenkins se posso usar deployer php
Por que jenkins se posso usar deployer php
 
Burlando Waf 2.0
Burlando Waf  2.0Burlando Waf  2.0
Burlando Waf 2.0
 
Introdução ao framework Django
Introdução ao framework DjangoIntrodução ao framework Django
Introdução ao framework Django
 
Sim, existe vida além do FTP!
Sim, existe vida além do FTP!Sim, existe vida além do FTP!
Sim, existe vida além do FTP!
 
Qual linguagem escolher?
Qual linguagem escolher?Qual linguagem escolher?
Qual linguagem escolher?
 
Canivete python
Canivete pythonCanivete python
Canivete python
 
Existe Vida além do FTP!
Existe Vida além do FTP! Existe Vida além do FTP!
Existe Vida além do FTP!
 
burlando um WAF
burlando um WAFburlando um WAF
burlando um WAF
 
Testes de integração em microservices
Testes de integração em microservicesTestes de integração em microservices
Testes de integração em microservices
 

Similaire à Testes e depuração com Python

Minicurso - Técnicas de Teste e Automatização do Teste de Unidade XII SemanaT...
Minicurso - Técnicas de Teste e Automatização do Teste de Unidade XII SemanaT...Minicurso - Técnicas de Teste e Automatização do Teste de Unidade XII SemanaT...
Minicurso - Técnicas de Teste e Automatização do Teste de Unidade XII SemanaT...Claudinei Brito Junior
 
1 2 3 - Testando - Automatizando os testes de software
1 2 3 - Testando - Automatizando os testes de software1 2 3 - Testando - Automatizando os testes de software
1 2 3 - Testando - Automatizando os testes de softwareHeider Lopes
 
Desenvolvimento Guiado por Testes
Desenvolvimento Guiado por TestesDesenvolvimento Guiado por Testes
Desenvolvimento Guiado por Testeselliando dias
 
Testes de Unidade com Junit
Testes de Unidade com JunitTestes de Unidade com Junit
Testes de Unidade com Junitcejug
 
Qualidade no desenvolvimento de Software com TDD e PHPUnit
Qualidade no desenvolvimento de Software com TDD e PHPUnitQualidade no desenvolvimento de Software com TDD e PHPUnit
Qualidade no desenvolvimento de Software com TDD e PHPUnitDomingos Teruel
 
O que seus testes garantem, o funcionamento do código ou das funcionalidades ...
O que seus testes garantem, o funcionamento do código ou das funcionalidades ...O que seus testes garantem, o funcionamento do código ou das funcionalidades ...
O que seus testes garantem, o funcionamento do código ou das funcionalidades ...Isaac de Souza
 
Treinamento Testes Unitários - parte 1
Treinamento Testes Unitários - parte 1Treinamento Testes Unitários - parte 1
Treinamento Testes Unitários - parte 1Diego Pacheco
 
PHPUnit e teste de software
PHPUnit e teste de softwarePHPUnit e teste de software
PHPUnit e teste de softwarericardophp
 
Desenvolvimento Dirigido por Testes com Junit
Desenvolvimento Dirigido por Testes com JunitDesenvolvimento Dirigido por Testes com Junit
Desenvolvimento Dirigido por Testes com JunitAdolfo Neto
 
Automação de Testes: Ferramentas e Aplicação com Integração Contínua
Automação de Testes: Ferramentas e Aplicação com Integração ContínuaAutomação de Testes: Ferramentas e Aplicação com Integração Contínua
Automação de Testes: Ferramentas e Aplicação com Integração ContínuaGabriela Patuci
 
Teste de performance com JMeter: como criar e executar os testes em aplicaçõe...
Teste de performance com JMeter: como criar e executar os testes em aplicaçõe...Teste de performance com JMeter: como criar e executar os testes em aplicaçõe...
Teste de performance com JMeter: como criar e executar os testes em aplicaçõe...Edlaine Zamora
 
TDD em django sem desculpas versao fisl
TDD em django sem desculpas versao fislTDD em django sem desculpas versao fisl
TDD em django sem desculpas versao fislAdriano Petrich
 
Testes Automatizados de Software
Testes Automatizados de SoftwareTestes Automatizados de Software
Testes Automatizados de SoftwareMaurício Aniche
 

Similaire à Testes e depuração com Python (20)

Minicurso - Técnicas de Teste e Automatização do Teste de Unidade XII SemanaT...
Minicurso - Técnicas de Teste e Automatização do Teste de Unidade XII SemanaT...Minicurso - Técnicas de Teste e Automatização do Teste de Unidade XII SemanaT...
Minicurso - Técnicas de Teste e Automatização do Teste de Unidade XII SemanaT...
 
1 2 3 - Testando - Automatizando os testes de software
1 2 3 - Testando - Automatizando os testes de software1 2 3 - Testando - Automatizando os testes de software
1 2 3 - Testando - Automatizando os testes de software
 
Debugging node
Debugging nodeDebugging node
Debugging node
 
Clean code part 2
Clean code   part 2Clean code   part 2
Clean code part 2
 
Introdução a tdd
Introdução a tddIntrodução a tdd
Introdução a tdd
 
Desenvolvimento Guiado por Testes
Desenvolvimento Guiado por TestesDesenvolvimento Guiado por Testes
Desenvolvimento Guiado por Testes
 
Testes de Unidade com Junit
Testes de Unidade com JunitTestes de Unidade com Junit
Testes de Unidade com Junit
 
Qualidade no desenvolvimento de Software com TDD e PHPUnit
Qualidade no desenvolvimento de Software com TDD e PHPUnitQualidade no desenvolvimento de Software com TDD e PHPUnit
Qualidade no desenvolvimento de Software com TDD e PHPUnit
 
TDD (Resumo)
TDD (Resumo)TDD (Resumo)
TDD (Resumo)
 
O que seus testes garantem, o funcionamento do código ou das funcionalidades ...
O que seus testes garantem, o funcionamento do código ou das funcionalidades ...O que seus testes garantem, o funcionamento do código ou das funcionalidades ...
O que seus testes garantem, o funcionamento do código ou das funcionalidades ...
 
Treinamento Testes Unitários - parte 1
Treinamento Testes Unitários - parte 1Treinamento Testes Unitários - parte 1
Treinamento Testes Unitários - parte 1
 
PHPUnit e teste de software
PHPUnit e teste de softwarePHPUnit e teste de software
PHPUnit e teste de software
 
Desenvolvimento Dirigido por Testes com Junit
Desenvolvimento Dirigido por Testes com JunitDesenvolvimento Dirigido por Testes com Junit
Desenvolvimento Dirigido por Testes com Junit
 
Automação de Testes: Ferramentas e Aplicação com Integração Contínua
Automação de Testes: Ferramentas e Aplicação com Integração ContínuaAutomação de Testes: Ferramentas e Aplicação com Integração Contínua
Automação de Testes: Ferramentas e Aplicação com Integração Contínua
 
Desenvolvimento Guiado Por Testes
Desenvolvimento Guiado Por TestesDesenvolvimento Guiado Por Testes
Desenvolvimento Guiado Por Testes
 
Teste de performance com JMeter: como criar e executar os testes em aplicaçõe...
Teste de performance com JMeter: como criar e executar os testes em aplicaçõe...Teste de performance com JMeter: como criar e executar os testes em aplicaçõe...
Teste de performance com JMeter: como criar e executar os testes em aplicaçõe...
 
TDC 2016 Trilha Testes - Floripa
TDC 2016 Trilha Testes - FloripaTDC 2016 Trilha Testes - Floripa
TDC 2016 Trilha Testes - Floripa
 
JUnit
JUnitJUnit
JUnit
 
TDD em django sem desculpas versao fisl
TDD em django sem desculpas versao fislTDD em django sem desculpas versao fisl
TDD em django sem desculpas versao fisl
 
Testes Automatizados de Software
Testes Automatizados de SoftwareTestes Automatizados de Software
Testes Automatizados de Software
 

Testes e depuração com Python

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

Notes de l'éditeur