introduction au doctest – Test Python

By | avril 12, 2019

Formation Python

Le cadre de test doctest est un module Python fourni avec Python. Cet article explique comment mettre des doctests dans votre code et en dehors de celui-ci dans un fichier séparé. Ensuite, je montrerai comment je l’utilise pour tester markdown.py.

modèle conceptuel de python doctest

C'est de python.org:

Le module doctest recherche des morceaux de texte qui ressemblent à des sessions interactives Python,
et exécute ensuite ces sessions pour vérifier qu'elles fonctionnent exactement comme indiqué. …

J'aime penser à doctest comme si je suis assis à une invite interactive python et que je tape des choses. Le doctest est un script qui dit: «Ma session devrait ressembler à ceci. Si ce n’est pas le cas, quelque chose ne va pas.

En fait, je pense que certaines personnes l'utilisent de cette façon. Ils écrivent un module, puis montrent comment cela fonctionne dans un shell interactif, puis copient / collent la session dans une docstring en tant que doctests.

Toutefois, cela ne fonctionne pas très bien dans TDD, où le code ne fonctionne pas avant d’écrire le test. Avec TDD, je dois vraiment penser au résultat exact de quelque chose avant Ça marche.

Lorsque vous utilisez doctest et TDD, cela peut finir par devenir assez itératif:

  1. Écrire des doctests
  2. Exécuter les doctests pour voir qu'ils échouent
  3. Écrivez un code qui devrait le faire passer
  4. S'il échoue toujours, examinez l'échec.
  5. Si c'est un faux échec, et que le doctest est juste trop pointilleux, alors modifiez le doctest, éventuellement
    avec les drapeaux doctest, puis aller à 2.
  6. S'il s'agit d'un véritable échec, corrigez le code, puis passez à l'étape 2.

J'ai trouvé que certains des aspects les plus épineux de doctest peuvent être minimisés avec l'utilisation d'un adaptateur api. J'utiliserai un adaptateur dans l'exemple markdown.py de ce post.

exemple de doctest

Voici un module simple avec une fonction, avec deux doctests intégrés dans la docstring.

inut_math.py:

courir doctest

Vous exécutez doctest comme ceci:

Le «-v» signifie prolixe. Verbose est très utile pour tester vos doctests, puisque doctest n’affiche rien si tous les tests sont réussis.

Vous pouvez voir lors de la première utilisation que rien ne s'imprime, car tous les tests réussissent.

doctests dans un fichier séparé du code

Une des fonctionnalités vraiment intéressantes de doctest est la possibilité de mettre vos doctests dans un fichier texte. Ceci est particulièrement utile pour les tests fonctionnels, car cela vous permet d'utiliser doctest pour tester même les interfaces non-python.

Pour notre exemple mathématique simple, je peux simplement mettre le même code de la docstring dans un fichier texte.

test_unnecessary_math.txt:

exécuter des doctests dans un fichier séparé

Exécuter doctest sur un fichier revient à l’exécuter sur un module.

exemple avec markdown.py

Pour markdown.py, je ne veux pas inclure de doctests dans le code. Étant donné que je teste uniquement l’interface CLI externe (via un adaptateur), j’utiliserai la méthode ‘doctests in a text file’.

Je ne vais pas écrire tout de suite des tests pour la syntaxe complète. Mes trois premiers tests porteront sur les paragraphes, les balises astérisques simples et les balises fortes à double astérisque.

test_markdown_doctest.txt:

Eh bien, c’est assez simple. J’ai importé ‘run_markdown’ depuis mon adaptateur api. Ensuite, je jette quelques exemples de chaînes dans le script et montre ce que je compte voir apparaître.

test markdown.py

Voici le résultat de l'exécution de doctest sur mon fichier texte.

Et avec verbeux.

Comme vous pouvez le voir. Une fois que vous êtes convaincu que vos tests sont corrects, le paramètre de verbose n’ajoute pas grand chose. Vous obtiendrez de nombreuses sorties sans commentaires s'il y a des erreurs.

Dans mon cas, tout a échoué !!! Mais c’est bien, car je n’ai encore rien mis en place, j’ai juste un bout.

plus d'infos doctest

Tous les exemples de ce message sont disponibles dans le projet github markdown.py. L’exemple mathématique se trouve dans un dossier appelé ‘simple_doctest_example’.

Le site python.org contient de très bonnes informations sur l’utilisation de doctest.
Sur cette même page, vous trouverez une explication sur l’utilisation des fichiers texte pour vos doctests.

Doug Hellmann a un excellent article sur le doctest que je recommande vivement. Il s’appelle Tester par la documentation et couvre de nombreux problèmes que vous pouvez rencontrer, notamment le traitement de plusieurs lignes, espaces, sorties imprévisibles, etc.

Je traiterai de certains de ces aspects au fur et à mesure de la mise en œuvre et des tests de markdown.py.

suivant

Ensuite, j’essaierai d’implémenter les mêmes tests en utilisant unittest, parfois appelé PyUnit.