Hoe doctest te schrijven en te gebruiken om testcode te schrijven in docstrings in Python.

Bedrijf

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
    • -vOptie
    • verboseargument (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 uitgangswaardeGot

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.