Hur man skriver och använder doctest för att skriva testkod i docstrings i Python.

Företag

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
    • -vAlternativ
    • verboseargument (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ärdeGot

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.
Copied title and URL