Python-doctest vs. unittest [fermé]

j'essaie de commencer avec les tests unitaires en Python et je me demandais si quelqu'un pourrait expliquer les avantages et les inconvénients de doctest et unittest.

pour quelles conditions utiliseriez-vous chacun?

146
demandé sur the Tin Man 2008-12-12 04:50:19

11 réponses

les deux sont précieux. J'utilise à la fois doctest et nez prenant la place de unittest. J'utilise doctest pour les cas où le test donne un exemple d'utilisation qui est réellement utile comme documentation. En général, je ne rends pas ces tests complets, visant uniquement à informer. J'utilise effectivement doctest à l'envers: non pas pour tester mon code est correct basé sur mon doctest, mais pour vérifier que ma documentation est correcte basé sur le code.

La raison est que je trouve complet doctests va encombrer votre documentation beaucoup trop, donc soit vous retrouver avec soit inutilisable docstrings, ou des analyses incomplètes.

pour tester réellement le code , le but est de tester minutieusement chaque cas, plutôt que d'illustrer ce qui est fait par l'exemple, qui est un but différent qui je pense est mieux rencontré par d'autres cadres.

155
répondu Brian 2016-06-02 18:42:43

j'utilise unittest presque exclusivement.

de temps en temps, je mets des trucs dans une corde Utilisable par doctest.

95% des cas d'essai sont unittest.

pourquoi? J'aime garder les cordes un peu plus courtes et plus précises. Parfois, les cas d'essai aident à clarifier une corde. La plupart du temps, les cas de test de l'application sont trop longs pour une corde.

43
répondu S.Lott 2008-12-12 01:53:38

un autre avantage des tests de documents est que vous pouvez vous assurer que votre code fait ce que votre documentation dit qu'il fait. Au bout d'un certain temps, les modifications logicielles peuvent faire en sorte que votre documentation et votre code fassent des choses différentes. :- )

28
répondu Jason Baker 2009-03-20 20:22:31

je travaille comme bioinformaticien, et la plupart du code que j'écris est des scripts" Une fois, une tâche", code qui ne sera exécuté qu'une ou deux fois et qui exécute une seule tâche spécifique.

dans cette situation, écrire de grands questionnaires peut être exagéré, et les questionnaires sont un compromis utile. Ils sont plus rapides à écrire, et puisqu'ils sont généralement incorporés dans le code, ils permettent de toujours garder un oeil sur la façon dont le code devrait se comporter, sans avoir à ouvrir un autre fichier. C'est utile pour écrire un petit script.

Aussi, doctests sont utiles lorsque vous devez passer votre script à un chercheur qui n'est pas expert en programmation. Certaines personnes trouvent qu'il est très difficile de comprendre comment les unittests sont structurés; d'un autre côté, les doctests sont de simples exemples d'utilisation, de sorte que les gens peuvent simplement les copier et les coller pour voir comment les utiliser.

donc, pour reprendre ma réponse: les doctests sont utiles quand vous devez écrire de petits scripts, et quand vous devez les transmettre ou de les montrer à des chercheurs qui ne sont pas des informaticiens.

22
répondu dalloliogm 2012-06-02 10:53:08

si vous êtes juste commencer avec l'idée de l'Unité de test, je commencerais par doctest parce qu'il est si simple à utiliser. Il fournit aussi naturellement un certain niveau de documentation. Et pour des tests plus complets avec doctest , vous pouvez placer des tests dans un fichier externe afin qu'il n'encombre pas votre documentation.

je suggérerais unittest si vous venez d'un arrière-plan D'avoir utilisé JUnit ou quelque chose de similaire, où vous voulez être en mesure pour écrire des tests unitaires en général de la même manière que vous avez été ailleurs.

11
répondu Greg Hewgill 2008-12-12 01:55:25

utiliser les deux est une option valide et plutôt simple. Le module doctest fournit les méthodes DoctTestSuite et DocFileSuite qui créent une suite de test compatible unittest à partir d'un module ou d'un fichier, respectivement.

donc j'utilise les deux et j'utilise typiquement doctest pour des tests simples avec des fonctions qui nécessitent peu ou pas de configuration (types simples pour les arguments). En fait, je pense que quelques tests doctest aide documenter la fonction, plutôt que de détourner il.

mais pour les cas plus compliqués, et pour un ensemble plus complet de cas d'essai, j'utilise unittest qui fournit plus de contrôle et de flexibilité.

7
répondu davidavr 2008-12-12 03:25:02

j'utilise unittest exclusivement; je pense que doctest embrouille trop le module principal. Cela a probablement à voir avec la rédaction de tests approfondis.

6
répondu Tony Arkles 2008-12-12 02:19:46

Je n'utilise pas doctest pour remplacer unittest. Bien qu'ils se chevauchent un peu, les deux modules n'ont pas la même fonction:

  • j'utilise unittest comme cadre d'essai unitaire, ce qui signifie qu'il m'aide à déterminer rapidement l'impact de toute modification sur le reste du code.

  • j'utilise doctest comme une garantie que les commentaires (à savoir les docstrings) sont toujours d'actualité à la version actuelle de code.

largement documenté les avantages du développement piloté par les tests que je reçois de unittest . doctest résout le danger beaucoup plus subtil d'avoir des commentaires périmés trompant le maintien du code.

6
répondu rahmu 2012-12-05 11:18:02

Je n'utilise presque jamais de tests. Je veux que mon code soit auto-documenté, et les docstrings fournissent la documentation à l'utilisateur. L'OMI ajoute des centaines de lignes d'essais à un module, ce qui rend les cordons de doctrinal beaucoup moins lisibles. Je trouve aussi que les tests unitaires sont plus faciles à modifier au besoin.

3
répondu JimB 2008-12-12 02:12:54

Doctest peut parfois conduire à un mauvais résultat. Surtout quand la sortie contient des séquences d'évasion. Par exemple

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

donne

**********************************************************************
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. 

ne vérifie pas non plus le type de sortie. Il compare juste les chaînes de sortie. Par exemple il a fait un certain type rationnel qui imprime juste comme entier si c'est un nombre entier. Supposons alors que vous ayez une fonction qui renvoie la rationalité. Donc, un doctest ne différenciera pas si la sortie est rationnel nombre entier ou un nombre entier.

3
répondu Harsh 2016-10-14 05:40:49

je préfère la découverte ("nez" et "py.test", en utilisant le premier actuellement).

doctest est agréable lorsque le test est aussi une bonne documentation, sinon ils ont tendance à encombrer le code trop.

2
répondu lazy1 2008-12-12 04:20:59