Python - doctest vs unittest
Je suis en train de commencer avec des tests unitaires en Python et je me demandais si quelqu'un pouvait expliquer les avantages et les inconvénients de doctest et unittest.
Quelles conditions vous pouvez vous en servir pour?
Vous devez vous connecter pour publier un commentaire.
Les deux sont précieux. J'utilise à la fois doctest et nez prendre la place de unittest. J'utilise doctest pour les cas où le test est de donner un exemple de l'utilisation qui est vraiment utile que de la documentation. Généralement je ne fais pas ces tests globale, visant uniquement pour information. Je suis de l'utilisation efficace de doctest dans le sens inverse: ne pas tester mon code est correct basé sur mon doctest, mais pour vérifier que ma documentation est correcte sur la base du 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 réellement tester les code, l'objectif est de tester tous les cas, plutôt que d'illustrer ce que l'on fait, par exemple, qui est un autre objectif qui je pense est mieux satisfaits par d'autres cadres.
- Je utiliser unittest presque exclusivement.
De temps en temps, je vais mettre des trucs dans une docstring qui est utilisable par doctest.
95% des cas de test sont unittest.
Pourquoi? J'aime garder docstrings un peu plus courte et plus au point. Parfois, les cas de test aider à clarifier une docstring. La plupart du temps, l'application du cas de test sont trop longs pour une docstring.
docstring
et ce n'est pas. En fait, j'aime docstring à terme est que c'est explicitement montrant comment utiliser une interface, mais l'utiliser à la fois pour que les tests unitaires et pourraient ne pas s'adapter bien.Un autre avantage de doctesting est que vous assurez-vous que votre code fait ce que votre documentation indique qu'il ne. Après un certain temps, les modifications de logiciel peut rendre votre documentation de code et de faire des choses différentes. 🙂
Je travaille comme un bioinformatician, et la plupart du code que j'écris est "un temps, une tâche" scripts, code qui sera exécuté qu'une seule fois ou deux fois, et que d'exécuter une seule tâche spécifique.
Dans cette situation, écrit gros unittests peut-être exagéré, et doctests sont un compromis utile. Ils sont plus rapides à écrire, et depuis qu'ils sont normalement incorporés dans le code, ils permettent de toujours garder un œil sur la façon dont le code doit comporter, sans avoir à disposer d'un autre fichier ouvert. C'est utile lors de l'écriture de script de petites.
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 unittests sont structurés; d'autre part, les doctests sont des exemples simples d'utilisation, afin que les gens il suffit de copier et de les coller pour voir comment les utiliser.
Donc, pour reprendre ma réponse: doctests sont utiles lorsque vous avez à écrire de petits scripts, et quand vous devez les transmettre ou de les montrer à des chercheurs qui ne sont pas des informaticiens.
Si vous êtes juste de commencer avec l'idée de l'unité de test, je voudrais commencer par
doctest
parce que c'est tellement simple à utiliser. C'est également tout naturellement fournit un certain niveau de la documentation. Et pour des tests plus complets avecdoctest
, vous pouvez placer des tests dans un fichier externe afin de ne pas encombrer votre documentation.Je dirais
unittest
si vous êtes en provenance d'un contexte d'utilisation de JUnit ou quelque chose de similaire, où vous voulez être en mesure d'écrire des tests unitaires dans l'ensemble, de la même manière que vous avez été ailleurs.doctest
pour commencer) , mais finit par le regretter. Pour les non-trivial cas de test, j'ai perdu la coloration syntaxique et l'auto-complétion de mon éditeur. Lorsque les tests ont été dans un fichier séparé, je ne peux plus exécuter directement à partir de l'éditeur - je avoir à changer de contexte de retour vers le fichier source correspondant à chaque fois.- Je utiliser unittest exclusivement; je pense que doctest encombre jusqu'le module principal de trop. Cela a probablement à voir avec l'écriture des tests.
En utilisant à la fois valable et plutôt simple option. Le
doctest
module fournit lesDoctTestSuite
etDocFileSuite
méthodes qui créent un unittest-compatible testsuite à partir d'un module ou d'un fichier, respectivement.Donc j'utilise les deux et utilisent généralement doctest pour de simples tests avec des fonctions qui nécessitent peu ou pas d'installation (types simples pour les arguments). Je pense en fait que quelques doctest tests aider document de la fonction, plutôt que de nuire.
Mais pour des cas plus compliqués, et de plus pour un ensemble de cas de test, j'utilise unittest qui offre plus de contrôle et de flexibilité.
Je n'utilise pas doctest comme un remplacement pour unittest. Bien qu'ils se chevauchent un peu, les deux modules n'ont pas la même fonction:
- Je utiliser
unittest
comme un framework de test unitaire, le sens qu'il m'aide à déterminer rapidement l'impact de toute modification sur le reste du code.- Je utiliser
doctest
comme une garantie que les commentaires (à savoir les docstrings) sont toujours d'actualité à la version actuelle du code.La largement documenté les avantages du développement piloté par les tests que je reçois de
unittest
.doctest
résout le beaucoup plus subtile danger d'avoir dépassées commentaires trompeurs de la maintenance du code.Je n'ai presque jamais utiliser doctests. Je veux que mon code à l'auto documentation, et les docstrings fournir de la documentation pour l'utilisateur. De l'OMI, l'ajout de centaines de lignes de tests d'un module rend les docstrings beaucoup moins lisible. Je trouve aussi que les tests unitaires plus facile à modifier en cas de besoin.
Doctest
peut parfois conduire à un mauvais résultat. En particulier lors de la sortie contient les séquences d'échappement. Par exempledonne
Aussi ne vérifie pas le type de la sortie. Il se contente de comparer les chaînes de sortie. Par exemple, il ont fait un certain type rationnel qui imprime tout entier comme si c'est un nombre entier. Ensuite, supposons que vous disposez de la fonction de retour rationnelle. Donc, un doctest de ne pas différencier si la sortie est rationnel nombre entier ou un nombre entier.
r""" ... """
) pour résoudre le premier problème.'\\xe0\\xa4\\x95'
dans votre docstring.Je préfère la découverte de systèmes à base de ("nez" et "py.test", à l'aide de l'ancien actuellement).
doctest est agréable quand le test est également bon comme de la documentation, sinon ils ont tendance à encombrer le code de trop.