Hogyan írjunk és használjuk a doctestet tesztkód írására docstringekben Pythonban.

Üzleti

A Python tartalmaz egy szabványos doctest modult, amely teszteli a docstring tartalmát, megkönnyítve ezzel a docstringben a bemeneti és kimeneti példák megírását, és megkönnyítve a dokumentáció megértését.

A következő információk itt találhatók.

  • Egy egyszerű példa a doctesttel való tesztelésre
    • Ha nincs hiba
    • Hiba esetén
  • Kimeneti eredmények ellenőrzése opciókkal és argumentumokkal
    • -vOpció
    • verboseargumentum (pl. függvény, program, program)
  • A doctest modul futtatása a parancssorból
  • Tesztek írása külső szöveges fájlba
    • Hogyan írjunk szöveges fájlt
    • Py fájlból hívott
    • Szöveges fájl közvetlen végrehajtása

Egy egyszerű példa a doctesttel való tesztelésre

A docstring egy karakterlánc, amelyet a következők valamelyike zár be: (1) a tesztelendő függvény neve, (2) a tesztelendő függvény neve és (3) a Python interaktív módban várható kimeneti érték.

  • """
  • '''

Ha nincs hiba

Győződjön meg róla, hogy a kód helyes a függvény és a docstring tartalmában.

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

    return a + b


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

Futtassa ezt a fájlt.

$ python3 doctest_example.py

Ha nincs hiba, akkor a rendszer nem ad ki semmit.

if __name__ == '__main__'Ez azt jelenti, hogy “a későbbi feldolgozást csak akkor hajtja végre, ha a megfelelő szkriptfájlt a parancssorból hajtja végre.

Hiba esetén

Ha létrehozza és végrehajtja a következő rossz kódot, hibaüzenet jelenik meg.

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.

Ez a következőképpen jelenik meg.

A doctestben leírt várható kimeneti értékek.Expected
Tényleges kimeneti értékGot

Kimeneti eredmények ellenőrzése opciókkal és argumentumokkal

-vOpció

Ha azt szeretné, hogy a kimeneti eredmények akkor is megjelenjenek, ha nincsenek hibák, futtassa a parancsot a -v kapcsolóval a parancssorban.

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

verboseargumentum (pl. függvény, program, program)

Ha mindig meg akarja jeleníteni a kimeneti eredményeket, adja meg a py fájlban a doctest.testmod()-ban a verbose=True argumentumot.

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

A kimeneti eredmények mindig a -v opció nélkül jelennek meg futásidőben.

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

A doctest modul futtatása a parancssorból

if __name__ == '__main__'Ha valami mást akarsz benne csinálni, akkor a doctest modult közvetlenül a parancssorból is futtathatod anélkül, hogy a py fájlban meghívnád a doctest.testmod() parancsot.

Például a következő esetekben

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)

Parancssori argumentumokat fogadhat, és a folyamatot a szokásos módon hajthatja végre.

$ python3 doctest_example_without_import.py 3 4
7

Ha a doctestet szkriptként futtatod a -m kapcsolóval, a teszt a doctest által írt függvény ellen fog futni. Ha meg akarja jeleníteni a kimeneti eredményeket, adja hozzá a -v opciót, mint korábban.

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

Tesztek írása külső szöveges fájlba

A tesztkódot a docstring helyett egy külső szöveges fájlba is írhatja.

Hogyan írjunk szöveges fájlt

Írjon Python interaktív módban, a docstringben leírtak szerint. Szükséges a használni kívánt függvények importálása.

Ha a szöveges fájlt ugyanabba a könyvtárba akarod helyezni, mint a tesztelendő .py fájlt, csak importáld a következőképpen.

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

Py fájlból hívott

Hívja meg a doctest.testfile() parancsot egy másik .py fájlban a teszteléshez.

A doctest.testfile() argumentumaként adja meg annak a szöveges fájlnak az elérési útvonalát, amelybe a tesztkódot írja.

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

Futtassa ezt a py fájlt.

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

Szöveges fájl közvetlen végrehajtása

Ha nincs meg a py fájl, akkor is beolvashatja a szöveges fájlt közvetlenül a parancssorból, és futtathatja a teszteket.

Futtassa a Python parancsot a -m kapcsolóval a doctest szkriptként történő futtatásához. Parancssori argumentumként megadhatja a szöveges fájl elérési útvonalát.

$ 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