Python wordt geleverd met een standaard doctest module die de inhoud van een docstring test, waardoor het gemakkelijk wordt om input en output voorbeelden in de docstring te schrijven en de documentatie begrijpelijker te maken.
De volgende informatie wordt hier verstrekt.
- Een eenvoudig voorbeeld van testen met doctest
- Als er geen fout is
- Als er een fout is
- Uitvoerresultaten regelen met opties en argumenten
-v
Optieverbose
argument (b.v. functie, programma, programma)
- Start de doctest module vanaf de commandoregel
- Schrijven van tests in een extern tekstbestand
- Hoe een tekstbestand te schrijven
- Aangeroepen vanuit py-bestand
- Direct een tekstbestand uitvoeren
Een eenvoudig voorbeeld van testen met doctest
Een docstring is een string ingesloten in een van de volgende: (1) de naam van de functie die getest moet worden, (2) de naam van de functie die getest moet worden, en (3) de verwachte uitvoerwaarde in de interactieve modus van Python.
"""
'''
Als er geen fout is
Zorg ervoor dat de code correct is in de functie en de docstring inhoud.
def add(a, b):
'''
>>> add(1, 2)
3
>>> add(5, 10)
15
'''
return a + b
if __name__ == '__main__':
import doctest
doctest.testmod()
Voer dit bestand uit.
$ python3 doctest_example.py
Als er geen fouten zijn, wordt er niets uitgevoerd.
if __name__ == '__main__'
Dit betekent “volgende bewerkingen alleen uitvoeren wanneer het corresponderende scriptbestand vanaf de opdrachtregel wordt uitgevoerd.
Als er een fout is
Als u de volgende foutieve code maakt en uitvoert, krijgt u een foutmelding.
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.
Het ziet er als volgt uit.
Verwachte uitvoerwaarden geschreven in doctest. | Expected |
Werkelijke uitgangswaarde | Got |
Uitvoerresultaten regelen met opties en argumenten
-vOptie
Als u wilt dat de uitvoerresultaten ook worden weergegeven als er geen fouten zijn, voert u het commando uit met de optie -v op de opdrachtregel.
$ 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 (b.v. functie, programma, programma)
Als u de uitvoerresultaten altijd wilt weergeven, specificeer dan het argument verbose=True in doctest.testmod() in het py-bestand.
if __name__ == '__main__':
import doctest
doctest.testmod(verbose=True)
De uitvoerresultaten worden tijdens runtime altijd weergegeven zonder de -v optie.
$ 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.
Start de doctest module vanaf de commandoregel
if __name__ == '__main__'
Als je er iets anders in wilt doen, kun je de doctest module direct vanaf de commandoregel draaien zonder doctest.testmod() in het py bestand aan te roepen.
Bijvoorbeeld in de volgende gevallen
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)
Het kan commandoregel argumenten ontvangen en het proces zoals gewoonlijk uitvoeren.
$ python3 doctest_example_without_import.py 3 4
7
Als je doctest als een script uitvoert met de -m optie, zal de test worden uitgevoerd tegen de functie waarin doctest is geschreven. Als je de uitvoerresultaten wilt weergeven, voeg dan -v toe zoals eerder.
$ 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.
Schrijven van tests in een extern tekstbestand
Je kunt de testcode ook in een extern tekstbestand schrijven in plaats van in de docstring.
Hoe een tekstbestand te schrijven
Schrijf in Python interactieve modus formaat, zoals beschreven in docstring. Het is noodzakelijk om de te gebruiken functies te importeren.
Als je het tekstbestand in dezelfde directory wilt zetten als het .py bestand dat getest moet worden, importeer je het als volgt.
>>> from doctest_example import add
>>> add(1, 2)
3
>>> add(5, 10)
15
Aangeroepen vanuit py-bestand
Roep doctest.testfile() aan in een ander .py bestand om te testen.
Specificeer het pad van het tekstbestand waar de testcode wordt geschreven als argument van doctest.testfile().
import doctest
doctest.testfile('doctest_text.txt')
Start dit py-bestand.
$ 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.
Direct een tekstbestand uitvoeren
Zelfs als je het py-bestand niet hebt, kun je het tekstbestand direct vanaf de commandoregel lezen en de tests uitvoeren.
Voer het Python commando uit met de -m optie om doctest als een script uit te voeren. U kunt het tekstbestandspad opgeven als een opdrachtregelargument.
$ 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.