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

Diferenças para "DocTest"

Diferenças entre as versões de 4 e 5
Revisão 4e 2004-07-19 19:01:26
Tamanho: 1905
Editor: RudaMoura
Comentário:
Revisão 5e 2004-07-19 19:07:20
Tamanho: 2276
Editor: RudaMoura
Comentário:
Deleções são marcadas assim. Adições são marcadas assim.
Linha 67: Linha 67:
  >>> f(0)   >>> fat(0)
Linha 69: Linha 69:
  >>> f(5)   >>> fat(5)
Linha 75: Linha 75:
    return x * f(x-1)     return x * fat(x-1)
Linha 85: Linha 85:
Observe que o que eu quero testar eu formato igualzinho
como eu usaria no modo interativo do Python (repare nos >>>).
O que eu quero executar, eu ponho como >>> na frente,
a saída esperada eu acrescento na linha a baixo,
conforme deveria ser.
Linha 86: Linha 91:
Pra testar é simples, {{{$ python minhasfuncoes.py}}}. Se nenhum
erro acontecer, a saída é muda, nada aparece na tela.

doctest: teste automatizado utilizando DocStrings

Você que é bom programador e cuidadoso, aposto que procuras documentar direito o código que escreves. A linguagem Python é bem amiga nesse aspecto, com a utilização de DocStrings. Por exemplo:

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

é uma implementação bem documentada da função fatorial dentro de um hipotético 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 a implementação de uma função ou classe em Python. Mas como certificar que não quebramos nada enquanto mudamos?

A resposta está nos testes automatizados. Escolher bem o que testar e como testar é uma arte em si. Repare nos exemplos que eu escrevi para descrever a função fatorial, que tal eu usar esses exemplos como teste?

Eu poderia escrever a uma função test() e assim escrever novamente esses exemplos dentro desta função e conferir se não tem nada errado com a entrada e a saída da função.

   1 def fat(n):
   2   """Calcula o fatorial de n.
   3   >>> f(0)
   4   1
   5   >>> f(5)
   6   120
   7   """
   8   if x == 0:
   9     return 1
  10   else:
  11     return x * f(x-1)
  12 
  13 def test():
  14   assert f(0) == 1
  15   assert f(5) == 120
  16 
  17 if __name__ == '__main__':
  18   test()

Mas tem um jeito melhor e mais amigo de fazer isso, através do módulo doctest do Python. Aproveitando os próprios exemplos documentados e sem copiar tudo novamente (passível de falha isso).

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

Observe que o que eu quero testar eu formato igualzinho como eu usaria no modo interativo do Python (repare nos >>>). O que eu quero executar, eu ponho como >>> na frente, a saída esperada eu acrescento na linha a baixo, conforme deveria ser.

Pra testar é simples, $ python minhasfuncoes.py. Se nenhum erro acontecer, a saída é muda, nada aparece na tela.