Cách viết và sử dụng doctest để viết mã kiểm tra trong docstrings bằng Python.

Kinh doanh

Python đi kèm với một mô-đun học thuyết chuẩn kiểm tra nội dung của chuỗi tài liệu, giúp bạn dễ dàng viết các ví dụ đầu vào và đầu ra trong chuỗi tài liệu và làm cho tài liệu dễ hiểu hơn.

Thông tin sau được cung cấp ở đây.

  • Một ví dụ đơn giản về thử nghiệm với học thuyết
    • Nếu không có lỗi
    • Nếu có lỗi
  • Kiểm soát kết quả đầu ra bằng các tùy chọn và đối số
    • -vLựa chọn
    • verboseđối số (ví dụ: hàm, chương trình, chương trình)
  • Chạy mô-đun học thuyết từ dòng lệnh
  • Viết bài kiểm tra trong một tệp văn bản bên ngoài
    • Cách viết tệp văn bản
    • Được gọi từ tệp py
    • Thực thi trực tiếp một tệp văn bản

Một ví dụ đơn giản về thử nghiệm với học thuyết

Chuỗi doc là một chuỗi được bao gồm trong một trong những phần sau: (1) tên của hàm sẽ được kiểm tra, (2) tên của hàm sẽ được kiểm tra và (3) giá trị đầu ra mong đợi trong chế độ tương tác Python.

  • """
  • ''

Nếu không có lỗi

Đảm bảo rằng mã chính xác trong nội dung hàm và docstring.

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

    return a + b


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

Chạy tệp này.

$ python3 doctest_example.py

Nếu không có lỗi, sẽ không có gì được xuất ra.

if __name__ == '__main__'Điều này có nghĩa là “chỉ thực hiện xử lý tiếp theo khi tệp kịch bản tương ứng được thực thi từ dòng lệnh.

Nếu có lỗi

Nếu bạn tạo và thực thi sai mã sau, một lỗi sẽ xuất hiện.

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.

Nó được hiển thị như sau.

Giá trị đầu ra mong đợi được viết trong học thuyết.Expected
Giá trị đầu ra thực tếGot

Kiểm soát kết quả đầu ra bằng các tùy chọn và đối số

-vLựa chọn

Nếu bạn muốn kết quả đầu ra được hiển thị ngay cả khi không có lỗi, hãy chạy lệnh với tùy chọn -v trên dòng lệnh.

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

verboseđối số (ví dụ: hàm, chương trình, chương trình)

Nếu bạn muốn luôn hiển thị kết quả đầu ra, hãy chỉ định đối số verbose = True trong doctest.testmod () trong tệp py.

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

Kết quả đầu ra sẽ luôn được hiển thị mà không có tùy chọn -v trong thời gian chạy.

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

Chạy mô-đun học thuyết từ dòng lệnh

if __name__ == '__main__'Nếu bạn muốn làm điều gì đó khác trong đó, bạn có thể chạy mô-đun doctest trực tiếp từ dòng lệnh mà không cần gọi doctest.testmod () trong tệp py.

Ví dụ, trong các trường hợp sau

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)

Nó có thể nhận các đối số dòng lệnh và thực hiện quy trình như bình thường.

$ python3 doctest_example_without_import.py 3 4
7

Nếu bạn chạy học thuyết dưới dạng tập lệnh với tùy chọn -m, bài kiểm tra sẽ được chạy dựa trên chức năng mà học thuyết được viết. Nếu bạn muốn hiển thị kết quả đầu ra, hãy thêm -v như trước.

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

Viết bài kiểm tra trong một tệp văn bản bên ngoài

Bạn cũng có thể viết mã kiểm tra trong tệp văn bản bên ngoài thay vì trong chuỗi doc.

Cách viết tệp văn bản

Viết ở định dạng chế độ tương tác Python, như được mô tả trong docstring. Nó là cần thiết để nhập các chức năng sẽ được sử dụng.

Nếu bạn muốn đặt tệp văn bản trong cùng thư mục với tệp .py sẽ được kiểm tra, chỉ cần nhập tệp đó như sau.

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

Được gọi từ tệp py

Gọi doctest.testfile () trong một tệp .py khác để kiểm tra.

Chỉ định đường dẫn của tệp văn bản nơi mã kiểm tra được viết làm đối số của doctest.testfile ().

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

Chạy tệp py này.

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

Thực thi trực tiếp một tệp văn bản

Ngay cả khi bạn không có tệp py, bạn có thể đọc tệp văn bản trực tiếp từ dòng lệnh và chạy các bài kiểm tra.

Chạy lệnh Python với tùy chọn -m để chạy học thuyết dưới dạng tập lệnh. Bạn có thể chỉ định đường dẫn tệp văn bản làm đối số dòng lệnh.

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