Comment écrire et utiliser doctest pour écrire du code de test dans les docstrings en Python.

Affaires

Python est livré avec un module doctest standard qui teste le contenu d'une docstring, ce qui facilite l'écriture d'exemples d'entrée et de sortie dans la docstring et rend la documentation plus facile à comprendre.

Les informations suivantes sont fournies ici.

  • Un exemple simple de test avec doctest
    • S'il n'y a pas d'erreur
    • S'il y a une erreur
  • Contrôler les résultats de sortie par des options et des arguments
    • -vOption
    • verboseargument (par exemple, fonction, programme, programme)
  • Exécuter le module doctest à partir de la ligne de commande
  • Écriture de tests dans un fichier texte externe
    • Comment écrire un fichier texte
    • Appelé à partir du fichier py
    • Exécution directe d'un fichier texte

Un exemple simple de test avec doctest

Une docstring est une chaîne de caractères enfermée dans l'un des éléments suivants : (1) le nom de la fonction à tester, (2) le nom de la fonction à tester, et (3) la valeur de sortie attendue en mode interactif Python.

  • """
  • '''

S'il n'y a pas d'erreur

Assurez-vous que le code est correct dans la fonction et le contenu de la docstring.

def add(a, b):
    '''
    >>> add(1, 2)
    3
    >>> add(5, 10)
    15
    '''

    return a + b


if __name__ == '__main__':
    import doctest
    doctest.testmod()

Exécutez ce fichier.

$ python3 doctest_example.py

S'il n'y a pas d'erreur, rien ne sera émis.

if __name__ == '__main__'Cela signifie “exécuter le traitement ultérieur uniquement lorsque le fichier script correspondant est exécuté à partir de la ligne de commande.

S'il y a une erreur

Si vous créez et exécutez le code erroné suivant, une erreur sera émise.

def add(a, b):
    '''
    >>> add(1, 2)
    3
    >>> add(5, 10)
    10
    '''

    return a * b


if __name__ == '__main__':
    import doctest
    doctest.testmod()
$ python3 doctest_example_error.py
**********************************************************************
File "doctest_example_error.py", line 3, in __main__.add
Failed example:
    add(1, 2)
Expected:
    3
Got:
    2
**********************************************************************
File "doctest_example_error.py", line 5, in __main__.add
Failed example:
    add(5, 10)
Expected:
    10
Got:
    50
**********************************************************************
1 items had failures:
   2 of   2 in __main__.add
***Test Failed*** 2 failures.

Il se présente comme suit.

Valeurs de sortie attendues écrites dans doctest.Expected
Valeur réelle de la sortieGot

Contrôler les résultats de sortie par des options et des arguments

-vOption

Si vous souhaitez que les résultats de sortie soient affichés même en l'absence d'erreurs, exécutez la commande avec l'option -v sur la ligne de commande.

$ python3 doctest_example.py -v
Trying:
    add(1, 2)
Expecting:
    3
ok
Trying:
    add(5, 10)
Expecting:
    15
ok
1 items had no tests:
    __main__
1 items passed all tests:
   2 tests in __main__.add
2 tests in 2 items.
2 passed and 0 failed.
Test passed.

verboseargument (par exemple, fonction, programme, programme)

Si vous voulez toujours afficher les résultats de sortie, spécifiez l'argument verbose=True dans doctest.testmod() dans le fichier py.

if __name__ == '__main__':
    import doctest
    doctest.testmod(verbose=True)

Les résultats de sortie seront toujours affichés sans l'option -v au moment de l'exécution.

$ python3 doctest_example_verbose.py
Trying:
    add(1, 2)
Expecting:
    3
ok
Trying:
    add(5, 10)
Expecting:
    15
ok
1 items had no tests:
    __main__
1 items passed all tests:
   2 tests in __main__.add
2 tests in 2 items.
2 passed and 0 failed.
Test passed.

Exécuter le module doctest à partir de la ligne de commande

if __name__ == '__main__'Si vous voulez y faire autre chose, vous pouvez exécuter le module doctest directement depuis la ligne de commande sans appeler doctest.testmod() dans le fichier py.

Par exemple, dans les cas suivants

def add(a, b):
    '''
    >>> add(1, 2)
    3
    >>> add(5, 10)
    15
    '''

    return a + b


if __name__ == '__main__':
    import sys
    result = add(int(sys.argv[1]), int(sys.argv[2]))
    print(result)

Il peut recevoir des arguments de ligne de commande et exécuter le processus comme d'habitude.

$ python3 doctest_example_without_import.py 3 4
7

Si vous exécutez doctest comme un script avec l'option -m, le test sera exécuté contre la fonction dans laquelle doctest est écrit. Si vous voulez afficher les résultats en sortie, ajoutez -v comme précédemment.

$ python3 -m doctest doctest_example_without_import.py

$ python3 -m doctest -v doctest_example_without_import.py
Trying:
    add(1, 2)
Expecting:
    3
ok
Trying:
    add(5, 10)
Expecting:
    15
ok
1 items had no tests:
    doctest_example_without_import
1 items passed all tests:
   2 tests in doctest_example_without_import.add
2 tests in 2 items.
2 passed and 0 failed.
Test passed.

Écriture de tests dans un fichier texte externe

Vous pouvez également écrire le code de test dans un fichier texte externe plutôt que dans la docstring.

Comment écrire un fichier texte

Écrire au format Python mode interactif, comme décrit dans le docstring. Il est nécessaire d'importer les fonctions à utiliser.

Si vous voulez placer le fichier texte dans le même répertoire que le fichier .py à tester, il suffit de l'importer comme suit.

>>> from doctest_example import add
>>> add(1, 2)
3
>>> add(5, 10)
15

Appelé à partir du fichier py

Appelez doctest.testfile() dans un autre fichier .py pour les tests.

Spécifiez le chemin du fichier texte où le code de test est écrit comme argument de doctest.testfile().

import doctest
doctest.testfile('doctest_text.txt')

Exécutez ce fichier py.

$ python3 doctest_example_testfile.py -v
Trying:
    from doctest_example import add
Expecting nothing
ok
Trying:
    add(1, 2)
Expecting:
    3
ok
Trying:
    add(5, 10)
Expecting:
    15
ok
1 items passed all tests:
   3 tests in doctest_text.txt
3 tests in 1 items.
3 passed and 0 failed.
Test passed.

Exécution directe d'un fichier texte

Même si vous n'avez pas le fichier py, vous pouvez lire le fichier texte directement depuis la ligne de commande et exécuter les tests.

Exécutez la commande Python avec l'option -m pour exécuter doctest comme un script. Vous pouvez spécifier le chemin du fichier texte comme argument de ligne de commande.

$ python3 -m doctest -v doctest_text.txt
Trying:
    from doctest_example import add
Expecting nothing
ok
Trying:
    add(1, 2)
Expecting:
    3
ok
Trying:
    add(5, 10)
Expecting:
    15
ok
1 items passed all tests:
   3 tests in doctest_text.txt
3 tests in 1 items.
3 passed and 0 failed.
Test passed.
Copied title and URL