Cara menulis dan menggunakan doctest untuk menulis kod ujian dalam docstrings dalam Python.

Perniagaan

Python disertakan dengan modul doctest standard yang menguji kandungan docstring, menjadikannya mudah untuk menulis input dan output contoh dalam docstring dan menjadikan dokumentasi lebih mudah untuk difahami.

Maklumat berikut disediakan di sini.

  • Contoh mudah ujian dengan doctest
    • Jika tiada kesilapan
    • Jika terdapat kesilapan
  • Kawal keputusan output dengan pilihan dan hujah
    • -vPilihan
    • verbosehujah (cth. fungsi, program, program)
  • Jalankan modul doctest dari baris arahan
  • Menulis ujian dalam fail teks luaran
    • Bagaimana untuk menulis fail teks
    • Dipanggil dari fail py
    • Laksanakan fail teks secara langsung

Contoh mudah ujian dengan doctest

Rentetan dokumen ialah rentetan yang disertakan dalam salah satu daripada yang berikut: (1) nama fungsi yang akan diuji, (2) nama fungsi yang akan diuji dan (3) nilai output yang dijangkakan dalam mod interaktif Python.

  • """
  • ''

Jika tiada kesilapan

Pastikan kod itu betul dalam fungsi dan kandungan docstring.

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

    return a + b


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

Jalankan fail ini.

$ python3 doctest_example.py

Jika tiada ralat, tiada apa yang akan dikeluarkan.

if __name__ == '__main__'Ini bermakna “laksanakan pemprosesan berikutnya hanya apabila fail skrip yang sepadan dilaksanakan daripada baris arahan.

Jika terdapat kesilapan

Jika anda mencipta dan melaksanakan kod yang salah berikut, ralat akan dikeluarkan.

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.

Ia ditunjukkan seperti berikut.

Nilai output yang dijangka ditulis dalam doctest.Expected
Nilai keluaran sebenarGot

Kawal keputusan output dengan pilihan dan hujah

-vPilihan

Jika anda mahu hasil output dipaparkan walaupun tiada ralat, jalankan arahan dengan pilihan -v pada baris arahan.

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

verbosehujah (cth. fungsi, program, program)

Jika anda ingin sentiasa memaparkan hasil keluaran, nyatakan hujah verbose=True dalam doctest.testmod() dalam fail py.

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

Hasil keluaran akan sentiasa dipaparkan tanpa pilihan -v semasa 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.

Jalankan modul doctest dari baris arahan

if __name__ == '__main__'Jika anda ingin melakukan sesuatu yang lain di dalamnya, anda boleh menjalankan modul doctest terus daripada baris arahan tanpa memanggil doctest.testmod() dalam fail py.

Sebagai contoh, dalam kes berikut

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)

Ia boleh menerima hujah baris arahan dan melaksanakan proses seperti biasa.

$ python3 doctest_example_without_import.py 3 4
7

Jika anda menjalankan doctest sebagai skrip dengan pilihan -m, ujian akan dijalankan terhadap fungsi di mana doctest ditulis. Jika anda ingin memaparkan hasil keluaran, tambah -v seperti sebelum ini.

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

Menulis ujian dalam fail teks luaran

Anda juga boleh menulis kod ujian dalam fail teks luaran dan bukannya dalam docstring.

Bagaimana untuk menulis fail teks

Tulis dalam format mod interaktif Python, seperti yang diterangkan dalam docstring. Ia adalah perlu untuk mengimport fungsi yang akan digunakan.

Jika anda ingin meletakkan fail teks dalam direktori yang sama dengan fail .py yang akan diuji, hanya importnya seperti berikut.

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

Dipanggil dari fail py

Panggil doctest.testfile() dalam fail .py lain untuk ujian.

Tentukan laluan fail teks tempat kod ujian ditulis sebagai hujah doctest.testfile().

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

Jalankan fail py ini.

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

Laksanakan fail teks secara langsung

Walaupun anda tidak mempunyai fail py, anda boleh membaca fail teks terus dari baris arahan dan menjalankan ujian.

Jalankan arahan Python dengan pilihan -m untuk menjalankan doctest sebagai skrip. Anda boleh menentukan laluan fail teks sebagai argumen baris arahan.

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