Kako napisati in uporabiti program doctest za pisanje testne kode v dokumentnih nizih v Pythonu.

Posel

Python ima standardni modul doctest, ki preizkusi vsebino niza dokumentov, kar olajša pisanje vhodnih in izhodnih primerov v nizu dokumentov in olajša razumevanje dokumentacije.

Tu so na voljo naslednje informacije.

  • Preprost primer testiranja s programom doctest
    • Če ni napake
    • Če se pojavi napaka
  • Nadzor izhodnih rezultatov z možnostmi in argumenti
    • -vMožnost
    • verboseargument (npr. funkcija, program, program)
  • Zagon modula doctest iz ukazne vrstice
  • Pisanje testov v zunanjo besedilno datoteko
    • Kako napisati besedilno datoteko
    • Klican iz datoteke py
    • Neposredno izvajanje besedilne datoteke

Preprost primer testiranja s programom doctest

Dokumentni niz je niz, ki je zaprt z enim od naslednjih elementov: (1) ime funkcije, ki jo je treba preizkusiti, (2) ime funkcije, ki jo je treba preizkusiti, in (3) pričakovana izhodna vrednost v interaktivnem načinu Pythona.

  • """
  • '''

Če ni napake

Prepričajte se, da je koda v funkciji in vsebini vrstice dokumenta pravilna.

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

    return a + b


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

Zaženite to datoteko.

$ python3 doctest_example.py

Če ni napak, se ne izpiše nič.

if __name__ == '__main__'To pomeni “izvedi nadaljnjo obdelavo samo, ko se ustrezna datoteka skript izvede iz ukazne vrstice.

Če se pojavi napaka

Če ustvarite in izvedete naslednjo napačno kodo, se izpiše napaka.

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.

To je prikazano na naslednji način.

Pričakovane izhodne vrednosti, zapisane v doctestu.Expected
Dejanska izhodna vrednostGot

Nadzor izhodnih rezultatov z možnostmi in argumenti

-vMožnost

Če želite, da se rezultati prikažejo tudi, če ni napak, zaženite ukaz z možnostjo -v v ukazni vrstici.

$ 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 (npr. funkcija, program, program)

Če želite vedno prikazati izhodne rezultate, v datoteki py v ukazu doctest.testmod() določite argument verbose=True.

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

Izhodni rezultati bodo med izvajanjem vedno prikazani brez možnosti -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.

Zagon modula doctest iz ukazne vrstice

if __name__ == '__main__'Če želite v njem narediti kaj drugega, lahko modul doctest zaženete neposredno iz ukazne vrstice, ne da bi v datoteki py klicali doctest.testmod().

Na primer v naslednjih primerih

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)

Sprejema lahko argumente ukazne vrstice in izvede postopek kot običajno.

$ python3 doctest_example_without_import.py 3 4
7

Če zaženete doctest kot skripto z možnostjo -m, se bo test izvajal v funkciji, v kateri je zapisan doctest. Če želite prikazati izhodne rezultate, dodajte -v kot prej.

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

Pisanje testov v zunanjo besedilno datoteko

Testno kodo lahko zapišete tudi v zunanjo besedilno datoteko namesto v verigo dokumentov.

Kako napisati besedilno datoteko

Pišite v obliki Pythonovega interaktivnega načina, kot je opisano v dokumentaciji. Funkcije, ki se bodo uporabljale, je treba uvoziti.

Če želite postaviti besedilno datoteko v isti imenik kot datoteko .py, ki jo želite testirati, jo uvozite na naslednji način.

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

Klican iz datoteke py

Pokličite doctest.testfile() v drugo datoteko .py za testiranje.

Kot argument funkcije doctest.testfile() navedite pot do besedilne datoteke, v kateri je zapisana testna koda.

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

Zaženite to py datoteko.

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

Neposredno izvajanje besedilne datoteke

Tudi če nimate datoteke py, lahko besedilno datoteko preberete neposredno iz ukazne vrstice in zaženete teste.

Zaženite ukaz Python z možnostjo -m, da zaženete doctest kot skripto. Kot argument ukazne vrstice lahko navedete pot do besedilne datoteke.

$ 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