Wie man doctest schreibt und verwendet, um Testcode in Docstrings in Python zu schreiben.

Geschäft

Python wird mit einem Standard-Doctest-Modul geliefert, das den Inhalt eines Docstrings testet, was es einfach macht, Ein- und Ausgabebeispiele in den Docstring zu schreiben und die Dokumentation verständlicher zu machen.

Hier finden Sie die folgenden Informationen.

  • Ein einfaches Beispiel für das Testen mit doctest
    • Wenn kein Fehler vorliegt
    • Wenn ein Fehler auftritt
  • Kontrolle der Ausgabeergebnisse durch Optionen und Argumente
    • -vOption
    • verboseArgument (z. B. Funktion, Programm, Programm)
  • Führen Sie das doctest-Modul von der Befehlszeile aus
  • Schreiben von Tests in eine externe Textdatei
    • Wie man eine Textdatei schreibt
    • Aufgerufen aus der py-Datei
    • Direktes Ausführen einer Textdatei

Ein einfaches Beispiel für das Testen mit doctest

Ein docstring ist eine Zeichenkette, die von einer der folgenden Angaben umschlossen wird: (1) der Name der zu testenden Funktion, (2) der Name der zu testenden Funktion und (3) der erwartete Ausgabewert im interaktiven Modus von Python.

  • """
  • '''

Wenn kein Fehler vorliegt

Vergewissern Sie sich, dass der Code in der Funktion und im Docstring-Inhalt korrekt ist.

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

    return a + b


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

Führen Sie diese Datei aus.

$ python3 doctest_example.py

Wenn keine Fehler vorliegen, wird nichts ausgegeben.

if __name__ == '__main__'Dies bedeutet, dass “die nachfolgende Verarbeitung nur dann ausgeführt wird, wenn die entsprechende Skriptdatei von der Befehlszeile aus ausgeführt wird.

Wenn ein Fehler auftritt

Wenn Sie den folgenden falschen Code erstellen und ausführen, wird ein Fehler ausgegeben.

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.

Sie wird wie folgt dargestellt.

Erwartete Ausgabewerte in Doctest geschrieben.Expected
Tatsächlicher AusgangswertGot

Kontrolle der Ausgabeergebnisse durch Optionen und Argumente

-vOption

Wenn Sie möchten, dass die Ausgabeergebnisse auch dann angezeigt werden, wenn keine Fehler vorliegen, führen Sie den Befehl mit der Option -v in der Befehlszeile aus.

$ 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 (z. B. Funktion, Programm, Programm)

Wenn Sie die Ausgabeergebnisse immer anzeigen möchten, geben Sie das Argument verbose=True in doctest.testmod() in der py-Datei an.

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

Die Ausgabeergebnisse werden zur Laufzeit immer ohne die Option -v angezeigt.

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

Führen Sie das doctest-Modul von der Befehlszeile aus

if __name__ == '__main__'Wenn Sie etwas anderes darin machen wollen, können Sie das doctest-Modul direkt von der Kommandozeile aus starten, ohne doctest.testmod() in der py-Datei aufzurufen.

Zum Beispiel in den folgenden Fällen

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)

Er kann Befehlszeilenargumente entgegennehmen und den Prozess wie gewohnt ausführen.

$ python3 doctest_example_without_import.py 3 4
7

Wenn Sie doctest als Skript mit der Option -m ausführen, wird der Test gegen die Funktion ausgeführt, in der doctest geschrieben ist. Wenn Sie die Ausgabeergebnisse anzeigen möchten, fügen Sie wie zuvor -v hinzu.

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

Schreiben von Tests in eine externe Textdatei

Sie können den Testcode auch in eine externe Textdatei schreiben, statt in den Docstring.

Wie man eine Textdatei schreibt

Schreiben Sie im Format des interaktiven Python-Modus, wie im Docstring beschrieben. Es ist notwendig, die zu verwendenden Funktionen zu importieren.

Wenn Sie die Textdatei in dasselbe Verzeichnis wie die zu testende .py-Datei legen möchten, importieren Sie sie einfach wie folgt.

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

Aufgerufen aus der py-Datei

Rufen Sie doctest.testfile() in einer anderen .py-Datei zum Testen auf.

Geben Sie den Pfad der Textdatei, in die der Testcode geschrieben wird, als Argument von doctest.testfile() an.

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

Führen Sie diese py-Datei aus.

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

Direktes Ausführen einer Textdatei

Auch wenn Sie die py-Datei nicht haben, können Sie die Textdatei direkt von der Kommandozeile aus lesen und die Tests ausführen.

Führen Sie den Python-Befehl mit der Option -m aus, um doctest als Skript auszuführen. Sie können den Pfad der Textdatei als Befehlszeilenargument angeben.

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