Python leveres med et standarddoctest-modul, der tester indholdet af en docstring, hvilket gør det nemt at skrive input- og output-eksempler i docstringen og gør dokumentationen lettere at forstå.
Her findes følgende oplysninger.
- Et simpelt eksempel på test med doctest
- Hvis der ikke er nogen fejl
- Hvis der opstår en fejl
- Kontrol af outputresultater ved hjælp af indstillinger og argumenter
-v
Mulighedverbose
argument (f.eks. funktion, program, program)
- Kør doctest-modulet fra kommandolinjen
- Skrivning af test i en ekstern tekstfil
- Hvordan man skriver en tekstfil
- Kaldes fra py-fil
- Direkte udførelse af en tekstfil
Et simpelt eksempel på test med doctest
En docstring er en streng, der er omsluttet af en af følgende: (1) navnet på den funktion, der skal testes, (2) navnet på den funktion, der skal testes, og (3) den forventede outputværdi i Python interaktiv tilstand.
"""
'''
Hvis der ikke er nogen fejl
Sørg for, at koden er korrekt i funktionen og i indholdet af dokumentstrengen.
def add(a, b):
'''
>>> add(1, 2)
3
>>> add(5, 10)
15
'''
return a + b
if __name__ == '__main__':
import doctest
doctest.testmod()
Kør denne fil.
$ python3 doctest_example.py
Hvis der ikke er nogen fejl, vil der ikke blive udsendt noget.
if __name__ == '__main__'
Det betyder, at “kun udføre efterfølgende behandling, når den tilsvarende scriptfil udføres fra kommandolinjen”.
Hvis der opstår en fejl
Hvis du opretter og udfører følgende forkerte kode, vil du få en fejl.
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.
Den er vist på følgende måde.
Forventede outputværdier skrevet i doctest. | Expected |
Faktisk udgangsværdi | Got |
Kontrol af outputresultater ved hjælp af indstillinger og argumenter
-vMulighed
Hvis du ønsker at få vist outputresultaterne, selv når der ikke er nogen fejl, skal du køre kommandoen med indstillingen -v på kommandolinjen.
$ 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 (f.eks. funktion, program, program)
Hvis du altid vil have vist outputresultaterne, skal du angive argumentet verbose=True i doctest.testmod() i py-filen.
if __name__ == '__main__':
import doctest
doctest.testmod(verbose=True)
Outputresultaterne vil altid blive vist uden indstillingen -v ved kørselstid.
$ 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.
Kør doctest-modulet fra kommandolinjen
if __name__ == '__main__'
Hvis du ønsker at gøre noget andet i det, kan du køre doctest-modulet direkte fra kommandolinjen uden at kalde doctest.testmod() i py-filen.
For eksempel i følgende tilfælde
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)
Den kan modtage kommandolinjeargumenter og udføre processen som sædvanlig.
$ python3 doctest_example_without_import.py 3 4
7
Hvis du kører doctest som et script med indstillingen -m, vil testen blive kørt mod den funktion, som doctest er skrevet i. Hvis du ønsker at vise outputresultaterne, skal du tilføje -v som før.
$ 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.
Skrivning af test i en ekstern tekstfil
Du kan også skrive testkoden i en ekstern tekstfil i stedet for i dokumentstrengen.
Hvordan man skriver en tekstfil
Skriv i Python-format i interaktiv tilstand, som beskrevet i dokumentstrengen. Det er nødvendigt at importere de funktioner, der skal bruges.
Hvis du ønsker at placere tekstfilen i samme mappe som den .py-fil, der skal testes, skal du blot importere den som følger.
>>> from doctest_example import add
>>> add(1, 2)
3
>>> add(5, 10)
15
Kaldes fra py-fil
Kald doctest.testfile() i en anden .py-fil til testning.
Angiv stien til den tekstfil, hvor testkoden er skrevet, som argument for doctest.testfile().
import doctest
doctest.testfile('doctest_text.txt')
Kør denne py-fil.
$ 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.
Direkte udførelse af en tekstfil
Selv hvis du ikke har py-filen, kan du læse tekstfilen direkte fra kommandolinjen og køre testene.
Kør Python-kommandoen med indstillingen -m for at køre doctest som et script. Du kan angive stien til tekstfilen som et kommandolinjeargument.
$ 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.