Python har en standardmodul för doctest som testar innehållet i en dokumentsträng, vilket gör det enkelt att skriva inmatnings- och utmatningsexempel i dokumentsträngen och gör dokumentationen lättare att förstå.
Här finns följande information.
- Ett enkelt exempel på testning med doctest
- Om det inte finns något fel
- Om det uppstår ett fel
- Kontrollera utdataresultat med hjälp av alternativ och argument
-v
Alternativverbose
argument (t.ex. funktion, program, program).
- Kör doctest-modulen från kommandoraden
- Skriva tester i en extern textfil
- Hur man skriver en textfil
- Anropas från py-filen
- Exekvera en textfil direkt
Ett enkelt exempel på testning med doctest
En dokumentsträng är en sträng som är innesluten i något av följande: (1) namnet på den funktion som ska testas, (2) namnet på den funktion som ska testas och (3) det förväntade utdatavärdet i interaktivt Python-läge.
"""
'''
Om det inte finns något fel
Kontrollera att koden är korrekt i funktionen och i innehållet i dokumentsträngen.
def add(a, b):
'''
>>> add(1, 2)
3
>>> add(5, 10)
15
'''
return a + b
if __name__ == '__main__':
import doctest
doctest.testmod()
Kör den här filen.
$ python3 doctest_example.py
Om det inte finns några fel kommer inget att visas.
if __name__ == '__main__'
Detta innebär att ”exekvera efterföljande bearbetning endast när motsvarande skriptfil exekveras från kommandoraden”.
Om det uppstår ett fel
Om du skapar och utför följande felaktiga kod kommer ett fel att visas.
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 visas på följande sätt.
Förväntade värden skrivna i doctest. | Expected |
Faktiskt utgångsvärde | Got |
Kontrollera utdataresultat med hjälp av alternativ och argument
-vAlternativ
Om du vill att utdataresultaten ska visas även när det inte finns några fel, kör kommandot med alternativet -v på kommandoraden.
$ 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 (t.ex. funktion, program, program).
Om du alltid vill visa utdataresultaten anger du argumentet verbose=True i doctest.testmod() i py-filen.
if __name__ == '__main__':
import doctest
doctest.testmod(verbose=True)
Utdataresultaten kommer alltid att visas utan alternativet -v vid körning.
$ 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-modulen från kommandoraden
if __name__ == '__main__'
Om du vill göra något annat i den kan du köra doctest-modulen direkt från kommandoraden utan att anropa doctest.testmod() i py-filen.
Till exempel i följande fall
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 ta emot kommandoradsargument och utföra processen som vanligt.
$ python3 doctest_example_without_import.py 3 4
7
Om du kör doctest som ett skript med alternativet -m kommer testet att köras mot den funktion i vilken doctest är skriven. Om du vill visa utdataresultaten lägger du till -v som tidigare.
$ 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.
Skriva tester i en extern textfil
Du kan också skriva testkoden i en extern textfil i stället för i dokumentationen.
Hur man skriver en textfil
Skriv i Pythons interaktiva format, enligt beskrivningen i dokumentsträngen. Det är nödvändigt att importera de funktioner som ska användas.
Om du vill placera textfilen i samma katalog som den .py-fil som ska testas importerar du den på följande sätt.
>>> from doctest_example import add
>>> add(1, 2)
3
>>> add(5, 10)
15
Anropas från py-filen
Kalla doctest.testfile() i en annan .py-fil för testning.
Ange sökvägen till den textfil där testkoden skrivs som argument för doctest.testfile().
import doctest
doctest.testfile('doctest_text.txt')
Kör den här py-filen.
$ 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.
Exekvera en textfil direkt
Även om du inte har py-filen kan du läsa textfilen direkt från kommandoraden och köra testerna.
Kör Pythonkommandot med alternativet -m för att köra doctest som ett skript. Du kan ange sökvägen till textfilen som ett kommandoradsargument.
$ 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.