Paano magsulat at gumamit ng doctest upang magsulat ng test code sa mga docstring sa Python.

Negosyo

Ang Python ay may kasamang karaniwang doctest module na sumusubok sa mga nilalaman ng isang docstring, na nagpapadali sa pagsulat ng mga halimbawa ng input at output sa docstring at ginagawang mas madaling maunawaan ang dokumentasyon.

Ang sumusunod na impormasyon ay ibinigay dito.

  • Isang simpleng halimbawa ng pagsubok gamit ang doctest
    • Kung walang mali
    • Kung may mali
  • Kontrolin ang mga resulta ng output sa pamamagitan ng mga opsyon at argumento
    • -vPagpipilian
    • verboseargumento (hal. function, program, program)
  • Patakbuhin ang doctest module mula sa command line
  • Pagsusulat ng mga pagsubok sa isang panlabas na text file
    • Paano magsulat ng isang text file
    • Tinawag mula sa py file
    • Direktang magsagawa ng text file

Isang simpleng halimbawa ng pagsubok gamit ang doctest

Ang docstring ay isang string na nakapaloob sa isa sa mga sumusunod: (1) ang pangalan ng function na susuriin, (2) ang pangalan ng function na susuriin, at (3) ang inaasahang output value sa Python interactive mode.

  • """
  • ''

Kung walang mali

Tiyaking tama ang code sa mga nilalaman ng function at docstring.

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

    return a + b


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

Patakbuhin ang file na ito.

$ python3 doctest_example.py

Kung walang mga error, walang magiging output.

if __name__ == '__main__'Nangangahulugan ito na “isagawa ang kasunod na pagproseso lamang kapag ang kaukulang file ng script ay naisakatuparan mula sa linya ng command.

Kung may mali

Kung gagawin mo at isasagawa ang sumusunod na maling code, isang error ang lalabas.

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.

Ito ay ipinapakita bilang mga sumusunod.

Mga inaasahang halaga ng output na nakasulat sa doctest.Expected
Aktwal na halaga ng outputGot

Kontrolin ang mga resulta ng output sa pamamagitan ng mga opsyon at argumento

-vPagpipilian

Kung nais mong ipakita ang mga resulta ng output kahit na walang mga error, patakbuhin ang command gamit ang -v na opsyon sa command line.

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

verboseargumento (hal. function, program, program)

Kung gusto mong palaging ipakita ang mga resulta ng output, tukuyin ang argument verbose=True sa doctest.testmod() sa py file.

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

Ang mga resulta ng output ay palaging ipapakita nang walang -v na opsyon sa runtime.

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

Patakbuhin ang doctest module mula sa command line

if __name__ == '__main__'Kung may gusto kang gawin dito, maaari mong patakbuhin ang doctest module nang direkta mula sa command line nang hindi tumatawag sa doctest.testmod() sa py file.

Halimbawa, sa mga sumusunod na kaso

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)

Maaari itong makatanggap ng mga argumento ng command line at isagawa ang proseso gaya ng dati.

$ python3 doctest_example_without_import.py 3 4
7

Kung magpapatakbo ka ng doctest bilang isang script na may -m na opsyon, ang pagsubok ay tatakbo laban sa function kung saan nakasulat ang doctest. Kung gusto mong ipakita ang mga resulta ng output, idagdag ang -v tulad ng dati.

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

Pagsusulat ng mga pagsubok sa isang panlabas na text file

Maaari mo ring isulat ang test code sa isang external na text file sa halip na sa docstring.

Paano magsulat ng isang text file

Sumulat sa Python interactive mode na format, gaya ng inilarawan sa docstring. Kinakailangang i-import ang mga function na gagamitin.

Kung gusto mong ilagay ang text file sa parehong direktoryo ng .py file na susuriin, i-import lang ito bilang mga sumusunod.

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

Tinawag mula sa py file

Tawagan ang doctest.testfile() sa isa pang .py file para sa pagsubok.

Tukuyin ang path ng text file kung saan nakasulat ang test code bilang argument ng doctest.testfile().

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

Patakbuhin ang py file na ito.

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

Direktang magsagawa ng text file

Kahit na wala kang py file, maaari mong basahin ang text file nang direkta mula sa command line at patakbuhin ang mga pagsubok.

Patakbuhin ang Python command gamit ang -m na opsyon upang patakbuhin ang doctest bilang isang script. Maaari mong tukuyin ang path ng text file bilang argumento ng command line.

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