Hvordan man skriver og bruger doctest til at skrive testkode i docstrings i Python.

Forretning

Python leveres med et standarddoctest-modul, der tester indholdet af en docstring, hvilket gør det nemt at skrive input- og output-eksempler i docstringen og gør dokumentationen lettere at forstå.

Her findes følgende oplysninger.

  • Et simpelt eksempel på test med doctest
    • Hvis der ikke er nogen fejl
    • Hvis der opstår en fejl
  • Kontrol af outputresultater ved hjælp af indstillinger og argumenter
    • -vMulighed
    • verboseargument (f.eks. funktion, program, program)
  • Kør doctest-modulet fra kommandolinjen
  • Skrivning af test i en ekstern tekstfil
    • Hvordan man skriver en tekstfil
    • Kaldes fra py-fil
    • Direkte udførelse af en tekstfil

Et simpelt eksempel på test med doctest

En docstring er en streng, der er omsluttet af en af følgende: (1) navnet på den funktion, der skal testes, (2) navnet på den funktion, der skal testes, og (3) den forventede outputværdi i Python interaktiv tilstand.

  • """
  • '''

Hvis der ikke er nogen fejl

Sørg for, at koden er korrekt i funktionen og i indholdet af dokumentstrengen.

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

    return a + b


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

Kør denne fil.

$ python3 doctest_example.py

Hvis der ikke er nogen fejl, vil der ikke blive udsendt noget.

if __name__ == '__main__'Det betyder, at “kun udføre efterfølgende behandling, når den tilsvarende scriptfil udføres fra kommandolinjen”.

Hvis der opstår en fejl

Hvis du opretter og udfører følgende forkerte kode, vil du få en fejl.

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 er vist på følgende måde.

Forventede outputværdier skrevet i doctest.Expected
Faktisk udgangsværdiGot

Kontrol af outputresultater ved hjælp af indstillinger og argumenter

-vMulighed

Hvis du ønsker at få vist outputresultaterne, selv når der ikke er nogen fejl, skal du køre kommandoen med indstillingen -v på kommandolinjen.

$ 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 (f.eks. funktion, program, program)

Hvis du altid vil have vist outputresultaterne, skal du angive argumentet verbose=True i doctest.testmod() i py-filen.

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

Outputresultaterne vil altid blive vist uden indstillingen -v ved kørselstid.

$ 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-modulet fra kommandolinjen

if __name__ == '__main__'Hvis du ønsker at gøre noget andet i det, kan du køre doctest-modulet direkte fra kommandolinjen uden at kalde doctest.testmod() i py-filen.

For eksempel i følgende tilfælde

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 modtage kommandolinjeargumenter og udføre processen som sædvanlig.

$ python3 doctest_example_without_import.py 3 4
7

Hvis du kører doctest som et script med indstillingen -m, vil testen blive kørt mod den funktion, som doctest er skrevet i. Hvis du ønsker at vise outputresultaterne, skal du tilføje -v som før.

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

Skrivning af test i en ekstern tekstfil

Du kan også skrive testkoden i en ekstern tekstfil i stedet for i dokumentstrengen.

Hvordan man skriver en tekstfil

Skriv i Python-format i interaktiv tilstand, som beskrevet i dokumentstrengen. Det er nødvendigt at importere de funktioner, der skal bruges.

Hvis du ønsker at placere tekstfilen i samme mappe som den .py-fil, der skal testes, skal du blot importere den som følger.

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

Kaldes fra py-fil

Kald doctest.testfile() i en anden .py-fil til testning.

Angiv stien til den tekstfil, hvor testkoden er skrevet, som argument for doctest.testfile().

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

Kør denne py-fil.

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

Direkte udførelse af en tekstfil

Selv hvis du ikke har py-filen, kan du læse tekstfilen direkte fra kommandolinjen og køre testene.

Kør Python-kommandoen med indstillingen -m for at køre doctest som et script. Du kan angive stien til tekstfilen som et kommandolinjeargument.

$ 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