Kuinka kirjoittaa ja käyttää doctestia testikoodin kirjoittamiseen Pythonissa oleviin docstringeihin.

liiketoiminta

Pythonissa on vakiona doctest-moduuli, joka testaa docstringin sisällön, mikä helpottaa tulo- ja lähtöesimerkkien kirjoittamista docstringiin ja tekee dokumentaatiosta helpommin ymmärrettävää.

Seuraavat tiedot annetaan tässä.

  • Yksinkertainen esimerkki testauksesta doctestin avulla
    • Jos virhettä ei ole
    • Jos tapahtuu virhe
  • Ohjaa tulostustuloksia vaihtoehtojen ja argumenttien avulla
    • -vVaihtoehto
    • verboseargumentti (esim. funktio, ohjelma, ohjelma)
  • Suorita doctest-moduuli komentoriviltä
  • Testien kirjoittaminen ulkoiseen tekstitiedostoon
    • Kuinka kirjoittaa tekstitiedosto
    • Kutsutaan py-tiedostosta
    • Suoraan tekstitiedoston suorittaminen

Yksinkertainen esimerkki testauksesta doctestin avulla

Docstring on merkkijono, joka on suljettu johonkin seuraavista: (1) testattavan funktion nimi, (2) testattavan funktion nimi ja (3) odotettu tulostusarvo vuorovaikutteisessa Python-tilassa.

  • """
  • '''

Jos virhettä ei ole

Varmista, että koodi on oikein funktiossa ja docstringin sisällössä.

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

    return a + b


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

Suorita tämä tiedosto.

$ python3 doctest_example.py

Jos virheitä ei ole, mitään ei tulosteta.

if __name__ == '__main__'Tämä tarkoittaa, että ”suorita myöhempi käsittely vain, kun vastaava komentosarjatiedosto suoritetaan komentoriviltä.

Jos tapahtuu virhe

Jos luot ja suoritat seuraavan väärän koodin, tuloksena on virheilmoitus.

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.

Se esitetään seuraavasti.

Odotetut tulostusarvot kirjoitettu doctestiin.Expected
Todellinen lähtöarvoGot

Ohjaa tulostustuloksia vaihtoehtojen ja argumenttien avulla

-vVaihtoehto

Jos haluat, että tulostustulokset näytetään myös silloin, kun virheitä ei ole, suorita komento komentorivillä -v-optiolla.

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

verboseargumentti (esim. funktio, ohjelma, ohjelma)

Jos haluat aina näyttää tulostustulokset, määritä argumentti verbose=True py-tiedoston doctest.testmod() -kohdassa.

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

Tulostustulokset näytetään aina ilman -v-optiota ajon aikana.

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

Suorita doctest-moduuli komentoriviltä

if __name__ == '__main__'Jos haluat tehdä siinä jotain muuta, voit ajaa doctest-moduulin suoraan komentoriviltä kutsumatta doctest.testmod() py-tiedostossa.

Esimerkiksi seuraavissa tapauksissa

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)

Se voi vastaanottaa komentoriviargumentteja ja suorittaa prosessin tavalliseen tapaan.

$ python3 doctest_example_without_import.py 3 4
7

Jos suoritat doctestin komentosarjana -m-optiolla, testi ajetaan funktiota vastaan, johon doctest on kirjoitettu. Jos haluat näyttää tulostulokset, lisää -v kuten aiemmin.

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

Testien kirjoittaminen ulkoiseen tekstitiedostoon

Voit myös kirjoittaa testikoodin ulkoiseen tekstitiedostoon docstringin sijasta.

Kuinka kirjoittaa tekstitiedosto

Kirjoita vuorovaikutteisessa Python-muodossa, kuten docstringissä on kuvattu. On tarpeen tuoda käytettävät funktiot.

Jos haluat laittaa tekstitiedoston samaan hakemistoon kuin testattavan .py-tiedoston, tuo se vain seuraavasti.

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

Kutsutaan py-tiedostosta

Kutsu doctest.testfile() toisessa .py-tiedostossa testausta varten.

Määritä sen tekstitiedoston polku, johon testikoodi kirjoitetaan, doctest.testfile()-olion argumenttina.

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

Suorita tämä py-tiedosto.

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

Suoraan tekstitiedoston suorittaminen

Vaikka sinulla ei olisi py-tiedostoa, voit lukea tekstitiedoston suoraan komentoriviltä ja suorittaa testit.

Suorita Python-komento -m-optiolla suorittaaksesi doctestin skriptinä. Voit määrittää tekstitiedoston polun komentoriviargumenttina.

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