Python - doctest vs. unittest [fechado]

159

Estou tentando começar o teste de unidade em Python e queria saber se alguém poderia explicar as vantagens e desvantagens de doctest e unittest.

Para quais condições você usaria cada um?

Sean
fonte

Respostas:

177

Ambos são valiosos. Eu uso o doctest e o nariz substituindo o unittest. Uso doctest para casos em que o teste está dando um exemplo de uso que é realmente útil como documentação. Geralmente, eu não faço esses testes abrangentes, visando apenas informativos. Estou efetivamente usando o doctest ao contrário: não para testar meu código está correto com base no meu doctest, mas para verificar se minha documentação está correta com base no código.

O motivo é que acho que os testes abrangentes sobrecarregam demais a sua documentação; portanto, você acabará com as doutrinas inutilizáveis ​​ou os testes incompletos.

Na verdade, para testar o código , o objetivo é testar minuciosamente todos os casos, em vez de ilustrar o que é feito pelo exemplo, que é um objetivo diferente que eu acho que é melhor alcançado por outras estruturas.

Brian
fonte
29
Há muito menos clichê, e acho os testes muito mais simples de escrever (e ler). O baixo custo de inicialização para escrever testes (ou seja, basta escrever uma função "test_foo ()" e pronto) também ajuda a combater a tentação de fazer os bits de código interessantes antes de pregar seus testes.
1227 Brian
6
Eu acho que essa é uma resposta fantástica.
James Brady
Quais outras estruturas de teste você usa? Ou é exclusivamente nariz?
5111 Joe
6
Dada a idade desta resposta, provavelmente vale a pena mencionar que grande parte do "clichê" das versões mais antigas do unittest se foi em grande parte. Eu ainda gosto mais do Nose também, mas é praticamente uma brincadeira.
Adam Parkin
1
O nariz da FYI esteve em "modo de manutenção" nos últimos anos e provavelmente interromperá todo o desenvolvimento (ausência de intervenção de terceiros). Seus mantenedores recomendam que novos projetos usem uma alternativa.
6
48

Eu uso unittest quase exclusivamente.

De vez em quando, coloco algumas coisas em uma doutrina que pode ser usada pelo doctest.

95% dos casos de teste são unittest.

Por quê? Eu gosto de manter as doutrinas um pouco mais curtas e mais objetivas. Às vezes, os casos de teste ajudam a esclarecer uma sequência de documentos. Na maioria das vezes, os casos de teste do aplicativo são muito longos para uma sequência de documentos.

S.Lott
fonte
Seria legal ver um exemplo, para o que você acha que é adequado docstringe o que não é. Na verdade, eu gosto de usar as doutrinas nos termos que mostram explicitamente como usar uma interface, mas usá-las para isso e para o teste de unidade pode não se encaixar bem.
user1767754
33

Outra vantagem do teste de documentos é que você garante que seu código faça o que a documentação diz. Depois de um tempo, as alterações de software podem fazer com que sua documentação e código façam coisas diferentes. :-)

Jason Baker
fonte
6
+1 de mim - ponto excelente
doug
28

Eu trabalho como bioinformática e a maior parte do código que escrevo são scripts "uma vez, uma tarefa", código que será executado apenas uma ou duas vezes e que executa uma única tarefa específica.

Nessa situação, escrever grandes unittests pode ser um exagero, e os doctests são um compromisso útil. Eles são mais rápidos de escrever e, como geralmente são incorporados ao código, permitem sempre ficar de olho em como o código deve se comportar, sem precisar abrir outro arquivo. Isso é útil ao escrever pequenos scripts.

Além disso, os testes de documentos são úteis quando você precisa passar seu script para um pesquisador que não seja especialista em programação. Algumas pessoas acham muito difícil entender como os unittests são estruturados; por outro lado, os doctests são exemplos simples de uso, para que as pessoas possam copiá-los e colá-los para ver como usá-los.

Portanto, para resumir minha resposta: os doctests são úteis quando você precisa escrever pequenos scripts e quando precisa passá-los ou mostrá-los a pesquisadores que não são cientistas da computação.

dalloliogm
fonte
6
"os testes de documentos são úteis quando você precisa escrever pequenos scripts e quando precisa passá-los ou mostrá-los a pesquisadores que não são cientistas da computação". Ponto excelente. Eu faço a mesma coisa e os programadores não-python sempre ficam surpresos ao ver que a documentação pode ser executada.
Daniel Canas
14

Se você está apenas começando com a idéia de teste de unidade, eu começaria doctestporque é muito simples de usar. Naturalmente, também fornece algum nível de documentação. E para testes mais abrangentes doctest, você pode colocar os testes em um arquivo externo para que não sobrecarregue sua documentação.

Eu sugeriria unittestse você tem experiência em usar o JUnit ou algo similar, onde deseja poder escrever testes de unidade geralmente da mesma maneira que em outros lugares.

Greg Hewgill
fonte
4
Fui encorajado nessa direção ( doctestpara começar), mas acabei me arrependendo. Para casos de teste não triviais, perdi o destaque da sintaxe e a conclusão automática do meu editor. Quando os testes estavam em um arquivo separado, não era mais possível executá-lo diretamente do editor - eu precisava mudar o contexto novamente para o arquivo de origem correspondente todas as vezes.
Oddthinking
7

Eu uso unittest exclusivamente; Eu acho que o doctest confunde demais o módulo principal. Provavelmente isso tem a ver com a escrita de testes completos.

Tony Arkles
fonte
7

Usar os dois é uma opção válida e bastante simples. O doctestmódulo fornece os métodos DoctTestSuitee DocFileSuiteque criam um conjunto de testes compatível com unittest a partir de um módulo ou arquivo, respectivamente.

Então, eu uso os dois e normalmente uso o doctest para testes simples com funções que requerem pouca ou nenhuma configuração (tipos simples de argumentos). Na verdade, acho que alguns testes doctest ajudam a documentar a função, em vez de diminuí-la.

Mas, para casos mais complicados e para um conjunto mais abrangente de casos de teste, eu uso o unittest, que fornece mais controle e flexibilidade.

davidavr
fonte
7

Não uso o doctest como substituto do unittest. Embora se sobreponham um pouco, os dois módulos não têm a mesma função:

  • Eu uso unittestcomo uma estrutura de teste de unidade, o que significa que me ajuda a determinar rapidamente o impacto de qualquer modificação no restante do código.

  • Uso doctestcomo garantia que os comentários (ou seja, docstrings) ainda são relevantes para a versão atual do código.

Os benefícios amplamente documentados do desenvolvimento orientado a testes que recebo unittest . doctestresolve o risco muito mais sutil de comentários desatualizados, enganando a manutenção do código.

rahmu
fonte
4

Eu quase nunca uso documentos. Quero que meu código seja auto-documentado, e os documentos fornecem a documentação para o usuário. A IMO, ao adicionar centenas de linhas de testes a um módulo, torna os documentos muito menos legíveis. Também acho os testes de unidade mais fáceis de modificar quando necessário.

JimB
fonte
4

Doctestalgumas vezes pode levar a resultados errados. Especialmente quando a saída contém seqüências de escape. Por exemplo

def convert():
    """
    >>> convert()
    '\xe0\xa4\x95'
    """
    a = '\xe0\xa4\x95'
    return a
import doctest
doctest.testmod()

**********************************************************************
File "hindi.py", line 3, in __main__.convert
Failed example:
    convert()
Expected:
    'क'
Got:
    '\xe0\xa4\x95'
**********************************************************************
1 items had failures:
   1 of   1 in __main__.convert
***Test Failed*** 1 failures. 

Também não verifica o tipo de saída. Ele apenas compara as seqüências de saída. Por exemplo, ele tornou racional algum tipo, que imprime como um número inteiro se for um número inteiro. Então suponha que você tenha uma função que retorne racional. Portanto, um doctest não se diferencia se a saída for um número inteiro racional ou um número inteiro.

Harsh
fonte
5
Você pode usar docstrings brutos ( r""" ... """) para corrigir o primeiro problema.
icktoofay
Funciona bem no Python 3.4. Para fazê-lo funcionar no Python 2.7 também, use '\\xe0\\xa4\\x95'na sua docstring.
precisa
Descobri também que literais unicode também não funcionam com doctests (mesmo com a linha de comentário 'coding utf-8' correta no topo do arquivo. Geralmente, os doctests não são tão bem suportados quanto os testes mais unittest, por isso existem alguns bugs) que não são corrigidos.
RichVel 10/04
2

Eu prefiro os sistemas baseados em descoberta ("nariz" e "py.test", usando o primeiro atualmente).

O doctest é bom quando o teste também é bom como documentação, caso contrário, eles tendem a sobrecarregar demais o código.

lazy1
fonte
nariz parece incrivelmente útil; Ainda não tive chance de usá-lo, mas tenho grandes esperanças :) #
Tony Arkles
nariz é praticamente a estrutura de teste mais fácil de usar, IMO. Isso facilita a escrita e a execução de casos de teste.
27510 Kamil Kisiel #