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
-v
Optionverbose
argument (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 sortie | Got |
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.