Kako napisati i koristiti doctest za pisanje testnog koda u docstrings u Pythonu.

Poslovanje

Python dolazi sa standardnim doctest modulom koji testira sadržaj docstringa, što olakšava pisanje ulaznih i izlaznih primjera u docstring i olakšava razumijevanje dokumentacije.

Ovdje su navedene sljedeće informacije.

  • Jednostavan primjer testiranja s doctestom
    • Ako nema greške
    • Ako postoji greška
  • Kontrolirajte izlazne rezultate pomoću opcija i argumenata
    • -vOpcija
    • verboseargument (npr. funkcija, program, program)
  • Pokrenite doctest modul iz naredbenog retka
  • Pisanje testova u vanjskoj tekstualnoj datoteci
    • Kako napisati tekstualnu datoteku
    • Pozvan iz py datoteke
    • Izravno izvršite tekstualnu datoteku

Jednostavan primjer testiranja s doctestom

docstring je niz koji je zatvoren u jedno od sljedećeg: (1) naziv funkcije koja se testira, (2) naziv funkcije koja se testira i (3) očekivana izlazna vrijednost u Python interaktivnom načinu rada.

  • """
  • ''

Ako nema greške

Provjerite je li kod ispravan u sadržaju funkcije i niza dokumenata.

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

    return a + b


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

Pokrenite ovu datoteku.

$ python3 doctest_example.py

Ako nema grešaka, ništa se neće ispisati.

if __name__ == '__main__'To znači “izvrši naknadnu obradu samo kada se odgovarajuća datoteka skripte izvrši iz naredbenog retka.

Ako postoji greška

Ako kreirate i izvršite sljedeći pogrešan kod, ispisat će se pogreška.

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 kako slijedi.

Očekivane izlazne vrijednosti zapisane u doctest.Expected
Stvarna izlazna vrijednostGot

Kontrolirajte izlazne rezultate pomoću opcija i argumenata

-vOpcija

Ako želite da se rezultati izlaza prikažu čak i kada nema grešaka, pokrenite naredbu s opcijom -v u retku za naredbe.

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

Ako želite uvijek prikazati rezultate izlaza, navedite argument verbose=True u doctest.testmod() u py datoteci.

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

Rezultati izlaza uvijek će biti prikazani bez opcije -v tijekom izvođenja.

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

Pokrenite doctest modul iz naredbenog retka

if __name__ == '__main__'Ako želite učiniti nešto drugo u njemu, možete pokrenuti doctest modul izravno iz naredbenog retka bez pozivanja doctest.testmod() u py datoteci.

Na primjer, u sljedećim slučajevima

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)

Može primati argumente naredbenog retka i izvršavati proces kao i obično.

$ python3 doctest_example_without_import.py 3 4
7

Ako pokrenete doctest kao skriptu s opcijom -m, test će se pokrenuti protiv funkcije u kojoj je doctest napisan. Ako želite prikazati rezultate izlaza, dodajte -v kao prije.

$ 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 testova u vanjskoj tekstualnoj datoteci

Također možete napisati testni kod u vanjsku tekstualnu datoteku umjesto u docstring.

Kako napisati tekstualnu datoteku

Pišite u formatu interaktivnog načina Python, kao što je opisano u dokumentu. Potrebno je uvesti funkcije koje će se koristiti.

Ako želite tekstualnu datoteku staviti u isti direktorij kao i .py datoteka za testiranje, samo je uvezite na sljedeći način.

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

Pozvan iz py datoteke

Pozovite doctest.testfile() u drugoj .py datoteci radi testiranja.

Navedite stazu tekstualne datoteke u kojoj je napisan testni kod kao argument doctest.testfile().

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

Pokrenite ovu py datoteku.

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

Izravno izvršite tekstualnu datoteku

Čak i ako nemate py datoteku, tekstualnu datoteku možete pročitati izravno iz naredbenog retka i pokrenuti testove.

Pokrenite naredbu Python s opcijom -m da biste pokrenuli doctest kao skriptu. Možete odrediti put tekstualne datoteke kao argument naredbenog retka.

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