associação pythonbrasil[11] django zope/plone planet Início Logado como (Entrar)

Diferenças para "DocTest"

Diferenças entre as versões de 8 e 10 (2 versões de distância)
Revisão 8e 2004-07-19 19:24:40
Tamanho: 2589
Editor: RudaMoura
Comentário:
Revisão 10e 2004-07-19 19:31:33
Tamanho: 2600
Editor: RudaMoura
Comentário:
Deleções são marcadas assim. Adições são marcadas assim.
Linha 1: Linha 1:
= doctest: teste automatizado utilizando DocStrings = = doctest: Teste Automatizado Utilizando DocStrings =
Linha 4: Linha 4:
A linguagem Python é bem amiga nesse aspecto, com utilização de DocStrings. A linguagem Python é amiga do programador nesse aspecto
com utilização de DocStrings.
Linha 22: Linha 23:
é uma implementação documentada da função fatorial, dentro de um é uma implementação bem documentada da função fatorial dentro de um
Linha 29: Linha 30:
A resposta está nos testes automatizados que vão garantir (se bem escolhidos)
que
a nossa nova implemenmtação funciona como a anterior.
A resposta está nos testes automatizados, que vai garantir  que (se bem escolhidos) a nossa nova implemenmtação funcione como a anterior.
Linha 32: Linha 33:
Repare nos exemplos apresentados para
descrever a função fatorial, que tal usar esses exemplos
como teste?

Isto é possível através do módulo {{{doctest}}} do Python. vejamos
como utilizar
Repare nos exemplos apresentados para descrever a função fatorial,
que tal usá-los como teste? Isto é possível através do
módulo {{{doctest}}} do Python. vejamos como
Linha 60: Linha 58:
O que eu quero executar e testar eu formato igualzinho
como eu usaria no modo interativo do Python (repare nos >>> antes).
a saída esperada eu acrescento na linha logo a baixo,
O que se quer executar e testar formata-se igual
ao que se usaria no modo interativo do Python (repare nos >>> antes).
a saída esperada é indicada na linha logo a baixo,
Linha 66: Linha 64:
erro acontecer a saída é muda, nada aparece na tela. Digamos
que eu mude o {{{if x == 0: return 1}}} para {{{if x == 0: return 0}}},
erro acontecer a saída é muda, nada aparece na tela.

Digamos que eu mude o {{{if x == 0: return 1}}} para
{{{if x == 0: return 0}}},
Linha 87: Linha 87:
Para {{{fat(0)}}} era esperado o valor 1, veio 0. Para {{{fat(5)}}}
era esperado 120, veio 0 também.
ou seja, para {{{fat(0)}}} era esperado o valor 1, veio 0.
Para {{{fat(5)}}} era esperado 120, veio 0 também.
Linha 94: Linha 94:

--
RudaMoura

doctest: Teste Automatizado Utilizando DocStrings

Um bom programador procura documentar direito o código que escreve. A linguagem Python é amiga do programador nesse aspecto com utilização de DocStrings.

Por exemplo:

   1 def fat(n):
   2   """Calcula o fatorial de n.
   3 
   4   >>> fat(0)
   5   1
   6   >>> fat(5)
   7   120
   8   """
   9   if x == 0:
  10     return 1
  11   else:
  12     return x * fat(x-1)

é uma implementação bem documentada da função fatorial dentro de um possível módulo minhasfuncoes.py.

Uma preocupação maior seria sempre assegurar que o que escrevemos está correto, mesmo quando procuramos melhorar ou até mesmo reescrever o que fizemos. Mas como certificar que não quebramos nada enquanto mudamos?

A resposta está nos testes automatizados, que vai garantir que (se bem escolhidos) a nossa nova implemenmtação funcione como a anterior.

Repare nos exemplos apresentados para descrever a função fatorial, que tal usá-los como teste? Isto é possível através do módulo doctest do Python. vejamos como

   1 def fat(n):
   2   """Calcula o fatorial de n.
   3 
   4   >>> fat(0)
   5   1
   6   >>> fat(5)
   7   120
   8   """
   9   if n == 0:
  10     return 1
  11   else:
  12     return n * fat(n-1)
  13 
  14 def _test():
  15   import doctest, minhasfuncoes
  16   return doctest.testmod(minhasfuncoes)
  17 
  18 if __name__ == '__main__':
  19   _test()

O que se quer executar e testar formata-se igual ao que se usaria no modo interativo do Python (repare nos >>> antes). a saída esperada é indicada na linha logo a baixo, conforme deveria ser numa seção interativa.

Para rodar o teste é simples, $ python minhasfuncoes.py. Se nenhum erro acontecer a saída é muda, nada aparece na tela.

Digamos que eu mude o if x == 0: return 1 para if x == 0: return 0, A execução do teste me dirá que

$ python minhasfuncoes.py
*****************************************************************
Failure in example: fat(0)
from line #1 of minhasfuncoes.fat
Expected: 1
Got: 0
*****************************************************************
Failure in example: fat(5)
from line #3 of minhasfuncoes.fat
Expected: 120
Got: 0
*****************************************************************
1 items had failures:
   2 of   2 in minhasfuncoes.fat
***Test Failed*** 2 failures.

ou seja, para fat(0) era esperado o valor 1, veio 0. Para fat(5) era esperado 120, veio 0 também. Dois erros foram indicados através da própria documentação da função.

Para saber mais

  • Procure a documentação do doctest (>>> help(doctest)).

  • Um exemplo de uso em VerificadorDeCpf.

-- RudaMoura