Jak napsat a použít doctest pro zápis testovacího kódu v řetězcích dokumentů v jazyce Python.

Podnikání

Python obsahuje standardní modul doctest, který testuje obsah řetězce dokumentů, což usnadňuje psaní vstupních a výstupních příkladů v řetězci dokumentů a usnadňuje pochopení dokumentace.

Zde jsou uvedeny následující informace.

  • Jednoduchý příklad testování pomocí doctestu
    • Pokud nedojde k chybě
    • Pokud dojde k chybě
  • Řízení výstupních výsledků pomocí možností a argumentů
    • -vMožnost
    • verboseargument (např. funkce, program, program)
  • Spuštění modulu doctest z příkazového řádku
  • Zápis testů do externího textového souboru
    • Jak zapsat textový soubor
    • Voláno ze souboru py
    • Přímé spuštění textového souboru

Jednoduchý příklad testování pomocí doctestu

Dokumentační řetězec je řetězec uzavřený v jednom z následujících tvarů: (1) název testované funkce, (2) název testované funkce a (3) očekávaná výstupní hodnota v interaktivním režimu Pythonu.

  • """
  • '''

Pokud nedojde k chybě

Ujistěte se, že kód je správný v obsahu funkce a řetězce dokumentů.

def add(a, b):
    '''
    >>> add(1, 2)
    3
    >>> add(5, 10)
    15
    '''

    return a + b


if __name__ == '__main__':
    import doctest
    doctest.testmod()

Spusťte tento soubor.

$ python3 doctest_example.py

Pokud se nevyskytnou žádné chyby, nevypíše se nic.

if __name__ == '__main__'To znamená „provést následné zpracování pouze tehdy, když je příslušný soubor skriptu spuštěn z příkazového řádku.

Pokud dojde k chybě

Pokud vytvoříte a provedete následující chybný kód, zobrazí se chyba.

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.

Uvádí se takto.

Očekávané výstupní hodnoty zapsané v doctestu.Expected
Skutečná výstupní hodnotaGot

Řízení výstupních výsledků pomocí možností a argumentů

-vMožnost

Pokud chcete, aby se výstupní výsledky zobrazily i bez chyb, spusťte příkaz s parametrem -v na příkazovém řádku.

$ 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 (např. funkce, program, program)

Pokud chcete vždy zobrazit výstupní výsledky, zadejte v souboru py v příkazu doctest.testmod() argument verbose=True.

if __name__ == '__main__':
    import doctest
    doctest.testmod(verbose=True)

Výstupní výsledky se za běhu vždy zobrazí bez parametru -v.

$ 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.

Spuštění modulu doctest z příkazového řádku

if __name__ == '__main__'Pokud v něm chcete provést něco jiného, můžete modul doctest spustit přímo z příkazového řádku bez volání doctest.testmod() v souboru py.

Například v následujících případech

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)

Může přijímat argumenty příkazového řádku a spustit proces jako obvykle.

$ python3 doctest_example_without_import.py 3 4
7

Spustíte-li doctest jako skript s parametrem -m, bude test spuštěn proti funkci, ve které je doctest zapsán. Pokud chcete zobrazit výstupní výsledky, přidejte -v jako dříve.

$ 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.

Zápis testů do externího textového souboru

Testovací kód můžete také zapsat do externího textového souboru namísto do řetězce dokumentů.

Jak zapsat textový soubor

Zápis ve formátu interaktivního režimu Pythonu, jak je popsáno v docstringu. Je nutné importovat funkce, které mají být použity.

Pokud chcete textový soubor umístit do stejného adresáře jako testovaný soubor .py, stačí jej importovat následujícím způsobem.

>>> from doctest_example import add
>>> add(1, 2)
3
>>> add(5, 10)
15

Voláno ze souboru py

Volání doctest.testfile() v jiném souboru .py pro testování.

Jako argument příkazu doctest.testfile() zadejte cestu k textovému souboru, ve kterém je zapsán testovací kód.

import doctest
doctest.testfile('doctest_text.txt')

Spusťte tento soubor py.

$ 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.

Přímé spuštění textového souboru

I když nemáte soubor py, můžete textový soubor načíst přímo z příkazového řádku a spustit testy.

Spusťte příkaz Python s parametrem -m a spusťte doctest jako skript. Jako argument příkazového řádku můžete zadat cestu k textovému souboru.

$ 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.