Testando Código Em Python

download Testando Código Em Python

of 39

Transcript of Testando Código Em Python

  • 7/25/2019 Testando Cdigo Em Python

    1/39

    Testando cdigo em PythonElias Dorneles@eliasdorneles

  • 7/25/2019 Testando Cdigo Em Python

    2/39

    Ouvi falar de TDDp

    1a vez em 2009

  • 7/25/2019 Testando Cdigo Em Python

    3/39

    Mas levei anos

    para ver vantagem.

  • 7/25/2019 Testando Cdigo Em Python

    4/39

    YMMVSua experincia pode ser difere

  • 7/25/2019 Testando Cdigo Em Python

    5/39

    Com dez anos deexperincia, a gente

    ainda adolescente=)

  • 7/25/2019 Testando Cdigo Em Python

    6/39

    Complexidade pode te deixar decorao partido

  • 7/25/2019 Testando Cdigo Em Python

    7/39

    Consigo ir mais longe Reduz a quantidade de adivinhao Por conseguinte, reduz minha ansiedade

    PORM: no ajuda se falta feedback para mais amplas (tipo: estou criando o produto

    Por que legal escrever testes?

  • 7/25/2019 Testando Cdigo Em Python

    8/39

    TDD is cool.Porm, mais comum m

    encontrar escrevendotestes para cdigo lega

  • 7/25/2019 Testando Cdigo Em Python

    9/39

    Bugstendemreaparecer

    i nis qui traveiz...

  • 7/25/2019 Testando Cdigo Em Python

    10/39

    Regra de ouro:quando encontrar bug,

    adicione um caso parapeg-lo.

  • 7/25/2019 Testando Cdigo Em Python

    11/39

    Cheap trick

    $ python meu_script.py out.t

    $ diff

  • 7/25/2019 Testando Cdigo Em Python

    12/39

    Cheap trick

    $ python meu_script.py out.t

    $ diff

  • 7/25/2019 Testando Cdigo Em Python

    13/39

    Para cobrir maiscasos, basta usar

    outros arquivos.

  • 7/25/2019 Testando Cdigo Em Python

    14/39

    Sute de testes

    $ cat run_tests.sh

    #!/bin/bash

    set-e

    diff

  • 7/25/2019 Testando Cdigo Em Python

    15/39

    Sute de testes

    $ cat run_tests.sh

    #!/bin/bash

    set-e

    diff

  • 7/25/2019 Testando Cdigo Em Python

    16/39

    Sute de testes

    $ cat run_tests.sh

    #!/bin/bash

    set-e

    diff

  • 7/25/2019 Testando Cdigo Em Python

    17/39

    Sute de testes

    $ cat run_tests.sh

    #!/bin/bash

    set-e

    diff

  • 7/25/2019 Testando Cdigo Em Python

    18/39

    Sute de testes

    $ cat run_tests.sh

    #!/bin/bash

    set-e

    diff

  • 7/25/2019 Testando Cdigo Em Python

    19/39

    Having a test suite i

    swee

  • 7/25/2019 Testando Cdigo Em Python

    20/39

    Estrutura de um teste

    Dado: fixtures, inicializando cdigo a ser te Quando: exercitar cdigo a ser testado

    Ento: verifica se resultado o esperado

  • 7/25/2019 Testando Cdigo Em Python

    21/39

    Show me some code!

    importunittest

    classExampleCase(unittest.TestCase):

    deftest_something(self):

    # given:

    fixture = self.build_fixture(...)

    # when: resultado = codigo_a_testar(fixture)

    # then:

    self.assertEqual(esperado, resultado)

  • 7/25/2019 Testando Cdigo Em Python

    22/39

    Estrutura de um teste

    Dado: fixtures, inicializando cdigo a ser te Quando: exercitar cdigo a ser testado

    Ento: verifica se resultado o esperado

    Parte mais

  • 7/25/2019 Testando Cdigo Em Python

    23/39

    Estrutura de um teste

    Dado: fixtures, inicializando cdigo a ser te Quando: exercitar cdigo a ser testado

    Ento: verifica se resultado o esperado

    Parte mais importante e mais fcil d

  • 7/25/2019 Testando Cdigo Em Python

    24/39

    Verificar a coisa

    erradaatrapalhamais do que ajuda

  • 7/25/2019 Testando Cdigo Em Python

    25/39

    Exemplo com bug na verificao

    deftest_device_should_be_connected(self):

    # when:

    report = get_status_report(self.device)

    # then: self.assertTrue('connected'inreport)

  • 7/25/2019 Testando Cdigo Em Python

    26/39

    Para ter certeza que eschecando a coisa certa

    faa o teste falhar

  • 7/25/2019 Testando Cdigo Em Python

    27/39

    Fazendo o teste falhar

    deftest_device_should_be_connected(self):

    # when:

    report = get_status_report(self.offline_de

    # then: self.assertTrue('connected'inreport)

    OOOPS! Teste continua pas

  • 7/25/2019 Testando Cdigo Em Python

    28/39

    Dubls de teste(test doubles)Para quando voc

    quiser poupar o oficial

  • 7/25/2019 Testando Cdigo Em Python

    29/39

    Corrigindo...

    deftest_device_should_be_connected(self):

    # when:

    report = get_status_report(self.offline_de

    # then: self.assertRegexpMatches(report, r'\bconne

    Agora o teste falha, como es

  • 7/25/2019 Testando Cdigo Em Python

    30/39

    Agora, sim!

    deftest_device_should_be_connected(self):

    # when:

    report = get_status_report(self.device)

    # then: self.assertRegexpMatches(report, r'\bconne

  • 7/25/2019 Testando Cdigo Em Python

    31/39

    Tipos de dubls de teste

    Dummy s para preencher argumentos (geralmente vazios, tipo None,

    Fakes implementao leve duma dependncia (exemplo: DB em mem

    Stubs simulam respostas prontas para chamadas feitas pelo cdigo

    Mocks especificam contrato com cdigo sendo testado (possuem asse

  • 7/25/2019 Testando Cdigo Em Python

    32/39

    Biblioteca mock:use para stubsou

    para mocks

    https://pypi.python.org/pypi/mockhttps://pypi.python.org/pypi/mock
  • 7/25/2019 Testando Cdigo Em Python

    33/39

    (demo rpida da

    classe mock.Mock)

  • 7/25/2019 Testando Cdigo Em Python

    34/39

    Python context manag

    ro

  • 7/25/2019 Testando Cdigo Em Python

    35/39

    Context managers ajudam com captura/c

    @contextmanager

    defscript_args(argv):

    old_argv = sys.argv

    try:

    sys.argv = ['fake_script.py'] + argv

    yieldsys.argv

    finally:

    sys.argv = old_argv

  • 7/25/2019 Testando Cdigo Em Python

    36/39

    Context managers ajudam com captura/c

    # USANDO:

    withscript_args(['--opcao1', '--opcao2']):

    print(sys.argv)

    # vai mostrar:

    # ['fake_script.py', '--opcao1', '--opcao2']

  • 7/25/2019 Testando Cdigo Em Python

    37/39

    Mais ferramentas legais

    VCR.py https://pypi.python.org/pypi/v Tox: https://tox.readthedocs.org py.test http://pytest.org/ Nose: https://nose.readthedocs.org

    Wishlist: RSpec para Python (http://rspec

    http://rspec.info/https://nose.readthedocs.org/https://nose.readthedocs.org/http://pytest.org/https://pypi.python.org/pypi/vcrpyhttps://pypi.python.org/pypi/vcrpyhttp://rspec.info/https://nose.readthedocs.org/http://pytest.org/http://tox.readthedocs.org/https://pypi.python.org/pypi/vcrpy
  • 7/25/2019 Testando Cdigo Em Python

    38/39

    ltimos pensamentos...

    Testar a coisa certa, na camada correta, s vezes

    de descobrir. Idia: pensar o que mais provvel Bom design recebe bem as mudanas- Jos Ric

    Isto vale para o cdigo dos testes tambm, made coisas que causam mudanas so diferentes

    Geralmente, cdigo de teste melhor bem dire(mnima indireo, sem muita herana e/ou O

    Al f

  • 7/25/2019 Testando Cdigo Em Python

    39/39

    FIMThanks!

    Algumas refernc

    http://blog.solidcraeu/2012/09/test-d

    part-1.html http://martinfowle

    com/articles/mockshtml

    https://www.destr

    com/screencasts/ca https://www.faceb

    com/notes/kent-becdoesnt-matter/797644973

    Livro do Michael F

    Elias Dorneles

    @eliasdorneles

    https://www.facebook.com/notes/kent-beck/when-tdd-doesnt-matter/797644973601702https://www.facebook.com/notes/kent-beck/when-tdd-doesnt-matter/797644973601702https://www.facebook.com/notes/kent-beck/when-tdd-doesnt-matter/797644973601702https://www.facebook.com/notes/kent-beck/when-tdd-doesnt-matter/797644973601702https://www.destroyallsoftware.com/screencasts/cataloghttps://www.destroyallsoftware.com/screencasts/cataloghttp://martinfowler.com/articles/mocksArentStubs.htmlhttp://martinfowler.com/articles/mocksArentStubs.htmlhttp://martinfowler.com/articles/mocksArentStubs.htmlhttp://blog.solidcraft.eu/2012/09/test-driven-traps-part-1.htmlhttp://blog.solidcraft.eu/2012/09/test-driven-traps-part-1.htmlhttp://blog.solidcraft.eu/2012/09/test-driven-traps-part-1.html