Hướng dẫn doctest python - con trăn
Mô -đun python -m doctest -v example.py4 tìm kiếm các đoạn văn bản trông giống như các phiên Python tương tác, và sau đó thực hiện các phiên đó để xác minh rằng chúng hoạt động chính xác như được hiển thị. Có một số cách phổ biến để sử dụng DocTest: Show
Ở đây, một mô -đun ví dụ hoàn chỉnh nhưng nhỏ: """ This is the "example" module. The example module supplies one function, factorial(). For example, >>> factorial(5) 120 """ def factorial(n): """Return the factorial of n, an exact integer >= 0. If the result is small enough to fit in an int, return an int. Else return a long. >>> [factorial(n) for n in range(6)] [1, 1, 2, 6, 24, 120] >>> [factorial(long(n)) for n in range(6)] [1, 1, 2, 6, 24, 120] >>> factorial(30) 265252859812191058636308480000000L >>> factorial(30L) 265252859812191058636308480000000L >>> factorial(-1) Traceback (most recent call last): ... ValueError: n must be >= 0 Factorials of floats are OK, but the float must be an exact integer: >>> factorial(30.1) Traceback (most recent call last): ... ValueError: n must be exact integer >>> factorial(30.0) 265252859812191058636308480000000L It must also not be ridiculously large: >>> factorial(1e100) Traceback (most recent call last): ... OverflowError: n too large """ import math if not n >= 0: raise ValueError("n must be >= 0") if math.floor(n) != n: raise ValueError("n must be exact integer") if n+1 == n: # catch a value like 1e300 raise OverflowError("n too large") result = 1 factor = 2 while factor <= n: result *= factor factor += 1 return result if __name__ == "__main__": import doctest doctest.testmod() Nếu bạn chạy python -m doctest -v example.py5 trực tiếp từ dòng lệnh, python -m doctest -v example.py4 hoạt động phép thuật của nó: Không có đầu ra! Điều đó bình thường, và nó có nghĩa là tất cả các ví dụ đã hoạt động. Chuyển python -m doctest -v example.py7 cho tập lệnh và python -m doctest -v example.py4 in một bản ghi chi tiết về những gì nó cố gắng và in một bản tóm tắt ở cuối: $ python example.py -v Trying: factorial(5) Expecting: 120 ok Trying: [factorial(n) for n in range(6)] Expecting: [1, 1, 2, 6, 24, 120] ok Trying: [factorial(long(n)) for n in range(6)] Expecting: [1, 1, 2, 6, 24, 120] ok Và như vậy, cuối cùng kết thúc với: Trying: factorial(1e100) Expecting: Traceback (most recent call last): ... OverflowError: n too large ok 2 items passed all tests: 1 tests in __main__ 8 tests in __main__.factorial 9 tests in 2 items. 9 passed and 0 failed. Test passed. $ Đó là tất cả những gì bạn cần biết để bắt đầu sử dụng hiệu quả python -m doctest -v example.py4! Nhảy vào. Các phần sau đây cung cấp chi tiết đầy đủ. Lưu ý rằng có nhiều ví dụ về tài liệu trong bộ thử nghiệm Python và thư viện tiêu chuẩn. Đặc biệt các ví dụ hữu ích có thể được tìm thấy trong tệp thử nghiệm tiêu chuẩn import doctest doctest.testfile("example.txt")0. 25.2.1. Sử dụng đơn giản: Kiểm tra các ví dụ trong Docstrings¶Simple Usage: Checking Examples in Docstrings¶Cách đơn giản nhất để bắt đầu sử dụng DocTest (nhưng không nhất thiết là cách bạn sẽ tiếp tục làm điều đó) là kết thúc mỗi mô -đun import doctest doctest.testfile("example.txt")1 với: if __name__ == "__main__": import doctest doctest.testmod() python -m doctest -v example.py4 sau đó kiểm tra các tài liệu trong mô -đun import doctest doctest.testfile("example.txt")1. Chạy mô -đun dưới dạng tập lệnh khiến các ví dụ trong DocStrings được thực thi và xác minh: Điều này sẽ không hiển thị bất cứ điều gì trừ khi một ví dụ không thành công, trong trường hợp đó, ví dụ thất bại và (các) nguyên nhân của (các) lỗi được in thành stdout và dòng đầu ra cuối cùng là import doctest doctest.testfile("example.txt")4, trong đó n là Số lượng ví dụ thất bại. Thay vào đó, hãy chạy nó với công tắc python -m doctest -v example.py7: và một báo cáo chi tiết về tất cả các ví dụ đã thử được in ra đầu ra tiêu chuẩn, cùng với các bản tóm tắt các loại ở cuối. Bạn có thể buộc chế độ dài dòng bằng cách chuyển import doctest doctest.testfile("example.txt")6 đến import doctest doctest.testfile("example.txt")7 hoặc cấm nó bằng cách vượt qua import doctest doctest.testfile("example.txt")8. Trong một trong những trường hợp đó, import doctest doctest.testfile("example.txt")9 không được kiểm tra bởi import doctest doctest.testfile("example.txt")7 (vì vậy việc vượt qua python -m doctest -v example.py7 hoặc không có tác dụng). Kể từ Python 2.6, cũng có một phím tắt dòng lệnh để chạy import doctest doctest.testfile("example.txt")7. Bạn có thể hướng dẫn trình thông dịch Python chạy mô -đun tài liệu trực tiếp từ thư viện tiêu chuẩn và chuyển (các) tên mô -đun trên dòng lệnh: python -m doctest -v example.py Điều này sẽ nhập python -m doctest -v example.py5 dưới dạng mô -đun độc lập và chạy import doctest doctest.testfile("example.txt")7 trên đó. Lưu ý rằng điều này có thể không hoạt động chính xác nếu tệp là một phần của gói và nhập các mô hình con khác từ gói đó. Để biết thêm thông tin về import doctest doctest.testfile("example.txt")7, xem phần API cơ bản.Basic API. 25.2.2. Cách sử dụng đơn giản: Kiểm tra các ví dụ trong tệp văn bảnSimple Usage: Checking Examples in a Text File¶Một ứng dụng đơn giản khác của DocTest là kiểm tra các ví dụ tương tác trong một tệp văn bản. Điều này có thể được thực hiện với chức năng The ``example`` module ====================== Using ``factorial`` ------------------- This is an example text file in reStructuredText format. First import ``factorial`` from the ``example`` module: >>> from example import factorial Now use it: >>> factorial(6) 1206: import doctest doctest.testfile("example.txt") Kịch bản ngắn đó thực thi và xác minh bất kỳ ví dụ Python tương tác nào có trong tệp The ``example`` module ====================== Using ``factorial`` ------------------- This is an example text file in reStructuredText format. First import ``factorial`` from the ``example`` module: >>> from example import factorial Now use it: >>> factorial(6) 1207. Nội dung tệp được xử lý như thể nó là một tài liệu khổng lồ duy nhất; Các tập tin không cần phải chứa một chương trình Python! Ví dụ, có lẽ The ``example`` module ====================== Using ``factorial`` ------------------- This is an example text file in reStructuredText format. First import ``factorial`` from the ``example`` module: >>> from example import factorial Now use it: >>> factorial(6) 1207 chứa điều này: The ``example`` module ====================== Using ``factorial`` ------------------- This is an example text file in reStructuredText format. First import ``factorial`` from the ``example`` module: >>> from example import factorial Now use it: >>> factorial(6) 120 Chạy The ``example`` module ====================== Using ``factorial`` ------------------- This is an example text file in reStructuredText format. First import ``factorial`` from the ``example`` module: >>> from example import factorial Now use it: >>> factorial(6) 1209 sau đó tìm thấy lỗi trong tài liệu này: File "./example.txt", line 14, in example.txt Failed example: factorial(6) Expected: 120 Got: 720 Như với import doctest doctest.testfile("example.txt")7, The ``example`` module ====================== Using ``factorial`` ------------------- This is an example text file in reStructuredText format. First import ``factorial`` from the ``example`` module: >>> from example import factorial Now use it: >>> factorial(6) 1206 đã giành được bất cứ thứ gì trừ khi một ví dụ thất bại. Nếu một ví dụ không thành công, thì ví dụ thất bại và (các) nguyên nhân của (các) lỗi được in thành stdout, sử dụng cùng định dạng với import doctest doctest.testfile("example.txt")7. Theo mặc định, The ``example`` module ====================== Using ``factorial`` ------------------- This is an example text file in reStructuredText format. First import ``factorial`` from the ``example`` module: >>> from example import factorial Now use it: >>> factorial(6) 1206 tìm các tệp trong thư mục mô -đun gọi. Xem phần API cơ bản để biết mô tả về các đối số tùy chọn có thể được sử dụng để nói với nó để tìm các tệp ở các vị trí khác.Basic API for a description of the optional arguments that can be used to tell it to look for files in other locations. Giống như import doctest doctest.testfile("example.txt")7, ________ 66 Verbosity có thể được đặt với công tắc dòng lệnh python -m doctest -v example.py7 hoặc với dòng chảy đối số từ khóa tùy chọn. Kể từ Python 2.6, cũng có một phím tắt dòng lệnh để chạy The ``example`` module ====================== Using ``factorial`` ------------------- This is an example text file in reStructuredText format. First import ``factorial`` from the ``example`` module: >>> from example import factorial Now use it: >>> factorial(6) 1206. Bạn có thể hướng dẫn trình thông dịch Python chạy mô -đun tài liệu trực tiếp từ thư viện tiêu chuẩn và chuyển (các) tên tệp trên dòng lệnh: python -m doctest -v example.txt Bởi vì tên tệp không kết thúc bằng File "./example.txt", line 14, in example.txt Failed example: factorial(6) Expected: 120 Got: 7208, python -m doctest -v example.py4 thông tin rằng nó phải được chạy với The ``example`` module ====================== Using ``factorial`` ------------------- This is an example text file in reStructuredText format. First import ``factorial`` from the ``example`` module: >>> from example import factorial Now use it: >>> factorial(6) 1206, không phải import doctest doctest.testfile("example.txt")7. Để biết thêm thông tin về The ``example`` module ====================== Using ``factorial`` ------------------- This is an example text file in reStructuredText format. First import ``factorial`` from the ``example`` module: >>> from example import factorial Now use it: >>> factorial(6) 1206, xem phần API cơ bản.Basic API. 25.2.3. Làm thế nào nó hoạt động¶How It Works¶Phần này kiểm tra chi tiết cách thức hoạt động của DocTest: nó xem xét các tài liệu nào, cách nó tìm thấy các ví dụ tương tác, bối cảnh thực thi nào nó sử dụng, cách nó xử lý các ngoại lệ và cách sử dụng cờ tùy chọn để kiểm soát hành vi của nó. Đây là thông tin mà bạn cần biết để viết các ví dụ về tài liệu; Để biết thông tin về thực sự chạy Doctest trên các ví dụ này, hãy xem các phần sau. 25.2.3.1. Docstrings nào được kiểm tra? ¶Which Docstrings Are Examined?¶Mô -đun DocString, và tất cả các chức năng, lớp học và phương thức được tìm kiếm. Các đối tượng được nhập vào mô -đun không được tìm kiếm. Ngoài ra, nếu python -m doctest -v example.txt3 tồn tại và là đúng, thì đó phải là một lệnh và mỗi mục nhập một tên (chuỗi) thành một đối tượng hàm, đối tượng lớp hoặc chuỗi. Chức năng và các tài liệu đối tượng lớp được tìm thấy từ python -m doctest -v example.txt3 được tìm kiếm và các chuỗi được đối xử như thể chúng là tài liệu. Trong đầu ra, khóa python -m doctest -v example.txt5 trong python -m doctest -v example.txt3 xuất hiện với tên Bất kỳ lớp nào được tìm thấy đều được tìm kiếm đệ quy tương tự, để kiểm tra các tài liệu trong các phương pháp chứa và các lớp lồng nhau của chúng. Thay đổi trong phiên bản 2.4: Một khái niệm tên riêng tư của người Viking không còn được ghi nhận và không còn được ghi lại.A “private name” concept is deprecated and no longer documented. 25.2.3.2. Các ví dụ DocString được công nhận như thế nào? ¶How are Docstring Examples Recognized?¶Trong hầu hết các trường hợp, một bản sao của phiên giao diện điều khiển tương tác hoạt động tốt, nhưng Doctest không phải là cố gắng thực hiện mô phỏng chính xác của bất kỳ vỏ python cụ thể nào. >>> # comments are ignored >>> x = 12 >>> x 12 >>> if x == 13: ... print "yes" ... else: ... print "no" ... print "NO" ... print "NO!!!" ... no NO NO!!! >>> Bất kỳ đầu ra dự kiến nào cũng phải ngay lập tức theo dòng python -m doctest -v example.txt7 hoặc python -m doctest -v example.txt8 cuối cùng chứa mã và đầu ra dự kiến (nếu có) mở rộng sang dòng python -m doctest -v example.txt7 hoặc tất cả không gian trắng tiếp theo. Bản in tốt:
25.2.3.3. Những gì bối cảnh thực hiện? ¶What’s the Execution Context?¶Theo mặc định, mỗi lần python -m doctest -v example.py4 đều tìm thấy một tài liệu để kiểm tra, nó sử dụng một bản sao nông của ____ 51, để các thử nghiệm chạy không thay đổi toàn cầu thực của mô -đun và do đó một thử nghiệm trong import doctest doctest.testfile("example.txt")1 không thể để lại những mảnh vụn mà vô tình cho phép Một bài kiểm tra khác để làm việc. Điều này có nghĩa là các ví dụ có thể tự do sử dụng bất kỳ tên nào được xác định ở cấp cao nhất trong import doctest doctest.testfile("example.txt")1 và các tên được xác định trước đó trong tài liệu đang được chạy. Ví dụ không thể nhìn thấy tên được xác định trong các tài liệu khác. Bạn có thể buộc sử dụng cho chính quyền của mình làm bối cảnh thực thi bằng cách chuyển $ python example.py -v Trying: factorial(5) Expecting: 120 ok Trying: [factorial(n) for n in range(6)] Expecting: [1, 1, 2, 6, 24, 120] ok Trying: [factorial(long(n)) for n in range(6)] Expecting: [1, 1, 2, 6, 24, 120] ok00 sang import doctest doctest.testfile("example.txt")7 hoặc The ``example`` module ====================== Using ``factorial`` ------------------- This is an example text file in reStructuredText format. First import ``factorial`` from the ``example`` module: >>> from example import factorial Now use it: >>> factorial(6) 1206 thay thế. 25.2.3.4. Còn ngoại lệ thì sao? ¶What About Exceptions?¶Không có vấn đề gì, với điều kiện là dấu vết là đầu ra duy nhất được tạo ra bởi ví dụ: chỉ dán vào dấu vết. 1 Vì Tracebacks chứa các chi tiết có khả năng thay đổi nhanh chóng (ví dụ: đường dẫn tệp và số dòng chính xác), đây là một trường hợp mà DocTest làm việc chăm chỉ để linh hoạt trong những gì nó chấp nhận. Ví dụ đơn giản: $ python example.py -v Trying: factorial(5) Expecting: 120 ok Trying: [factorial(n) for n in range(6)] Expecting: [1, 1, 2, 6, 24, 120] ok Trying: [factorial(long(n)) for n in range(6)] Expecting: [1, 1, 2, 6, 24, 120] ok3 Doctest đó thành công nếu $ python example.py -v Trying: factorial(5) Expecting: 120 ok Trying: [factorial(n) for n in range(6)] Expecting: [1, 1, 2, 6, 24, 120] ok Trying: [factorial(long(n)) for n in range(6)] Expecting: [1, 1, 2, 6, 24, 120] ok03 được nâng lên, với chi tiết $ python example.py -v Trying: factorial(5) Expecting: 120 ok Trying: [factorial(n) for n in range(6)] Expecting: [1, 1, 2, 6, 24, 120] ok Trying: [factorial(long(n)) for n in range(6)] Expecting: [1, 1, 2, 6, 24, 120] ok04 như được hiển thị. Đầu ra dự kiến cho một ngoại lệ phải bắt đầu bằng tiêu đề Traceback, có thể là một trong hai dòng sau, được thụt vào giống như dòng đầu tiên của ví dụ: $ python example.py -v Trying: factorial(5) Expecting: 120 ok Trying: [factorial(n) for n in range(6)] Expecting: [1, 1, 2, 6, 24, 120] ok Trying: [factorial(long(n)) for n in range(6)] Expecting: [1, 1, 2, 6, 24, 120] ok4 Tiêu đề Traceback được theo sau bởi một ngăn xếp theo dõi tùy chọn, có nội dung bị bỏ qua bởi DocTest. Ngăn xếp theo dõi thường bị bỏ qua hoặc sao chép nguyên văn từ phiên tương tác. Ngăn xếp theo dõi được theo sau bởi phần thú vị nhất: (các) dòng chứa loại ngoại lệ và chi tiết. Đây thường là dòng cuối cùng của một dấu vết, nhưng có thể mở rộng trên nhiều dòng nếu ngoại lệ có chi tiết đa dòng: $ python example.py -v Trying: factorial(5) Expecting: 120 ok Trying: [factorial(n) for n in range(6)] Expecting: [1, 1, 2, 6, 24, 120] ok Trying: [factorial(long(n)) for n in range(6)] Expecting: [1, 1, 2, 6, 24, 120] ok5 Ba dòng cuối cùng (bắt đầu với $ python example.py -v Trying: factorial(5) Expecting: 120 ok Trying: [factorial(n) for n in range(6)] Expecting: [1, 1, 2, 6, 24, 120] ok Trying: [factorial(long(n)) for n in range(6)] Expecting: [1, 1, 2, 6, 24, 120] ok03) được so sánh với loại ngoại lệ và chi tiết, và phần còn lại bị bỏ qua. Thay đổi trong phiên bản 2.4: Các phiên bản trước không thể xử lý các chi tiết ngoại lệ đa dòng.Previous versions were unable to handle multi-line exception details. Thực tiễn tốt nhất là bỏ qua ngăn xếp Traceback, trừ khi nó thêm giá trị tài liệu quan trọng vào ví dụ. Vì vậy, ví dụ cuối cùng có lẽ tốt hơn như: $ python example.py -v Trying: factorial(5) Expecting: 120 ok Trying: [factorial(n) for n in range(6)] Expecting: [1, 1, 2, 6, 24, 120] ok Trying: [factorial(long(n)) for n in range(6)] Expecting: [1, 1, 2, 6, 24, 120] ok6 Lưu ý rằng Tracebacks được đối xử rất đặc biệt. Cụ thể, trong ví dụ viết lại, việc sử dụng $ python example.py -v Trying: factorial(5) Expecting: 120 ok Trying: [factorial(n) for n in range(6)] Expecting: [1, 1, 2, 6, 24, 120] ok Trying: [factorial(long(n)) for n in range(6)] Expecting: [1, 1, 2, 6, 24, 120] ok06 không phụ thuộc vào tùy chọn Doctest ____ ____107. Các dấu chấm lửng trong ví dụ đó có thể bị bỏ lại, hoặc cũng có thể là ba (hoặc ba trăm) dấu phẩy hoặc chữ số, hoặc một bản sao thụt của một tiểu phẩm Monty Python. Một số chi tiết bạn nên đọc một lần, nhưng won cần phải nhớ:
25.2.3.5. Tùy chọn cờOption Flags¶Một số cờ tùy chọn kiểm soát các khía cạnh khác nhau của hành vi Doctest. Tên tượng trưng cho các cờ được cung cấp dưới dạng hằng số mô -đun, có thể được tạo ra cùng nhau và được chuyển đến các chức năng khác nhau. Các tên cũng có thể được sử dụng trong các chỉ thị của Doctest.bitwise ORed together and passed to various functions. The names can also be used in doctest directives. Nhóm đầu tiên của các tùy chọn xác định ngữ nghĩa kiểm tra, kiểm soát các khía cạnh về cách học quyết định liệu đầu ra thực tế có khớp với một ví dụ đầu ra dự kiến hay không: ________ 116 ________ 117¶Theo mặc định, nếu một khối đầu ra dự kiến chỉ chứa $ python example.py -v Trying: factorial(5) Expecting: 120 ok Trying: [factorial(n) for n in range(6)] Expecting: [1, 1, 2, 6, 24, 120] ok Trying: [factorial(long(n)) for n in range(6)] Expecting: [1, 1, 2, 6, 24, 120] ok18, một khối đầu ra thực tế chỉ chứa $ python example.py -v Trying: factorial(5) Expecting: 120 ok Trying: [factorial(n) for n in range(6)] Expecting: [1, 1, 2, 6, 24, 120] ok Trying: [factorial(long(n)) for n in range(6)] Expecting: [1, 1, 2, 6, 24, 120] ok18 hoặc chỉ $ python example.py -v Trying: factorial(5) Expecting: 120 ok Trying: [factorial(n) for n in range(6)] Expecting: [1, 1, 2, 6, 24, 120] ok Trying: [factorial(long(n)) for n in range(6)] Expecting: [1, 1, 2, 6, 24, 120] ok20 được coi là phù hợp và tương tự với $ python example.py -v Trying: factorial(5) Expecting: 120 ok Trying: [factorial(n) for n in range(6)] Expecting: [1, 1, 2, 6, 24, 120] ok Trying: [factorial(long(n)) for n in range(6)] Expecting: [1, 1, 2, 6, 24, 120] ok21 so với $ python example.py -v Trying: factorial(5) Expecting: 120 ok Trying: [factorial(n) for n in range(6)] Expecting: [1, 1, 2, 6, 24, 120] ok Trying: [factorial(long(n)) for n in range(6)] Expecting: [1, 1, 2, 6, 24, 120] ok22. Khi $ python example.py -v Trying: factorial(5) Expecting: 120 ok Trying: [factorial(n) for n in range(6)] Expecting: [1, 1, 2, 6, 24, 120] ok Trying: [factorial(long(n)) for n in range(6)] Expecting: [1, 1, 2, 6, 24, 120] ok23 được chỉ định, không cho phép thay thế. Hành vi mặc định phục vụ cho python đó đã thay đổi loại trả về nhiều hàm từ số nguyên sang boolean; Các tài liệu mong đợi sản lượng của Little Integer vẫn hoạt động trong những trường hợp này. Tùy chọn này có thể sẽ biến mất, nhưng không phải trong vài năm. ________ 116 ________ 125¶ Theo mặc định, nếu một khối đầu ra dự kiến chứa một dòng chỉ chứa chuỗi >>> # comments are ignored >>> x = 12 >>> x 12 >>> if x == 13: ... print "yes" ... else: ... print "no" ... print "NO" ... print "NO!!!" ... no NO NO!!! >>>0, thì dòng đó sẽ khớp với một dòng trống trong đầu ra thực tế. Bởi vì một dòng trống thực sự phân tách đầu ra dự kiến, đây là cách duy nhất để giao tiếp mà một dòng trống được mong đợi. Khi $ python example.py -v Trying: factorial(5) Expecting: 120 ok Trying: [factorial(n) for n in range(6)] Expecting: [1, 1, 2, 6, 24, 120] ok Trying: [factorial(long(n)) for n in range(6)] Expecting: [1, 1, 2, 6, 24, 120] ok27 được chỉ định, sự thay thế này không được phép. ________ 116 ________ 129¶ Khi được chỉ định, tất cả các chuỗi của khoảng trắng (khoảng trống và newlines) được coi là bằng nhau. Bất kỳ chuỗi khoảng trắng nào trong đầu ra dự kiến sẽ phù hợp với bất kỳ chuỗi khoảng trắng nào trong đầu ra thực tế. Theo mặc định, khoảng trắng phải khớp chính xác. >>> # comments are ignored >>> x = 12 >>> x 12 >>> if x == 13: ... print "yes" ... else: ... print "no" ... print "NO" ... print "NO!!!" ... no NO NO!!! >>>2 đặc biệt hữu ích khi một dòng đầu ra dự kiến rất dài và bạn muốn bọc nó trên nhiều dòng trong nguồn của bạn. ________ 116 ________ 132¶ Khi được chỉ định, điểm đánh dấu Ellipsis ( $ python example.py -v Trying: factorial(5) Expecting: 120 ok Trying: [factorial(n) for n in range(6)] Expecting: [1, 1, 2, 6, 24, 120] ok Trying: [factorial(long(n)) for n in range(6)] Expecting: [1, 1, 2, 6, 24, 120] ok06) trong đầu ra dự kiến có thể khớp với bất kỳ chất nền nào trong đầu ra thực tế. Điều này bao gồm các chuỗi con bao gồm các ranh giới dòng và các nền tảng trống, vì vậy, tốt nhất là giữ cho việc sử dụng đơn giản này. Việc sử dụng phức tạp có thể dẫn đến các loại tương tự của OOP, nó phù hợp quá nhiều! Điều ngạc nhiên là $ python example.py -v Trying: factorial(5) Expecting: 120 ok Trying: [factorial(n) for n in range(6)] Expecting: [1, 1, 2, 6, 24, 120] ok Trying: [factorial(long(n)) for n in range(6)] Expecting: [1, 1, 2, 6, 24, 120] ok34 dễ bị biểu cảm thường xuyên. Khi được chỉ định, một ví dụ mong đợi một ngoại lệ vượt qua nếu một ngoại lệ của loại dự kiến được nêu ra, ngay cả khi chi tiết ngoại lệ không khớp. Ví dụ: một ví dụ mong đợi $ python example.py -v Trying: factorial(5) Expecting: 120 ok Trying: [factorial(n) for n in range(6)] Expecting: [1, 1, 2, 6, 24, 120] ok Trying: [factorial(long(n)) for n in range(6)] Expecting: [1, 1, 2, 6, 24, 120] ok37 sẽ vượt qua nếu ngoại lệ thực tế được nâng lên là $ python example.py -v Trying: factorial(5) Expecting: 120 ok Trying: [factorial(n) for n in range(6)] Expecting: [1, 1, 2, 6, 24, 120] ok Trying: [factorial(long(n)) for n in range(6)] Expecting: [1, 1, 2, 6, 24, 120] ok38, nhưng sẽ thất bại, ví dụ: nếu $ python example.py -v Trying: factorial(5) Expecting: 120 ok Trying: [factorial(n) for n in range(6)] Expecting: [1, 1, 2, 6, 24, 120] ok Trying: [factorial(long(n)) for n in range(6)] Expecting: [1, 1, 2, 6, 24, 120] ok39 được nâng lên. Nó cũng sẽ bỏ qua tên mô -đun được sử dụng trong các báo cáo của Python 3. Do đó, cả hai biến thể này sẽ hoạt động với cờ được chỉ định, bất kể thử nghiệm có được chạy theo Python 2.7 hay Python 3.2 (hoặc các phiên bản sau này): $ python example.py -v Trying: factorial(5) Expecting: 120 ok Trying: [factorial(n) for n in range(6)] Expecting: [1, 1, 2, 6, 24, 120] ok Trying: [factorial(long(n)) for n in range(6)] Expecting: [1, 1, 2, 6, 24, 120] ok9 Lưu ý rằng $ python example.py -v Trying: factorial(5) Expecting: 120 ok Trying: [factorial(n) for n in range(6)] Expecting: [1, 1, 2, 6, 24, 120] ok Trying: [factorial(long(n)) for n in range(6)] Expecting: [1, 1, 2, 6, 24, 120] ok07 cũng có thể được sử dụng để bỏ qua các chi tiết của thông báo ngoại lệ, nhưng thử nghiệm như vậy vẫn có thể thất bại dựa trên việc các chi tiết mô -đun có được in như một phần của tên ngoại lệ hay không. Sử dụng $ python example.py -v Trying: factorial(5) Expecting: 120 ok Trying: [factorial(n) for n in range(6)] Expecting: [1, 1, 2, 6, 24, 120] ok Trying: [factorial(long(n)) for n in range(6)] Expecting: [1, 1, 2, 6, 24, 120] ok10 và các chi tiết từ Python 2.3 cũng là cách rõ ràng duy nhất để viết một tài liệu không quan tâm đến chi tiết ngoại lệ nhưng vẫn tiếp tục vượt qua Python 2.3 hoặc sớm hơn (các bản phát hành đó không hỗ trợ các chỉ thị tài liệu và bỏ qua chúng như những bình luận không liên quan ). Ví dụ:doctest directives and ignore them as irrelevant comments). For example: Trying: factorial(1e100) Expecting: Traceback (most recent call last): ... OverflowError: n too large ok 2 items passed all tests: 1 tests in __main__ 8 tests in __main__.factorial 9 tests in 2 items. 9 passed and 0 failed. Test passed. $0 Vượt qua dưới Python 2.3 và sau đó là phiên bản Python với cờ được chỉ định, mặc dù chi tiết đã thay đổi trong Python 2.4 để nói rằng, không phải là thay vì của Google. Đã thay đổi trong phiên bản 2.7: $ python example.py -v Trying: factorial(5) Expecting: 120 ok Trying: [factorial(n) for n in range(6)] Expecting: [1, 1, 2, 6, 24, 120] ok Trying: [factorial(long(n)) for n in range(6)] Expecting: [1, 1, 2, 6, 24, 120] ok10 now also ignores any information relating to the module containing the exception under test ________ 116 ________ 144¶ Khi được chỉ định, không chạy ví dụ gì cả. Điều này có thể hữu ích trong các bối cảnh nơi các ví dụ tài liệu đóng vai trò là cả tài liệu và trường hợp thử nghiệm, và một ví dụ nên được đưa vào cho mục đích tài liệu, nhưng không nên được kiểm tra. Ví dụ: đầu ra ví dụ có thể là ngẫu nhiên; hoặc ví dụ có thể phụ thuộc vào tài nguyên không có sẵn cho trình điều khiển thử nghiệm. Cờ bỏ qua cũng có thể được sử dụng để nhận xét tạm thời các ví dụ về các ví dụ. Mới trong phiên bản 2.5. ________ 116 ________ 146¶Một bitmask hoặc cùng nhau tất cả các cờ so sánh ở trên. Nhóm thứ hai của các tùy chọn kiểm soát cách thức các lỗi kiểm tra được báo cáo: ________ 116 ________ 148¶Khi được chỉ định, các lỗi liên quan đến dự kiến đa dòng và đầu ra thực tế được hiển thị bằng cách sử dụng một khác biệt thống nhất. ________ 116 ________ 150¶Khi được chỉ định, các lỗi liên quan đến dự kiến nhiều dòng và đầu ra thực tế sẽ được hiển thị bằng cách sử dụng bối cảnh khác biệt. ________ 116 ________ 152¶Khi được chỉ định, sự khác biệt được tính bằng $ python example.py -v Trying: factorial(5) Expecting: 120 ok Trying: [factorial(n) for n in range(6)] Expecting: [1, 1, 2, 6, 24, 120] ok Trying: [factorial(long(n)) for n in range(6)] Expecting: [1, 1, 2, 6, 24, 120] ok53, sử dụng cùng một thuật toán như tiện ích $ python example.py -v Trying: factorial(5) Expecting: 120 ok Trying: [factorial(n) for n in range(6)] Expecting: [1, 1, 2, 6, 24, 120] ok Trying: [factorial(long(n)) for n in range(6)] Expecting: [1, 1, 2, 6, 24, 120] ok54 phổ biến. Đây là phương pháp duy nhất đánh dấu sự khác biệt trong các dòng cũng như trên các dòng. Ví dụ: nếu một dòng đầu ra dự kiến có chứa chữ số $ python example.py -v Trying: factorial(5) Expecting: 120 ok Trying: [factorial(n) for n in range(6)] Expecting: [1, 1, 2, 6, 24, 120] ok Trying: [factorial(long(n)) for n in range(6)] Expecting: [1, 1, 2, 6, 24, 120] ok18 trong đó đầu ra thực tế chứa chữ cái $ python example.py -v Trying: factorial(5) Expecting: 120 ok Trying: [factorial(n) for n in range(6)] Expecting: [1, 1, 2, 6, 24, 120] ok Trying: [factorial(long(n)) for n in range(6)] Expecting: [1, 1, 2, 6, 24, 120] ok56, một dòng được chèn bằng một chăm sóc đánh dấu các vị trí cột không khớp. ________ 116 ________ 158¶ Khi được chỉ định, hiển thị ví dụ thất bại đầu tiên trong mỗi tài liệu, nhưng triệt tiêu đầu ra cho tất cả các ví dụ còn lại. Điều này sẽ ngăn học DoCTest báo cáo các ví dụ chính xác bị phá vỡ vì những thất bại trước đó; Nhưng nó cũng có thể che giấu các ví dụ không chính xác mà thất bại độc lập với thất bại đầu tiên. Khi $ python example.py -v Trying: factorial(5) Expecting: 120 ok Trying: [factorial(n) for n in range(6)] Expecting: [1, 1, 2, 6, 24, 120] ok Trying: [factorial(long(n)) for n in range(6)] Expecting: [1, 1, 2, 6, 24, 120] ok59 được chỉ định, các ví dụ còn lại vẫn được chạy và vẫn được tính vào tổng số lỗi được báo cáo; Chỉ có đầu ra bị triệt tiêu. ________ 116 ________ 161¶ Một bitmask hoặc cùng nhau tất cả các cờ báo cáo ở trên. Ngoài ra, còn có một cách để đăng ký tên cờ tùy chọn mới, mặc dù điều này không hữu ích trừ khi bạn có ý định mở rộng nội bộ python -m doctest -v example.py4 thông qua lớp con: ________ 116 ________ 164 (Tên) ¶(name)¶ Tạo một cờ tùy chọn mới với một tên nhất định và trả về giá trị số nguyên của cờ mới. $ python example.py -v Trying: factorial(5) Expecting: 120 ok Trying: [factorial(n) for n in range(6)] Expecting: [1, 1, 2, 6, 24, 120] ok Trying: [factorial(long(n)) for n in range(6)] Expecting: [1, 1, 2, 6, 24, 120] ok65 có thể được sử dụng khi phân lớp $ python example.py -v Trying: factorial(5) Expecting: 120 ok Trying: [factorial(n) for n in range(6)] Expecting: [1, 1, 2, 6, 24, 120] ok Trying: [factorial(long(n)) for n in range(6)] Expecting: [1, 1, 2, 6, 24, 120] ok66 hoặc $ python example.py -v Trying: factorial(5) Expecting: 120 ok Trying: [factorial(n) for n in range(6)] Expecting: [1, 1, 2, 6, 24, 120] ok Trying: [factorial(long(n)) for n in range(6)] Expecting: [1, 1, 2, 6, 24, 120] ok67 để tạo các tùy chọn mới được hỗ trợ bởi các lớp con của bạn. $ python example.py -v Trying: factorial(5) Expecting: 120 ok Trying: [factorial(n) for n in range(6)] Expecting: [1, 1, 2, 6, 24, 120] ok Trying: [factorial(long(n)) for n in range(6)] Expecting: [1, 1, 2, 6, 24, 120] ok65 phải luôn được gọi bằng thành ngữ sau: Trying: factorial(1e100) Expecting: Traceback (most recent call last): ... OverflowError: n too large ok 2 items passed all tests: 1 tests in __main__ 8 tests in __main__.factorial 9 tests in 2 items. 9 passed and 0 failed. Test passed. $1 Mới trong phiên bản 2.4. 25.2.3.6. Chỉ thị BurDirectives¶Các chỉ thị của DocTest có thể được sử dụng để sửa đổi các cờ tùy chọn cho một ví dụ riêng lẻ. Các chỉ thị của DocTest là những bình luận Python đặc biệt theo một ví dụ về mã nguồn của bạn:option flags for an individual example. Doctest directives are special Python comments following an example’s source code: Trying: factorial(1e100) Expecting: Traceback (most recent call last): ... OverflowError: n too large ok 2 items passed all tests: 1 tests in __main__ 8 tests in __main__.factorial 9 tests in 2 items. 9 passed and 0 failed. Test passed. $2 Whitespace không được phép giữa $ python example.py -v Trying: factorial(5) Expecting: 120 ok Trying: [factorial(n) for n in range(6)] Expecting: [1, 1, 2, 6, 24, 120] ok Trying: [factorial(long(n)) for n in range(6)] Expecting: [1, 1, 2, 6, 24, 120] ok69 hoặc $ python example.py -v Trying: factorial(5) Expecting: 120 ok Trying: [factorial(n) for n in range(6)] Expecting: [1, 1, 2, 6, 24, 120] ok Trying: [factorial(long(n)) for n in range(6)] Expecting: [1, 1, 2, 6, 24, 120] ok70 và tên tùy chọn chỉ thị. Tên tùy chọn chỉ thị có thể là bất kỳ tên cờ tùy chọn nào được giải thích ở trên. Một ví dụ về các chỉ thị tài liệu của tài liệu sửa đổi hành vi của DocTest đối với ví dụ duy nhất đó. Sử dụng $ python example.py -v Trying: factorial(5) Expecting: 120 ok Trying: [factorial(n) for n in range(6)] Expecting: [1, 1, 2, 6, 24, 120] ok Trying: [factorial(long(n)) for n in range(6)] Expecting: [1, 1, 2, 6, 24, 120] ok69 để kích hoạt hành vi được đặt tên hoặc $ python example.py -v Trying: factorial(5) Expecting: 120 ok Trying: [factorial(n) for n in range(6)] Expecting: [1, 1, 2, 6, 24, 120] ok Trying: [factorial(long(n)) for n in range(6)] Expecting: [1, 1, 2, 6, 24, 120] ok70 để vô hiệu hóa nó. Ví dụ, bài kiểm tra này vượt qua: Trying: factorial(1e100) Expecting: Traceback (most recent call last): ... OverflowError: n too large ok 2 items passed all tests: 1 tests in __main__ 8 tests in __main__.factorial 9 tests in 2 items. 9 passed and 0 failed. Test passed. $3 Nếu không có chỉ thị, nó sẽ thất bại, cả vì đầu ra thực tế không có hai khoảng trống trước các yếu tố danh sách một chữ số và vì đầu ra thực tế nằm trên một dòng. Bài kiểm tra này cũng vượt qua, và cũng yêu cầu một chỉ thị để làm như vậy: Trying: factorial(1e100) Expecting: Traceback (most recent call last): ... OverflowError: n too large ok 2 items passed all tests: 1 tests in __main__ 8 tests in __main__.factorial 9 tests in 2 items. 9 passed and 0 failed. Test passed. $4 Nhiều chỉ thị có thể được sử dụng trên một dòng vật lý, được phân tách bằng dấu phẩy: Trying: factorial(1e100) Expecting: Traceback (most recent call last): ... OverflowError: n too large ok 2 items passed all tests: 1 tests in __main__ 8 tests in __main__.factorial 9 tests in 2 items. 9 passed and 0 failed. Test passed. $5 Nếu nhiều nhận xét chỉ thị được sử dụng cho một ví dụ duy nhất, thì chúng được kết hợp: Trying: factorial(1e100) Expecting: Traceback (most recent call last): ... OverflowError: n too large ok 2 items passed all tests: 1 tests in __main__ 8 tests in __main__.factorial 9 tests in 2 items. 9 passed and 0 failed. Test passed. $6 Như ví dụ trước đây cho thấy, bạn có thể thêm các dòng $ python example.py -v Trying: factorial(5) Expecting: 120 ok Trying: [factorial(n) for n in range(6)] Expecting: [1, 1, 2, 6, 24, 120] ok Trying: [factorial(long(n)) for n in range(6)] Expecting: [1, 1, 2, 6, 24, 120] ok06 vào ví dụ của bạn chỉ chứa các chỉ thị. Điều này có thể hữu ích khi một ví dụ quá dài cho một chỉ thị để thoải mái phù hợp với cùng một dòng: Trying: factorial(1e100) Expecting: Traceback (most recent call last): ... OverflowError: n too large ok 2 items passed all tests: 1 tests in __main__ 8 tests in __main__.factorial 9 tests in 2 items. 9 passed and 0 failed. Test passed. $7 Lưu ý rằng vì tất cả các tùy chọn đều bị vô hiệu hóa theo mặc định và các chỉ thị chỉ áp dụng cho ví dụ chúng xuất hiện, cho phép các tùy chọn (thông qua $ python example.py -v Trying: factorial(5) Expecting: 120 ok Trying: [factorial(n) for n in range(6)] Expecting: [1, 1, 2, 6, 24, 120] ok Trying: [factorial(long(n)) for n in range(6)] Expecting: [1, 1, 2, 6, 24, 120] ok69 trong một chỉ thị) thường là lựa chọn có ý nghĩa duy nhất. Tuy nhiên, các cờ tùy chọn cũng có thể được chuyển đến các chức năng chạy tài liệu, thiết lập các mặc định khác nhau. Trong những trường hợp như vậy, việc vô hiệu hóa một tùy chọn thông qua $ python example.py -v Trying: factorial(5) Expecting: 120 ok Trying: [factorial(n) for n in range(6)] Expecting: [1, 1, 2, 6, 24, 120] ok Trying: [factorial(long(n)) for n in range(6)] Expecting: [1, 1, 2, 6, 24, 120] ok70 trong một chỉ thị có thể hữu ích. Mới trong phiên bản 2.4: Hỗ trợ cho các chỉ thị doctest đã được thêm vào.Support for doctest directives was added. 25.2.3.7. Cảnh báo JoWarnings¶python -m doctest -v example.py4 nghiêm túc về việc yêu cầu các trận đấu chính xác trong sản lượng dự kiến. Nếu ngay cả một ký tự duy nhất không phù hợp, thì bài kiểm tra không thành công. Điều này có thể sẽ làm bạn ngạc nhiên một vài lần, khi bạn tìm hiểu chính xác những gì Python làm và không đảm bảo về đầu ra. Ví dụ: khi in một dict, Python không đảm bảo rằng các cặp giá trị khóa sẽ được in theo bất kỳ thứ tự cụ thể nào, vì vậy một bài kiểm tra như Trying: factorial(1e100) Expecting: Traceback (most recent call last): ... OverflowError: n too large ok 2 items passed all tests: 1 tests in __main__ 8 tests in __main__.factorial 9 tests in 2 items. 9 passed and 0 failed. Test passed. $8 là dễ bị tổn thương! Một cách giải quyết là phải làm Trying: factorial(1e100) Expecting: Traceback (most recent call last): ... OverflowError: n too large ok 2 items passed all tests: 1 tests in __main__ 8 tests in __main__.factorial 9 tests in 2 items. 9 passed and 0 failed. Test passed. $9 thay vì. Một người khác là làm if __name__ == "__main__": import doctest doctest.testmod()0 Có những người khác, nhưng bạn có được ý tưởng. Một ý tưởng tồi khác là in những thứ nhúng địa chỉ đối tượng, như if __name__ == "__main__": import doctest doctest.testmod()1 Chỉ thị $ python example.py -v Trying: factorial(5) Expecting: 120 ok Trying: [factorial(n) for n in range(6)] Expecting: [1, 1, 2, 6, 24, 120] ok Trying: [factorial(long(n)) for n in range(6)] Expecting: [1, 1, 2, 6, 24, 120] ok07 đưa ra một cách tiếp cận tốt đẹp cho ví dụ cuối cùng: if __name__ == "__main__": import doctest doctest.testmod()2 Số điểm nổi cũng phải tuân theo các biến thể đầu ra nhỏ trên các nền tảng, bởi vì Python bảo vệ thư viện nền tảng C để định dạng float và các thư viện C rất khác nhau về chất lượng ở đây. if __name__ == "__main__": import doctest doctest.testmod()3 Số lượng của Mẫu $ python example.py -v Trying: factorial(5) Expecting: 120 ok Trying: [factorial(n) for n in range(6)] Expecting: [1, 1, 2, 6, 24, 120] ok Trying: [factorial(long(n)) for n in range(6)] Expecting: [1, 1, 2, 6, 24, 120] ok78 an toàn trên tất cả các nền tảng và tôi thường quyết định các ví dụ tài liệu để tạo ra số lượng hình thức đó: if __name__ == "__main__": import doctest doctest.testmod()4 Phân số đơn giản cũng dễ hiểu hơn cho mọi người, và điều đó làm cho tài liệu tốt hơn. 25.2.4. API cơ bảnBasic API¶Các chức năng import doctest doctest.testfile("example.txt")7 và The ``example`` module ====================== Using ``factorial`` ------------------- This is an example text file in reStructuredText format. First import ``factorial`` from the ``example`` module: >>> from example import factorial Now use it: >>> factorial(6) 1206 cung cấp một giao diện đơn giản cho tài liệu phải đủ cho hầu hết các mục đích sử dụng cơ bản. Để giới thiệu ít chính thức hơn về hai chức năng này, hãy xem các phần Sử dụng đơn giản: Kiểm tra các ví dụ trong DocStrings và sử dụng đơn giản: Kiểm tra các ví dụ trong tệp văn bản.Simple Usage: Checking Examples in Docstrings and Simple Usage: Checking Examples in a Text File. ________ 116 ________ 182 (tên tệp [, module_relative] [, name] [, gói] [, globs] [, verbose] [, báo cáo] [, tùy chọn flags] [, extraglobs](filename[, module_relative][, name][, package][, globs][, verbose][, report][, optionflags][, extraglobs][, raise_on_error][, parser][, encoding])¶ Tất cả các đối số ngoại trừ tên tệp là tùy chọn và nên được chỉ định ở dạng từ khóa. Các ví dụ kiểm tra trong tệp có tên FileName. Trả lại $ python example.py -v Trying: factorial(5) Expecting: 120 ok Trying: [factorial(n) for n in range(6)] Expecting: [1, 1, 2, 6, 24, 120] ok Trying: [factorial(long(n)) for n in range(6)] Expecting: [1, 1, 2, 6, 24, 120] ok83. Đối số tùy chọn Module_Relative Chỉ định cách giải thích tên tệp:
Tên đối số tùy chọn cho biết tên của bài kiểm tra; Theo mặc định, hoặc nếu $ python example.py -v Trying: factorial(5) Expecting: 120 ok Trying: [factorial(n) for n in range(6)] Expecting: [1, 1, 2, 6, 24, 120] ok Trying: [factorial(long(n)) for n in range(6)] Expecting: [1, 1, 2, 6, 24, 120] ok88, $ python example.py -v Trying: factorial(5) Expecting: 120 ok Trying: [factorial(n) for n in range(6)] Expecting: [1, 1, 2, 6, 24, 120] ok Trying: [factorial(long(n)) for n in range(6)] Expecting: [1, 1, 2, 6, 24, 120] ok89 được sử dụng. Gói đối số tùy chọn là gói Python hoặc tên của gói Python có thư mục nên được sử dụng làm thư mục cơ sở cho tên tệp liên quan đến mô-đun. Nếu không có gói nào được chỉ định, thì thư mục mô-đun gọi được sử dụng làm thư mục cơ sở cho các tên tệp liên quan đến mô-đun. Đó là một lỗi để chỉ định gói nếu module_relative là $ python example.py -v Trying: factorial(5) Expecting: 120 ok Trying: [factorial(n) for n in range(6)] Expecting: [1, 1, 2, 6, 24, 120] ok Trying: [factorial(long(n)) for n in range(6)] Expecting: [1, 1, 2, 6, 24, 120] ok22. Các nhóm đối số tùy chọn đưa ra một dict để được sử dụng làm toàn cầu khi thực hiện các ví dụ. Một bản sao mới của Dict này được tạo ra cho Doctest, vì vậy các ví dụ của nó bắt đầu bằng một bảng xếp hạng sạch. Theo mặc định, hoặc nếu $ python example.py -v Trying: factorial(5) Expecting: 120 ok Trying: [factorial(n) for n in range(6)] Expecting: [1, 1, 2, 6, 24, 120] ok Trying: [factorial(long(n)) for n in range(6)] Expecting: [1, 1, 2, 6, 24, 120] ok88, một dict trống mới được sử dụng. Đối số tùy chọn Extraglobs đưa ra một dict được hợp nhất vào các thế giới được sử dụng để thực hiện các ví dụ. Điều này hoạt động như $ python example.py -v Trying: factorial(5) Expecting: 120 ok Trying: [factorial(n) for n in range(6)] Expecting: [1, 1, 2, 6, 24, 120] ok Trying: [factorial(long(n)) for n in range(6)] Expecting: [1, 1, 2, 6, 24, 120] ok92: Nếu các quả cầu và ngoại vi có một khóa chung, giá trị liên quan trong ngoại lệ xuất hiện trong chế độ kết hợp. Theo mặc định, hoặc nếu $ python example.py -v Trying: factorial(5) Expecting: 120 ok Trying: [factorial(n) for n in range(6)] Expecting: [1, 1, 2, 6, 24, 120] ok Trying: [factorial(long(n)) for n in range(6)] Expecting: [1, 1, 2, 6, 24, 120] ok88, không có toàn cầu bổ sung được sử dụng. Đây là một tính năng nâng cao cho phép tham số hóa các tài liệu. Ví dụ, một tài liệu nhất có thể được viết cho một lớp cơ sở, sử dụng tên chung cho lớp, sau đó sử dụng lại để kiểm tra bất kỳ số lớp con nào bằng cách truyền một bản đồ giả lập tên lập bản đồ tên chung cho lớp con để được kiểm tra. Đối số tùy chọn in dài dòng in nhiều thứ nếu đúng và chỉ in không thành công nếu sai; Theo mặc định, hoặc nếu $ python example.py -v Trying: factorial(5) Expecting: 120 ok Trying: [factorial(n) for n in range(6)] Expecting: [1, 1, 2, 6, 24, 120] ok Trying: [factorial(long(n)) for n in range(6)] Expecting: [1, 1, 2, 6, 24, 120] ok88, thì đó là sự thật nếu và chỉ khi $ python example.py -v Trying: factorial(5) Expecting: 120 ok Trying: [factorial(n) for n in range(6)] Expecting: [1, 1, 2, 6, 24, 120] ok Trying: [factorial(long(n)) for n in range(6)] Expecting: [1, 1, 2, 6, 24, 120] ok95 nằm trong import doctest doctest.testfile("example.txt")9. Báo cáo đối số tùy chọn in một bản tóm tắt ở cuối khi đúng, nếu không in không có gì ở cuối. Trong chế độ Verbose, bản tóm tắt là chi tiết, nếu không thì bản tóm tắt rất ngắn gọn (trên thực tế, trống nếu tất cả các bài kiểm tra được thông qua). Đối số tùy chọn tùy chọn flagflags hoặc các cờ tùy chọn cùng nhau. Xem phần Cờ tùy chọn.Option Flags. Đối số tùy chọn RAISE_ON_ERROR mặc định là sai. Nếu đúng, một ngoại lệ được nêu ra khi thất bại đầu tiên hoặc ngoại lệ bất ngờ trong một ví dụ. Điều này cho phép thất bại được gỡ lỗi sau khi chết. Hành vi mặc định là tiếp tục chạy các ví dụ. Trình phân tích cú pháp đối số tùy chọn chỉ định >>> # comments are ignored >>> x = 12 >>> x 12 >>> if x == 13: ... print "yes" ... else: ... print "no" ... print "NO" ... print "NO!!!" ... no NO NO!!! >>>3 (hoặc lớp con) nên được sử dụng để trích xuất các thử nghiệm từ các tệp. Nó mặc định là một trình phân tích cú pháp bình thường (nghĩa là, $ python example.py -v Trying: factorial(5) Expecting: 120 ok Trying: [factorial(n) for n in range(6)] Expecting: [1, 1, 2, 6, 24, 120] ok Trying: [factorial(long(n)) for n in range(6)] Expecting: [1, 1, 2, 6, 24, 120] ok98). Mã hóa đối số tùy chọn Chỉ định một mã hóa nên được sử dụng để chuyển đổi tệp thành Unicode. Mới trong phiên bản 2.4. Thay đổi trong phiên bản 2.5: Mã hóa tham số đã được thêm vào.The parameter encoding was added. A([m][, name][, globs][, verbose][, report][, optionflags][, extraglobs][, raise_on_error][, exclude_empty])¶Tất cả các đối số là tùy chọn và tất cả ngoại trừ M nên được chỉ định ở dạng từ khóa. Các ví dụ thử nghiệm trong các tài liệu trong các chức năng và các lớp có thể truy cập được từ mô -đun M (hoặc mô -đun Trying: factorial(1e100) Expecting: Traceback (most recent call last): ... OverflowError: n too large ok 2 items passed all tests: 1 tests in __main__ 8 tests in __main__.factorial 9 tests in 2 items. 9 passed and 0 failed. Test passed. $01 nếu M không được cung cấp hoặc là $ python example.py -v Trying: factorial(5) Expecting: 120 ok Trying: [factorial(n) for n in range(6)] Expecting: [1, 1, 2, 6, 24, 120] ok Trying: [factorial(long(n)) for n in range(6)] Expecting: [1, 1, 2, 6, 24, 120] ok88), bắt đầu bằng Trying: factorial(1e100) Expecting: Traceback (most recent call last): ... OverflowError: n too large ok 2 items passed all tests: 1 tests in __main__ 8 tests in __main__.factorial 9 tests in 2 items. 9 passed and 0 failed. Test passed. $03. Cũng có thể kiểm tra các ví dụ có thể truy cập được từ Dict Trying: factorial(1e100) Expecting: Traceback (most recent call last): ... OverflowError: n too large ok 2 items passed all tests: 1 tests in __main__ 8 tests in __main__.factorial 9 tests in 2 items. 9 passed and 0 failed. Test passed. $04, nếu nó tồn tại và không phải là $ python example.py -v Trying: factorial(5) Expecting: 120 ok Trying: [factorial(n) for n in range(6)] Expecting: [1, 1, 2, 6, 24, 120] ok Trying: [factorial(long(n)) for n in range(6)] Expecting: [1, 1, 2, 6, 24, 120] ok88. Trying: factorial(1e100) Expecting: Traceback (most recent call last): ... OverflowError: n too large ok 2 items passed all tests: 1 tests in __main__ 8 tests in __main__.factorial 9 tests in 2 items. 9 passed and 0 failed. Test passed. $04 Bản đồ tên (chuỗi) cho các chức năng, lớp và chuỗi; chức năng và tài liệu lớp được tìm kiếm các ví dụ; Chuỗi được tìm kiếm trực tiếp, như thể chúng là tài liệu. Chỉ các tài liệu được gắn vào các đối tượng thuộc mô -đun m mới được tìm kiếm. Trả lại Trying: factorial(1e100) Expecting: Traceback (most recent call last): ... OverflowError: n too large ok 2 items passed all tests: 1 tests in __main__ 8 tests in __main__.factorial 9 tests in 2 items. 9 passed and 0 failed. Test passed. $07. Tên đối số tùy chọn đặt tên của mô -đun; Theo mặc định, hoặc nếu $ python example.py -v Trying: factorial(5) Expecting: 120 ok Trying: [factorial(n) for n in range(6)] Expecting: [1, 1, 2, 6, 24, 120] ok Trying: [factorial(long(n)) for n in range(6)] Expecting: [1, 1, 2, 6, 24, 120] ok88, Trying: factorial(1e100) Expecting: Traceback (most recent call last): ... OverflowError: n too large ok 2 items passed all tests: 1 tests in __main__ 8 tests in __main__.factorial 9 tests in 2 items. 9 passed and 0 failed. Test passed. $09 được sử dụng. Đối số tùy chọn loại trừ mặc định là sai. Nếu đúng, các đối tượng mà không tìm thấy tài liệu nào được tìm thấy khỏi việc xem xét. Mặc định là một hack khả năng tương thích ngược, do đó mã vẫn sử dụng Trying: factorial(1e100) Expecting: Traceback (most recent call last): ... OverflowError: n too large ok 2 items passed all tests: 1 tests in __main__ 8 tests in __main__.factorial 9 tests in 2 items. 9 passed and 0 failed. Test passed. $10 kết hợp với import doctest doctest.testfile("example.txt")7 tiếp tục nhận được đầu ra cho các đối tượng không có kiểm tra. Đối số EXXALD_EMPTY cho hàm tạo Trying: factorial(1e100) Expecting: Traceback (most recent call last): ... OverflowError: n too large ok 2 items passed all tests: 1 tests in __main__ 8 tests in __main__.factorial 9 tests in 2 items. 9 passed and 0 failed. Test passed. $12 mới hơn mặc định là true. Các đối số tùy chọn ngoại khóa, verbose, báo cáo, tùy chọnflags, raise_on_error và globs giống như đối với chức năng The ``example`` module ====================== Using ``factorial`` ------------------- This is an example text file in reStructuredText format. First import ``factorial`` from the ``example`` module: >>> from example import factorial Now use it: >>> factorial(6) 1206 ở trên, ngoại trừ các globs mặc định là Trying: factorial(1e100) Expecting: Traceback (most recent call last): ... OverflowError: n too large ok 2 items passed all tests: 1 tests in __main__ 8 tests in __main__.factorial 9 tests in 2 items. 9 passed and 0 failed. Test passed. $14. Thay đổi trong phiên bản 2.3: Tùy chọn tham số đã được thêm vào.The parameter optionflags was added. Đã thay đổi trong phiên bản 2.4: Các tham số Extraglobs, RAISE_ON_ERROR và EXCLUDE_EMPTY đã được thêm vào.The parameters extraglobs, raise_on_error and exclude_empty were added. Thay đổi trong phiên bản 2.5: đối số tùy chọn isprivate, không được dùng trong 2.4, đã bị xóa.The optional argument isprivate, deprecated in 2.4, was removed. A(f, globs[, verbose][, name][, compileflags][, optionflags])¶Các ví dụ thử nghiệm liên quan đến đối tượng F; Ví dụ: F có thể là một chuỗi, mô -đun, hàm hoặc đối tượng lớp. Một bản sao nông của Globs đối số từ điển được sử dụng cho bối cảnh thực thi. Tên đối số tùy chọn được sử dụng trong các tin nhắn thất bại và mặc định là Trying: factorial(1e100) Expecting: Traceback (most recent call last): ... OverflowError: n too large ok 2 items passed all tests: 1 tests in __main__ 8 tests in __main__.factorial 9 tests in 2 items. 9 passed and 0 failed. Test passed. $17. Nếu một đối số tùy chọn là đúng, đầu ra được tạo ra ngay cả khi không có lỗi. Theo mặc định, đầu ra chỉ được tạo trong trường hợp lỗi ví dụ. CompileFlags đối số tùy chọn cung cấp cho tập hợp các cờ nên được sử dụng bởi trình biên dịch Python khi chạy các ví dụ. Theo mặc định, hoặc nếu $ python example.py -v Trying: factorial(5) Expecting: 120 ok Trying: [factorial(n) for n in range(6)] Expecting: [1, 1, 2, 6, 24, 120] ok Trying: [factorial(long(n)) for n in range(6)] Expecting: [1, 1, 2, 6, 24, 120] ok88, cờ được suy ra tương ứng với tập hợp các tính năng trong tương lai được tìm thấy trong các quả cầu. Tùy chọn tùy chọn Tùy chọn Forgetflags hoạt động như cho chức năng The ``example`` module ====================== Using ``factorial`` ------------------- This is an example text file in reStructuredText format. First import ``factorial`` from the ``example`` module: >>> from example import factorial Now use it: >>> factorial(6) 1206 ở trên. 25.2.5. API nhấtUnittest API¶Khi bộ sưu tập các mô -đun tài liệu của bạn phát triển, bạn sẽ muốn một cách để chạy tất cả các tài liệu của họ một cách có hệ thống. Trước Python 2.4, python -m doctest -v example.py4 đã có một lớp Trying: factorial(1e100) Expecting: Traceback (most recent call last): ... OverflowError: n too large ok 2 items passed all tests: 1 tests in __main__ 8 tests in __main__.factorial 9 tests in 2 items. 9 passed and 0 failed. Test passed. $21 hầu như không được ghi nhận cung cấp một cách thô sơ để kết hợp các tài liệu từ nhiều mô -đun. Trying: factorial(1e100) Expecting: Traceback (most recent call last): ... OverflowError: n too large ok 2 items passed all tests: 1 tests in __main__ 8 tests in __main__.factorial 9 tests in 2 items. 9 passed and 0 failed. Test passed. $21 là yếu đuối và trên thực tế, hầu hết các khung thử nghiệm Python nghiêm trọng được xây dựng trên mô -đun Trying: factorial(1e100) Expecting: Traceback (most recent call last): ... OverflowError: n too large ok 2 items passed all tests: 1 tests in __main__ 8 tests in __main__.factorial 9 tests in 2 items. 9 passed and 0 failed. Test passed. $23, cung cấp nhiều cách linh hoạt để kết hợp các thử nghiệm từ nhiều nguồn. Vì vậy, trong lớp Python 2.4, ________ 44 ____ ____221 không được dùng và python -m doctest -v example.py4 cung cấp hai chức năng có thể được sử dụng để tạo các bộ kiểm tra Trying: factorial(1e100) Expecting: Traceback (most recent call last): ... OverflowError: n too large ok 2 items passed all tests: 1 tests in __main__ 8 tests in __main__.factorial 9 tests in 2 items. 9 passed and 0 failed. Test passed. $23 từ các mô -đun và tệp văn bản có chứa tài liệu. Để tích hợp với khám phá thử nghiệm Trying: factorial(1e100) Expecting: Traceback (most recent call last): ... OverflowError: n too large ok 2 items passed all tests: 1 tests in __main__ 8 tests in __main__.factorial 9 tests in 2 items. 9 passed and 0 failed. Test passed. $23, hãy bao gồm chức năng Trying: factorial(1e100) Expecting: Traceback (most recent call last): ... OverflowError: n too large ok 2 items passed all tests: 1 tests in __main__ 8 tests in __main__.factorial 9 tests in 2 items. 9 passed and 0 failed. Test passed. $29 trong mô -đun thử nghiệm của bạn: if __name__ == "__main__": import doctest doctest.testmod()5 Có hai chức năng chính để tạo các phiên bản Trying: factorial(1e100) Expecting: Traceback (most recent call last): ... OverflowError: n too large ok 2 items passed all tests: 1 tests in __main__ 8 tests in __main__.factorial 9 tests in 2 items. 9 passed and 0 failed. Test passed. $30 từ các tệp văn bản và mô -đun với tài liệu: Chuyển đổi các bài kiểm tra DocTest từ một hoặc nhiều tệp văn bản thành Trying: factorial(1e100) Expecting: Traceback (most recent call last): ... OverflowError: n too large ok 2 items passed all tests: 1 tests in __main__ 8 tests in __main__.factorial 9 tests in 2 items. 9 passed and 0 failed. Test passed. $30. Trying: factorial(1e100) Expecting: Traceback (most recent call last): ... OverflowError: n too large ok 2 items passed all tests: 1 tests in __main__ 8 tests in __main__.factorial 9 tests in 2 items. 9 passed and 0 failed. Test passed. $30 được trả về sẽ được chạy bởi khung Unittest và chạy các ví dụ tương tác trong mỗi tệp. Nếu một ví dụ trong bất kỳ tệp nào bị lỗi, thì thử nghiệm đơn vị được tổng hợp không thành công và ngoại lệ Trying: factorial(1e100) Expecting: Traceback (most recent call last): ... OverflowError: n too large ok 2 items passed all tests: 1 tests in __main__ 8 tests in __main__.factorial 9 tests in 2 items. 9 passed and 0 failed. Test passed. $35 được nêu ra hiển thị tên của tệp chứa thử nghiệm và số dòng (đôi khi gần đúng). Chuyển một hoặc nhiều đường dẫn (dưới dạng chuỗi) cho các tệp văn bản để được kiểm tra. Các tùy chọn có thể được cung cấp dưới dạng đối số từ khóa: Đối số tùy chọn Module_Relative Chỉ định cách diễn giải các tên tệp trong các đường dẫn:
Gói đối số tùy chọn là gói Python hoặc tên của gói Python có thư mục nên được sử dụng làm thư mục cơ sở cho các tên tệp liên quan đến mô-đun trong các đường dẫn. Nếu không có gói nào được chỉ định, thì thư mục mô-đun gọi được sử dụng làm thư mục cơ sở cho các tên tệp liên quan đến mô-đun. Đó là một lỗi để chỉ định gói nếu module_relative là $ python example.py -v Trying: factorial(5) Expecting: 120 ok Trying: [factorial(n) for n in range(6)] Expecting: [1, 1, 2, 6, 24, 120] ok Trying: [factorial(long(n)) for n in range(6)] Expecting: [1, 1, 2, 6, 24, 120] ok22. Thiết lập đối số tùy chọn Chỉ định chức năng thiết lập cho bộ thử nghiệm. Điều này được gọi trước khi chạy các bài kiểm tra trong mỗi tệp. Hàm thiết lập sẽ được truyền một đối tượng Trying: factorial(1e100) Expecting: Traceback (most recent call last): ... OverflowError: n too large ok 2 items passed all tests: 1 tests in __main__ 8 tests in __main__.factorial 9 tests in 2 items. 9 passed and 0 failed. Test passed. $41. Chức năng thiết lập có thể truy cập các thử nghiệm toàn cầu khi thuộc tính GLOBS của thử nghiệm được thông qua. Teardown đối số tùy chọn Chỉ định chức năng phá vỡ cho bộ thử nghiệm. Điều này được gọi sau khi chạy các bài kiểm tra trong mỗi tệp. Hàm Tear Down sẽ được truyền một đối tượng Trying: factorial(1e100) Expecting: Traceback (most recent call last): ... OverflowError: n too large ok 2 items passed all tests: 1 tests in __main__ 8 tests in __main__.factorial 9 tests in 2 items. 9 passed and 0 failed. Test passed. $41. Chức năng thiết lập có thể truy cập các thử nghiệm toàn cầu khi thuộc tính GLOBS của thử nghiệm được thông qua. Các đối số tùy chọn là một từ điển chứa các biến toàn cầu ban đầu cho các thử nghiệm. Một bản sao mới của từ điển này được tạo cho mỗi bài kiểm tra. Theo mặc định, Quả cầu là một từ điển trống mới. Đối số tùy chọn tùy chọn FILLAGS Chỉ định các tùy chọn DocTest mặc định cho các thử nghiệm, được tạo bởi các cờ tùy chọn riêng lẻ cùng nhau. Xem phần Cờ tùy chọn. Xem chức năng Trying: factorial(1e100) Expecting: Traceback (most recent call last): ... OverflowError: n too large ok 2 items passed all tests: 1 tests in __main__ 8 tests in __main__.factorial 9 tests in 2 items. 9 passed and 0 failed. Test passed. $43 bên dưới để biết cách tốt hơn để đặt các tùy chọn báo cáo.Option Flags. See function Trying: factorial(1e100) Expecting: Traceback (most recent call last): ... OverflowError: n too large ok 2 items passed all tests: 1 tests in __main__ 8 tests in __main__.factorial 9 tests in 2 items. 9 passed and 0 failed. Test passed. $43 below for a better way to set reporting options. Trình phân tích cú pháp đối số tùy chọn chỉ định >>> # comments are ignored >>> x = 12 >>> x 12 >>> if x == 13: ... print "yes" ... else: ... print "no" ... print "NO" ... print "NO!!!" ... no NO NO!!! >>>3 (hoặc lớp con) nên được sử dụng để trích xuất các thử nghiệm từ các tệp. Nó mặc định là một trình phân tích cú pháp bình thường (nghĩa là, $ python example.py -v Trying: factorial(5) Expecting: 120 ok Trying: [factorial(n) for n in range(6)] Expecting: [1, 1, 2, 6, 24, 120] ok Trying: [factorial(long(n)) for n in range(6)] Expecting: [1, 1, 2, 6, 24, 120] ok98). Mã hóa đối số tùy chọn Chỉ định một mã hóa nên được sử dụng để chuyển đổi tệp thành Unicode. Mới trong phiên bản 2.4. Đã thay đổi trong phiên bản 2.5: Toàn cầu Trying: factorial(1e100) Expecting: Traceback (most recent call last): ... OverflowError: n too large ok 2 items passed all tests: 1 tests in __main__ 8 tests in __main__.factorial 9 tests in 2 items. 9 passed and 0 failed. Test passed. $46 was added to the globals provided to doctests loaded from a text file using Trying: factorial(1e100) Expecting: Traceback (most recent call last): ... OverflowError: n too large ok 2 items passed all tests: 1 tests in __main__ 8 tests in __main__.factorial 9 tests in 2 items. 9 passed and 0 failed. Test passed. $47. Thay đổi trong phiên bản 2.5: Mã hóa tham số đã được thêm vào.The parameter encoding was added. Ghi chú Không giống như import doctest doctest.testfile("example.txt")7 và Trying: factorial(1e100) Expecting: Traceback (most recent call last): ... OverflowError: n too large ok 2 items passed all tests: 1 tests in __main__ 8 tests in __main__.factorial 9 tests in 2 items. 9 passed and 0 failed. Test passed. $12, chức năng này tăng $ python example.py -v Trying: factorial(5) Expecting: 120 ok Trying: [factorial(n) for n in range(6)] Expecting: [1, 1, 2, 6, 24, 120] ok Trying: [factorial(long(n)) for n in range(6)] Expecting: [1, 1, 2, 6, 24, 120] ok03 nếu mô -đun không chứa tài liệu. Bạn có thể ngăn chặn lỗi này bằng cách chuyển thể hiện Trying: factorial(1e100) Expecting: Traceback (most recent call last): ... OverflowError: n too large ok 2 items passed all tests: 1 tests in __main__ 8 tests in __main__.factorial 9 tests in 2 items. 9 passed and 0 failed. Test passed. $12 dưới dạng đối số test_finder với đối số từ khóa EXCLUDE_EMPTY của nó được đặt thành $ python example.py -v Trying: factorial(5) Expecting: 120 ok Trying: [factorial(n) for n in range(6)] Expecting: [1, 1, 2, 6, 24, 120] ok Trying: [factorial(long(n)) for n in range(6)] Expecting: [1, 1, 2, 6, 24, 120] ok22: if __name__ == "__main__": import doctest doctest.testmod()6 A([module][, globs][, extraglobs][, test_finder][, setUp][, tearDown][, checker])¶ Chuyển đổi các bài kiểm tra DocTest cho một mô -đun thành Trying: factorial(1e100) Expecting: Traceback (most recent call last): ... OverflowError: n too large ok 2 items passed all tests: 1 tests in __main__ 8 tests in __main__.factorial 9 tests in 2 items. 9 passed and 0 failed. Test passed. $30. Trying: factorial(1e100) Expecting: Traceback (most recent call last): ... OverflowError: n too large ok 2 items passed all tests: 1 tests in __main__ 8 tests in __main__.factorial 9 tests in 2 items. 9 passed and 0 failed. Test passed. $30 được trả lại sẽ được điều hành bởi khung công tác nhất và chạy từng tài liệu trong mô -đun. Nếu bất kỳ tài liệu nào thất bại, thì bài kiểm tra đơn vị được tổng hợp không thành công và ngoại lệ Trying: factorial(1e100) Expecting: Traceback (most recent call last): ... OverflowError: n too large ok 2 items passed all tests: 1 tests in __main__ 8 tests in __main__.factorial 9 tests in 2 items. 9 passed and 0 failed. Test passed. $35 được nêu ra hiển thị tên của tệp chứa thử nghiệm và số dòng (đôi khi gần đúng). Mô -đun đối số tùy chọn cung cấp mô -đun sẽ được kiểm tra. Nó có thể là một đối tượng mô -đun hoặc tên mô -đun (có thể là chấm). Nếu không được chỉ định, mô -đun gọi hàm này được sử dụng. Các đối số tùy chọn là một từ điển chứa các biến toàn cầu ban đầu cho các thử nghiệm. Một bản sao mới của từ điển này được tạo cho mỗi bài kiểm tra. Theo mặc định, Quả cầu là một từ điển trống mới. Đối số tùy chọn tùy chọn FILLAGS Chỉ định các tùy chọn DocTest mặc định cho các thử nghiệm, được tạo bởi các cờ tùy chọn riêng lẻ cùng nhau. Xem phần Cờ tùy chọn. Xem chức năng Trying: factorial(1e100) Expecting: Traceback (most recent call last): ... OverflowError: n too large ok 2 items passed all tests: 1 tests in __main__ 8 tests in __main__.factorial 9 tests in 2 items. 9 passed and 0 failed. Test passed. $43 bên dưới để biết cách tốt hơn để đặt các tùy chọn báo cáo. Trình phân tích cú pháp đối số tùy chọn chỉ định >>> # comments are ignored >>> x = 12 >>> x 12 >>> if x == 13: ... print "yes" ... else: ... print "no" ... print "NO" ... print "NO!!!" ... no NO NO!!! >>>3 (hoặc lớp con) nên được sử dụng để trích xuất các thử nghiệm từ các tệp. Nó mặc định là một trình phân tích cú pháp bình thường (nghĩa là, $ python example.py -v Trying: factorial(5) Expecting: 120 ok Trying: [factorial(n) for n in range(6)] Expecting: [1, 1, 2, 6, 24, 120] ok Trying: [factorial(long(n)) for n in range(6)] Expecting: [1, 1, 2, 6, 24, 120] ok98). Mã hóa đối số tùy chọn Chỉ định một mã hóa nên được sử dụng để chuyển đổi tệp thành Unicode. Mới trong phiên bản 2.3. Đã thay đổi trong phiên bản 2.4: Các tham số Globs, Extraglobs, Test_Finder, Setup, Teardown và Tùy chọn đã được thêm vào; Hàm này hiện sử dụng cùng một kỹ thuật tìm kiếm như import doctest doctest.testfile("example.txt")7. Theo bìa, Trying: factorial(1e100) Expecting: Traceback (most recent call last): ... OverflowError: n too large ok 2 items passed all tests: 1 tests in __main__ 8 tests in __main__.factorial 9 tests in 2 items. 9 passed and 0 failed. Test passed. $61 tạo ra Trying: factorial(1e100) Expecting: Traceback (most recent call last): ... OverflowError: n too large ok 2 items passed all tests: 1 tests in __main__ 8 tests in __main__.factorial 9 tests in 2 items. 9 passed and 0 failed. Test passed. $30 trong các trường hợp Trying: factorial(1e100) Expecting: Traceback (most recent call last): ... OverflowError: n too large ok 2 items passed all tests: 1 tests in __main__ 8 tests in __main__.factorial 9 tests in 2 items. 9 passed and 0 failed. Test passed. $63 và Trying: factorial(1e100) Expecting: Traceback (most recent call last): ... OverflowError: n too large ok 2 items passed all tests: 1 tests in __main__ 8 tests in __main__.factorial 9 tests in 2 items. 9 passed and 0 failed. Test passed. $64 là một lớp con của Trying: factorial(1e100) Expecting: Traceback (most recent call last): ... OverflowError: n too large ok 2 items passed all tests: 1 tests in __main__ 8 tests in __main__.factorial 9 tests in 2 items. 9 passed and 0 failed. Test passed. $65. Trying: factorial(1e100) Expecting: Traceback (most recent call last): ... OverflowError: n too large ok 2 items passed all tests: 1 tests in __main__ 8 tests in __main__.factorial 9 tests in 2 items. 9 passed and 0 failed. Test passed. $64 được ghi lại ở đây (nó là một chi tiết nội bộ), nhưng nghiên cứu mã của nó có thể trả lời các câu hỏi về các chi tiết chính xác của tích hợp Trying: factorial(1e100) Expecting: Traceback (most recent call last): ... OverflowError: n too large ok 2 items passed all tests: 1 tests in __main__ 8 tests in __main__.factorial 9 tests in 2 items. 9 passed and 0 failed. Test passed. $23. Tương tự, Trying: factorial(1e100) Expecting: Traceback (most recent call last): ... OverflowError: n too large ok 2 items passed all tests: 1 tests in __main__ 8 tests in __main__.factorial 9 tests in 2 items. 9 passed and 0 failed. Test passed. $47 tạo ra Trying: factorial(1e100) Expecting: Traceback (most recent call last): ... OverflowError: n too large ok 2 items passed all tests: 1 tests in __main__ 8 tests in __main__.factorial 9 tests in 2 items. 9 passed and 0 failed. Test passed. $30 trong các trường hợp Trying: factorial(1e100) Expecting: Traceback (most recent call last): ... OverflowError: n too large ok 2 items passed all tests: 1 tests in __main__ 8 tests in __main__.factorial 9 tests in 2 items. 9 passed and 0 failed. Test passed. $70 và Trying: factorial(1e100) Expecting: Traceback (most recent call last): ... OverflowError: n too large ok 2 items passed all tests: 1 tests in __main__ 8 tests in __main__.factorial 9 tests in 2 items. 9 passed and 0 failed. Test passed. $71 là một lớp con của Trying: factorial(1e100) Expecting: Traceback (most recent call last): ... OverflowError: n too large ok 2 items passed all tests: 1 tests in __main__ 8 tests in __main__.factorial 9 tests in 2 items. 9 passed and 0 failed. Test passed. $64. Vì vậy, cả hai cách tạo ra một phiên bản Trying: factorial(1e100) Expecting: Traceback (most recent call last): ... OverflowError: n too large ok 2 items passed all tests: 1 tests in __main__ 8 tests in __main__.factorial 9 tests in 2 items. 9 passed and 0 failed. Test passed. $30 chạy là Trying: factorial(1e100) Expecting: Traceback (most recent call last): ... OverflowError: n too large ok 2 items passed all tests: 1 tests in __main__ 8 tests in __main__.factorial 9 tests in 2 items. 9 passed and 0 failed. Test passed. $64. Điều này rất quan trọng vì một lý do tinh tế: khi bạn tự chạy các chức năng, bạn có thể kiểm soát các tùy chọn python -m doctest -v example.py4 được sử dụng trực tiếp, bằng cách chuyển các cờ tùy chọn cho các chức năng python -m doctest -v example.py4. Tuy nhiên, nếu bạn đang viết khung Trying: factorial(1e100) Expecting: Traceback (most recent call last): ... OverflowError: n too large ok 2 items passed all tests: 1 tests in __main__ 8 tests in __main__.factorial 9 tests in 2 items. 9 passed and 0 failed. Test passed. $23, Trying: factorial(1e100) Expecting: Traceback (most recent call last): ... OverflowError: n too large ok 2 items passed all tests: 1 tests in __main__ 8 tests in __main__.factorial 9 tests in 2 items. 9 passed and 0 failed. Test passed. $23 cuối cùng sẽ kiểm soát khi nào và cách các bài kiểm tra chạy. Tác giả khung thường muốn kiểm soát các tùy chọn báo cáo python -m doctest -v example.py4 (có lẽ, ví dụ: được chỉ định bởi các tùy chọn dòng lệnh), nhưng không có cách nào để truyền các tùy chọn thông qua các vận động viên kiểm tra Trying: factorial(1e100) Expecting: Traceback (most recent call last): ... OverflowError: n too large ok 2 items passed all tests: 1 tests in __main__ 8 tests in __main__.factorial 9 tests in 2 items. 9 passed and 0 failed. Test passed. $23 đến python -m doctest -v example.py4. Vì lý do này, python -m doctest -v example.py4 cũng hỗ trợ một khái niệm về các cờ báo cáo python -m doctest -v example.py4 cụ thể cho hỗ trợ Trying: factorial(1e100) Expecting: Traceback (most recent call last): ... OverflowError: n too large ok 2 items passed all tests: 1 tests in __main__ 8 tests in __main__.factorial 9 tests in 2 items. 9 passed and 0 failed. Test passed. $23, thông qua chức năng này: ________ 116 ________ 287 (cờ) ¶(flags)¶ Đặt cờ báo cáo python -m doctest -v example.py4 để sử dụng. Cờ đối số hoặc các cờ tùy chọn cùng nhau. Xem phần Cờ tùy chọn. Chỉ có thể sử dụng cờ báo cáo của người Viking.Option Flags. Only “reporting flags” can be used. Đây là cài đặt toàn cầu mô-đun và ảnh hưởng đến tất cả các tài liệu trong tương lai được thực hiện bởi mô-đun Trying: factorial(1e100) Expecting: Traceback (most recent call last): ... OverflowError: n too large ok 2 items passed all tests: 1 tests in __main__ 8 tests in __main__.factorial 9 tests in 2 items. 9 passed and 0 failed. Test passed. $23: Phương pháp Trying: factorial(1e100) Expecting: Traceback (most recent call last): ... OverflowError: n too large ok 2 items passed all tests: 1 tests in __main__ 8 tests in __main__.factorial 9 tests in 2 items. 9 passed and 0 failed. Test passed. $90 của Trying: factorial(1e100) Expecting: Traceback (most recent call last): ... OverflowError: n too large ok 2 items passed all tests: 1 tests in __main__ 8 tests in __main__.factorial 9 tests in 2 items. 9 passed and 0 failed. Test passed. $64 xem các cờ tùy chọn được chỉ định cho trường hợp thử nghiệm khi phiên bản Trying: factorial(1e100) Expecting: Traceback (most recent call last): ... OverflowError: n too large ok 2 items passed all tests: 1 tests in __main__ 8 tests in __main__.factorial 9 tests in 2 items. 9 passed and 0 failed. Test passed. $64 được xây dựng. Nếu không có cờ báo cáo nào được chỉ định (đó là trường hợp điển hình và dự kiến), các cờ báo cáo ____ 44 ____ ____223 được đặt vào các lá cờ tùy chọn và các cờ tùy chọn để tăng cường cho phiên bản $ python example.py -v Trying: factorial(5) Expecting: 120 ok Trying: [factorial(n) for n in range(6)] Expecting: [1, 1, 2, 6, 24, 120] ok Trying: [factorial(long(n)) for n in range(6)] Expecting: [1, 1, 2, 6, 24, 120] ok67 được tạo để chạy tài liệu. Nếu bất kỳ lá cờ báo cáo nào được chỉ định khi phiên bản Trying: factorial(1e100) Expecting: Traceback (most recent call last): ... OverflowError: n too large ok 2 items passed all tests: 1 tests in __main__ 8 tests in __main__.factorial 9 tests in 2 items. 9 passed and 0 failed. Test passed. $64 được xây dựng, ________ 44, Trying: factorial(1e100) Expecting: Traceback (most recent call last): ... OverflowError: n too large ok 2 items passed all tests: 1 tests in __main__ 8 tests in __main__.factorial 9 tests in 2 items. 9 passed and 0 failed. Test passed. $23 cờ báo cáo bị bỏ qua.bitwise ORed into the option flags, and the option flags so augmented are passed to the $ python example.py -v Trying: factorial(5) Expecting: 120 ok Trying: [factorial(n) for n in range(6)] Expecting: [1, 1, 2, 6, 24, 120] ok Trying: [factorial(long(n)) for n in range(6)] Expecting: [1, 1, 2, 6, 24, 120] ok67 instance created to run the doctest. If any reporting flags were specified when the Trying: factorial(1e100) Expecting: Traceback (most recent call last): ... OverflowError: n too large ok 2 items passed all tests: 1 tests in __main__ 8 tests in __main__.factorial 9 tests in 2 items. 9 passed and 0 failed. Test passed. $64 instance was constructed, python -m doctest -v example.py4’s Trying: factorial(1e100) Expecting: Traceback (most recent call last): ... OverflowError: n too large ok 2 items passed all tests: 1 tests in __main__ 8 tests in __main__.factorial 9 tests in 2 items. 9 passed and 0 failed. Test passed. $23 reporting flags are ignored. Giá trị của các cờ báo cáo Trying: factorial(1e100) Expecting: Traceback (most recent call last): ... OverflowError: n too large ok 2 items passed all tests: 1 tests in __main__ 8 tests in __main__.factorial 9 tests in 2 items. 9 passed and 0 failed. Test passed. $23 có hiệu lực trước khi hàm được gọi là được trả về bởi hàm. Mới trong phiên bản 2.4. 25.2.6. API nâng caoAdvanced API¶API cơ bản là một trình bao bọc đơn giản mà Lừa dự định làm cho tài liệu dễ sử dụng. Nó khá linh hoạt, và sẽ đáp ứng hầu hết các nhu cầu của người dùng; Tuy nhiên, nếu bạn yêu cầu kiểm soát chi tiết hơn đối với thử nghiệm hoặc muốn mở rộng các khả năng của DocTest, thì bạn nên sử dụng API nâng cao. API nâng cao xoay quanh hai lớp container, được sử dụng để lưu trữ các ví dụ tương tác được trích xuất từ các trường hợp tài liệu:
Các lớp xử lý bổ sung được xác định để tìm, phân tích và chạy và kiểm tra các ví dụ tài liệu:
Mối quan hệ giữa các lớp xử lý này được tóm tắt trong sơ đồ sau: if __name__ == "__main__": import doctest doctest.testmod()7 25.2.6.1. Đối tượng tài liệuDocTest Objects¶Lớp ________ 116 ________ 313 (Ví dụ, Quả cầu, Tên, Tên tệp, Lineno, DocString) ¶(examples, globs, name, filename, lineno, docstring)¶Một bộ sưu tập các ví dụ tài liệu nên được chạy trong một không gian tên duy nhất. Các đối số cấu trúc được sử dụng để khởi tạo các thuộc tính của cùng tên. Mới trong phiên bản 2.4. 25.2.6. API nâng cao API cơ bản là một trình bao bọc đơn giản mà Lừa dự định làm cho tài liệu dễ sử dụng. Nó khá linh hoạt, và sẽ đáp ứng hầu hết các nhu cầu của người dùng; Tuy nhiên, nếu bạn yêu cầu kiểm soát chi tiết hơn đối với thử nghiệm hoặc muốn mở rộng các khả năng của DocTest, thì bạn nên sử dụng API nâng cao.API nâng cao xoay quanh hai lớp container, được sử dụng để lưu trữ các ví dụ tương tác được trích xuất từ các trường hợp tài liệu: if __name__ == "__main__": import doctest doctest.testmod()00: Một câu lệnh Python duy nhất, được kết hợp với đầu ra dự kiến. Trying: factorial(1e100) Expecting: Traceback (most recent call last): ... OverflowError: n too large ok 2 items passed all tests: 1 tests in __main__ 8 tests in __main__.factorial 9 tests in 2 items. 9 passed and 0 failed. Test passed. $41: Bộ sưu tập if __name__ == "__main__": import doctest doctest.testmod()00s, thường được trích xuất từ một tệp tài liệu hoặc văn bản duy nhất.Các lớp xử lý bổ sung được xác định để tìm, phân tích và chạy và kiểm tra các ví dụ tài liệu: Trying: factorial(1e100) Expecting: Traceback (most recent call last): ... OverflowError: n too large ok 2 items passed all tests: 1 tests in __main__ 8 tests in __main__.factorial 9 tests in 2 items. 9 passed and 0 failed. Test passed. $12: Tìm tất cả các tài liệu trong một mô -đun nhất định và sử dụng >>> # comments are ignored >>> x = 12 >>> x 12 >>> if x == 13: ... print "yes" ... else: ... print "no" ... print "NO" ... print "NO!!!" ... no NO NO!!! >>>3 để tạo Trying: factorial(1e100) Expecting: Traceback (most recent call last): ... OverflowError: n too large ok 2 items passed all tests: 1 tests in __main__ 8 tests in __main__.factorial 9 tests in 2 items. 9 passed and 0 failed. Test passed. $41 từ mọi tài liệu có chứa các ví dụ tương tác. >>> # comments are ignored >>> x = 12 >>> x 12 >>> if x == 13: ... print "yes" ... else: ... print "no" ... print "NO" ... print "NO!!!" ... no NO NO!!! >>>3: Tạo đối tượng Trying: factorial(1e100) Expecting: Traceback (most recent call last): ... OverflowError: n too large ok 2 items passed all tests: 1 tests in __main__ 8 tests in __main__.factorial 9 tests in 2 items. 9 passed and 0 failed. Test passed. $41 từ một chuỗi (chẳng hạn như một đối tượng DocString DocString). $ python example.py -v Trying: factorial(5) Expecting: 120 ok Trying: [factorial(n) for n in range(6)] Expecting: [1, 1, 2, 6, 24, 120] ok Trying: [factorial(long(n)) for n in range(6)] Expecting: [1, 1, 2, 6, 24, 120] ok67: Thực hiện các ví dụ trong Trying: factorial(1e100) Expecting: Traceback (most recent call last): ... OverflowError: n too large ok 2 items passed all tests: 1 tests in __main__ 8 tests in __main__.factorial 9 tests in 2 items. 9 passed and 0 failed. Test passed. $41 và sử dụng $ python example.py -v Trying: factorial(5) Expecting: 120 ok Trying: [factorial(n) for n in range(6)] Expecting: [1, 1, 2, 6, 24, 120] ok Trying: [factorial(long(n)) for n in range(6)] Expecting: [1, 1, 2, 6, 24, 120] ok66 để xác minh đầu ra của chúng.________ 325¶ Số dòng trong if __name__ == "__main__": import doctest doctest.testmod()26 trong đó Trying: factorial(1e100) Expecting: Traceback (most recent call last): ... OverflowError: n too large ok 2 items passed all tests: 1 tests in __main__ 8 tests in __main__.factorial 9 tests in 2 items. 9 passed and 0 failed. Test passed. $41 này bắt đầu hoặc $ python example.py -v Trying: factorial(5) Expecting: 120 ok Trying: [factorial(n) for n in range(6)] Expecting: [1, 1, 2, 6, 24, 120] ok Trying: [factorial(long(n)) for n in range(6)] Expecting: [1, 1, 2, 6, 24, 120] ok88 nếu số dòng không có sẵn. Số dòng này dựa trên 0 đối với đầu tệp. ________ 329¶ Chuỗi mà thử nghiệm được trích xuất từ hoặc $ python example.py -v Trying: factorial(5) Expecting: 120 ok Trying: [factorial(n) for n in range(6)] Expecting: [1, 1, 2, 6, 24, 120] ok Trying: [factorial(long(n)) for n in range(6)] Expecting: [1, 1, 2, 6, 24, 120] ok88 nếu chuỗi không có sẵn hoặc nếu thử nghiệm không được trích xuất từ một chuỗi. 25.2.6.2. Ví dụ đối tượngExample Objects¶Lớp ________ 116 ________ 332 (nguồn, muốn [, exc_msg] [, lineno] [, thụt lề] [, tùy chọn]) ¶(source, want[, exc_msg][, lineno][, indent][, options])¶Một ví dụ tương tác duy nhất, bao gồm một câu lệnh Python và đầu ra dự kiến của nó. Các đối số cấu trúc được sử dụng để khởi tạo các thuộc tính của cùng tên. Mới trong phiên bản 2.4. if __name__ == "__main__": import doctest doctest.testmod()00 Xác định các thuộc tính sau. Chúng được khởi tạo bởi hàm tạo và không nên được sửa đổi trực tiếp. ________ 334¶ Một chuỗi chứa mã nguồn ví dụ. Mã nguồn này bao gồm một câu lệnh Python duy nhất và luôn kết thúc bằng một dòng mới; Trình xây dựng thêm một dòng mới khi cần thiết. ________ 335¶Đầu ra dự kiến từ việc chạy mã nguồn ví dụ (từ stdout hoặc một dấu vết trong trường hợp ngoại lệ). if __name__ == "__main__": import doctest doctest.testmod()36 kết thúc bằng một dòng mới trừ khi không có đầu ra nào được mong đợi, trong trường hợp đó, nó là một chuỗi trống. Trình xây dựng thêm một dòng mới khi cần thiết. ________ 337¶ Thông báo ngoại lệ được tạo bởi ví dụ, nếu ví dụ dự kiến sẽ tạo ra một ngoại lệ; hoặc $ python example.py -v Trying: factorial(5) Expecting: 120 ok Trying: [factorial(n) for n in range(6)] Expecting: [1, 1, 2, 6, 24, 120] ok Trying: [factorial(long(n)) for n in range(6)] Expecting: [1, 1, 2, 6, 24, 120] ok88 nếu nó không được dự kiến sẽ tạo ra một ngoại lệ. Thông báo ngoại lệ này được so sánh với giá trị trả về của if __name__ == "__main__": import doctest doctest.testmod()39. if __name__ == "__main__": import doctest doctest.testmod()40 kết thúc bằng một dòng mới trừ khi nó $ python example.py -v Trying: factorial(5) Expecting: 120 ok Trying: [factorial(n) for n in range(6)] Expecting: [1, 1, 2, 6, 24, 120] ok Trying: [factorial(long(n)) for n in range(6)] Expecting: [1, 1, 2, 6, 24, 120] ok88. Trình xây dựng thêm một dòng mới nếu cần.________ 325¶ Số dòng trong chuỗi chứa ví dụ này trong đó ví dụ bắt đầu. Số dòng này dựa trên 0 đối với đầu chuỗi chứa. ________ 343¶Ví dụ, thụt lề trong chuỗi chứa, tức là, số lượng ký tự không gian đi trước dấu nhắc đầu tiên của ví dụ. ________ 344¶Ánh xạ từ điển từ các cờ tùy chọn đến $ python example.py -v Trying: factorial(5) Expecting: 120 ok Trying: [factorial(n) for n in range(6)] Expecting: [1, 1, 2, 6, 24, 120] ok Trying: [factorial(long(n)) for n in range(6)] Expecting: [1, 1, 2, 6, 24, 120] ok20 hoặc $ python example.py -v Trying: factorial(5) Expecting: 120 ok Trying: [factorial(n) for n in range(6)] Expecting: [1, 1, 2, 6, 24, 120] ok Trying: [factorial(long(n)) for n in range(6)] Expecting: [1, 1, 2, 6, 24, 120] ok22, được sử dụng để ghi đè các tùy chọn mặc định cho ví dụ này. Bất kỳ cờ tùy chọn nào không có trong từ điển này đều được để lại ở giá trị mặc định của chúng (như được chỉ định bởi ____ 167 167 if __name__ == "__main__": import doctest doctest.testmod()48). Theo mặc định, không có tùy chọn nào được đặt. 25.2.6.3. Đối tượng doctestfinderDocTestFinder objects¶Lớp ________ 116 ________ 350 ([Verbose] [, trình phân tích cú pháp] [, Recurse] [, EXCLUDE_EMPTY])([verbose][, parser][, recurse][, exclude_empty])¶Một lớp xử lý được sử dụng để trích xuất các Trying: factorial(1e100) Expecting: Traceback (most recent call last): ... OverflowError: n too large ok 2 items passed all tests: 1 tests in __main__ 8 tests in __main__.factorial 9 tests in 2 items. 9 passed and 0 failed. Test passed. $41 có liên quan đến một đối tượng nhất định, từ tài liệu của nó và các tài liệu của các đối tượng chứa của nó. Trying: factorial(1e100) Expecting: Traceback (most recent call last): ... OverflowError: n too large ok 2 items passed all tests: 1 tests in __main__ 8 tests in __main__.factorial 9 tests in 2 items. 9 passed and 0 failed. Test passed. $41S hiện có thể được trích xuất từ các loại đối tượng sau: mô -đun, chức năng, lớp, phương thức, staticMethods, classMethods và thuộc tính. Verbose đối số tùy chọn có thể được sử dụng để hiển thị các đối tượng được tìm kiếm bởi trình tìm kiếm. Nó mặc định là $ python example.py -v Trying: factorial(5) Expecting: 120 ok Trying: [factorial(n) for n in range(6)] Expecting: [1, 1, 2, 6, 24, 120] ok Trying: [factorial(long(n)) for n in range(6)] Expecting: [1, 1, 2, 6, 24, 120] ok22 (không có đầu ra). Trình phân tích cú pháp đối số tùy chọn chỉ định đối tượng >>> # comments are ignored >>> x = 12 >>> x 12 >>> if x == 13: ... print "yes" ... else: ... print "no" ... print "NO" ... print "NO!!!" ... no NO NO!!! >>>3 (hoặc thay thế thả vào) được sử dụng để trích xuất các tài liệu từ DocStrings. Nếu đối số tùy chọn phục hồi là sai, thì if __name__ == "__main__": import doctest doctest.testmod()55 sẽ chỉ kiểm tra đối tượng đã cho và không có bất kỳ đối tượng nào có. Nếu đối số tùy chọn loại trừ_empty là sai, thì if __name__ == "__main__": import doctest doctest.testmod()55 sẽ bao gồm các thử nghiệm cho các đối tượng có tài liệu trống. Mới trong phiên bản 2.4. if __name__ == "__main__": import doctest doctest.testmod()00 Xác định các thuộc tính sau. Chúng được khởi tạo bởi hàm tạo và không nên được sửa đổi trực tiếp. ________ 334¶(obj[, name][, module][, globs][, extraglobs])¶ Một chuỗi chứa mã nguồn ví dụ. Mã nguồn này bao gồm một câu lệnh Python duy nhất và luôn kết thúc bằng một dòng mới; Trình xây dựng thêm một dòng mới khi cần thiết. ________ 335¶ Đầu ra dự kiến từ việc chạy mã nguồn ví dụ (từ stdout hoặc một dấu vết trong trường hợp ngoại lệ). if __name__ == "__main__": import doctest doctest.testmod()36 kết thúc bằng một dòng mới trừ khi không có đầu ra nào được mong đợi, trong trường hợp đó, nó là một chuỗi trống. Trình xây dựng thêm một dòng mới khi cần thiết.
Ví dụ, thụt lề trong chuỗi chứa, tức là, số lượng ký tự không gian đi trước dấu nhắc đầu tiên của ví dụ. ________ 344¶ 25.2.6.4. Đối tượng DocTestParserDocTestParser objects¶Lớp ________ 116 ________ 371¶Một lớp xử lý được sử dụng để trích xuất các ví dụ tương tác từ một chuỗi và sử dụng chúng để tạo đối tượng Trying: factorial(1e100) Expecting: Traceback (most recent call last): ... OverflowError: n too large ok 2 items passed all tests: 1 tests in __main__ 8 tests in __main__.factorial 9 tests in 2 items. 9 passed and 0 failed. Test passed. $41. Mới trong phiên bản 2.4. >>> # comments are ignored >>> x = 12 >>> x 12 >>> if x == 13: ... print "yes" ... else: ... print "no" ... print "NO" ... print "NO!!!" ... no NO NO!!! >>>3 Xác định các phương thức sau: ________ 374 (Chuỗi, Quả cầu, Tên, Tên tệp, Lineno) ¶(string, globs, name, filename, lineno)¶ Trích xuất tất cả các ví dụ tài liệu từ chuỗi đã cho và thu thập chúng thành một đối tượng Trying: factorial(1e100) Expecting: Traceback (most recent call last): ... OverflowError: n too large ok 2 items passed all tests: 1 tests in __main__ 8 tests in __main__.factorial 9 tests in 2 items. 9 passed and 0 failed. Test passed. $41. Quả cầu, tên, tên tệp và lineno là các thuộc tính cho đối tượng Trying: factorial(1e100) Expecting: Traceback (most recent call last): ... OverflowError: n too large ok 2 items passed all tests: 1 tests in __main__ 8 tests in __main__.factorial 9 tests in 2 items. 9 passed and 0 failed. Test passed. $41 mới. Xem tài liệu cho Trying: factorial(1e100) Expecting: Traceback (most recent call last): ... OverflowError: n too large ok 2 items passed all tests: 1 tests in __main__ 8 tests in __main__.factorial 9 tests in 2 items. 9 passed and 0 failed. Test passed. $41 để biết thêm thông tin. ________ 378 (Chuỗi [, tên]) ¶(string[, name])¶ Trích xuất tất cả các ví dụ tài liệu từ chuỗi đã cho và trả về chúng dưới dạng danh sách các đối tượng if __name__ == "__main__": import doctest doctest.testmod()00. Số dòng dựa trên 0. Tên đối số tùy chọn là một tên xác định chuỗi này và chỉ được sử dụng cho các thông báo lỗi. ________ 380 (Chuỗi [, tên]) ¶(string[, name])¶ Chia chuỗi đã cho thành các ví dụ và can thiệp văn bản, và trả lại chúng làm danh sách các chuỗi và chuỗi xen kẽ. Số dòng cho if __name__ == "__main__": import doctest doctest.testmod()00 dựa trên 0. Tên đối số tùy chọn là một tên xác định chuỗi này và chỉ được sử dụng cho các thông báo lỗi. 25.2.6.5. Đối tượng doctestrunnerDocTestRunner objects¶Lớp ________ 116 ________ 384 ([Checker] [, Verbose] [, Tùy chọnflags]) ¶([checker][, verbose][, optionflags])¶Một lớp xử lý được sử dụng để thực thi và xác minh các ví dụ tương tác trong Trying: factorial(1e100) Expecting: Traceback (most recent call last): ... OverflowError: n too large ok 2 items passed all tests: 1 tests in __main__ 8 tests in __main__.factorial 9 tests in 2 items. 9 passed and 0 failed. Test passed. $41. Việc so sánh giữa các đầu ra dự kiến và đầu ra thực tế được thực hiện bởi một $ python example.py -v Trying: factorial(5) Expecting: 120 ok Trying: [factorial(n) for n in range(6)] Expecting: [1, 1, 2, 6, 24, 120] ok Trying: [factorial(long(n)) for n in range(6)] Expecting: [1, 1, 2, 6, 24, 120] ok66. So sánh này có thể được tùy chỉnh với một số cờ tùy chọn; Xem phần Cờ tùy chọn để biết thêm thông tin. Nếu các cờ tùy chọn không đủ, thì so sánh cũng có thể được tùy chỉnh bằng cách chuyển một lớp con là $ python example.py -v Trying: factorial(5) Expecting: 120 ok Trying: [factorial(n) for n in range(6)] Expecting: [1, 1, 2, 6, 24, 120] ok Trying: [factorial(long(n)) for n in range(6)] Expecting: [1, 1, 2, 6, 24, 120] ok66 cho hàm tạo.Option Flags for more information. If the option flags are insufficient, then the comparison may also be customized by passing a subclass of $ python example.py -v Trying: factorial(5) Expecting: 120 ok Trying: [factorial(n) for n in range(6)] Expecting: [1, 1, 2, 6, 24, 120] ok Trying: [factorial(long(n)) for n in range(6)] Expecting: [1, 1, 2, 6, 24, 120] ok66 to the constructor. Đầu ra hiển thị của Runner Runner có thể được kiểm soát theo hai cách. Đầu tiên, một hàm đầu ra có thể được chuyển đến if __name__ == "__main__": import doctest doctest.testmod()88; Hàm này sẽ được gọi với các chuỗi nên được hiển thị. Nó mặc định là if __name__ == "__main__": import doctest doctest.testmod()89. Nếu việc nắm bắt đầu ra là không đủ, thì đầu ra hiển thị cũng có thể được tùy chỉnh bằng cách phân lớp doctestrunner và ghi đè các phương thức if __name__ == "__main__": import doctest doctest.testmod()90, if __name__ == "__main__": import doctest doctest.testmod()91, if __name__ == "__main__": import doctest doctest.testmod()92 và if __name__ == "__main__": import doctest doctest.testmod()93. Trình kiểm tra đối số từ khóa tùy chọn chỉ định đối tượng $ python example.py -v Trying: factorial(5) Expecting: 120 ok Trying: [factorial(n) for n in range(6)] Expecting: [1, 1, 2, 6, 24, 120] ok Trying: [factorial(long(n)) for n in range(6)] Expecting: [1, 1, 2, 6, 24, 120] ok66 (hoặc thay thế thả vào) nên được sử dụng để so sánh các đầu ra dự kiến với các đầu ra thực tế của các ví dụ tài liệu. Verbose đối số từ khóa tùy chọn kiểm soát tính độ dài của ____ 167. Nếu Verbose là $ python example.py -v Trying: factorial(5) Expecting: 120 ok Trying: [factorial(n) for n in range(6)] Expecting: [1, 1, 2, 6, 24, 120] ok Trying: [factorial(long(n)) for n in range(6)] Expecting: [1, 1, 2, 6, 24, 120] ok20, thì thông tin được in về mỗi ví dụ, vì nó được chạy. Nếu dài dòng là $ python example.py -v Trying: factorial(5) Expecting: 120 ok Trying: [factorial(n) for n in range(6)] Expecting: [1, 1, 2, 6, 24, 120] ok Trying: [factorial(long(n)) for n in range(6)] Expecting: [1, 1, 2, 6, 24, 120] ok22, thì chỉ có lỗi được in. Nếu verbose không xác định hoặc $ python example.py -v Trying: factorial(5) Expecting: 120 ok Trying: [factorial(n) for n in range(6)] Expecting: [1, 1, 2, 6, 24, 120] ok Trying: [factorial(long(n)) for n in range(6)] Expecting: [1, 1, 2, 6, 24, 120] ok88, thì đầu ra của verbose được sử dụng IFF, công tắc dòng lệnh python -m doctest -v example.py7 được sử dụng. Tùy chọn từ khóa tùy chọn tùy chọn có thể được sử dụng để kiểm soát cách người chạy thử so sánh đầu ra dự kiến với đầu ra thực tế và cách nó hiển thị lỗi. Để biết thêm thông tin, xem phần Tùy chọn Cờ.Option Flags. Mới trong phiên bản 2.4. >>> # comments are ignored >>> x = 12 >>> x 12 >>> if x == 13: ... print "yes" ... else: ... print "no" ... print "NO" ... print "NO!!!" ... no NO NO!!! >>>3 Xác định các phương thức sau: ________ 374 (Chuỗi, Quả cầu, Tên, Tên tệp, Lineno) ¶(out, test, example)¶ Trích xuất tất cả các ví dụ tài liệu từ chuỗi đã cho và thu thập chúng thành một đối tượng Trying: factorial(1e100) Expecting: Traceback (most recent call last): ... OverflowError: n too large ok 2 items passed all tests: 1 tests in __main__ 8 tests in __main__.factorial 9 tests in 2 items. 9 passed and 0 failed. Test passed. $41. Quả cầu, tên, tên tệp và lineno là các thuộc tính cho đối tượng Trying: factorial(1e100) Expecting: Traceback (most recent call last): ... OverflowError: n too large ok 2 items passed all tests: 1 tests in __main__ 8 tests in __main__.factorial 9 tests in 2 items. 9 passed and 0 failed. Test passed. $41 mới. Xem tài liệu cho Trying: factorial(1e100) Expecting: Traceback (most recent call last): ... OverflowError: n too large ok 2 items passed all tests: 1 tests in __main__ 8 tests in __main__.factorial 9 tests in 2 items. 9 passed and 0 failed. Test passed. $41 để biết thêm thông tin. ________ 378 (Chuỗi [, tên]) ¶(out, test, example, got)¶ Trích xuất tất cả các ví dụ tài liệu từ chuỗi đã cho và trả về chúng dưới dạng danh sách các đối tượng if __name__ == "__main__": import doctest doctest.testmod()00. Số dòng dựa trên 0. Tên đối số tùy chọn là một tên xác định chuỗi này và chỉ được sử dụng cho các thông báo lỗi. ________ 380 (Chuỗi [, tên]) ¶ Chia chuỗi đã cho thành các ví dụ và can thiệp văn bản, và trả lại chúng làm danh sách các chuỗi và chuỗi xen kẽ. Số dòng choif __name__ == "__main__": import doctest doctest.testmod()00 dựa trên 0. Tên đối số tùy chọn là một tên xác định chuỗi này và chỉ được sử dụng cho các thông báo lỗi.(out, test, example, got)¶ 25.2.6.5. Đối tượng doctestrunner ________ 380 (Chuỗi [, tên]) ¶ Chia chuỗi đã cho thành các ví dụ và can thiệp văn bản, và trả lại chúng làm danh sách các chuỗi và chuỗi xen kẽ. Số dòng choif __name__ == "__main__": import doctest doctest.testmod()00 dựa trên 0. Tên đối số tùy chọn là một tên xác định chuỗi này và chỉ được sử dụng cho các thông báo lỗi.(out, test, example, exc_info)¶ 25.2.6.5. Đối tượng doctestrunner Lớp ________ 116 ________ 384 ([Checker] [, Verbose] [, Tùy chọnflags]) ¶ Một lớp xử lý được sử dụng để thực thi và xác minh các ví dụ tương tác trongTrying: factorial(1e100) Expecting: Traceback (most recent call last): ... OverflowError: n too large ok 2 items passed all tests: 1 tests in __main__ 8 tests in __main__.factorial 9 tests in 2 items. 9 passed and 0 failed. Test passed. $41.(test[, compileflags][, out][, clear_globs])¶ Việc so sánh giữa các đầu ra dự kiến và đầu ra thực tế được thực hiện bởi một $ python example.py -v Trying: factorial(5) Expecting: 120 ok Trying: [factorial(n) for n in range(6)] Expecting: [1, 1, 2, 6, 24, 120] ok Trying: [factorial(long(n)) for n in range(6)] Expecting: [1, 1, 2, 6, 24, 120] ok66. So sánh này có thể được tùy chỉnh với một số cờ tùy chọn; Xem phần Cờ tùy chọn để biết thêm thông tin. Nếu các cờ tùy chọn không đủ, thì so sánh cũng có thể được tùy chỉnh bằng cách chuyển một lớp con là $ python example.py -v Trying: factorial(5) Expecting: 120 ok Trying: [factorial(n) for n in range(6)] Expecting: [1, 1, 2, 6, 24, 120] ok Trying: [factorial(long(n)) for n in range(6)] Expecting: [1, 1, 2, 6, 24, 120] ok66 cho hàm tạo. Các ví dụ được chạy trong không gian tên python -m doctest -v example.py16. Nếu Clear_Globs là đúng (mặc định), thì không gian tên này sẽ được xóa sau khi chạy thử, để giúp thu thập rác. Nếu bạn muốn kiểm tra không gian tên sau khi kiểm tra hoàn thành, thì hãy sử dụng Clear_Globs = False. CompileFlags cung cấp cho tập hợp các cờ nên được sử dụng bởi trình biên dịch Python khi chạy các ví dụ. Nếu không được chỉ định, thì nó sẽ mặc định cho tập hợp các cờ nhập tương lai áp dụng cho các quả cầu. Đầu ra của mỗi ví dụ được kiểm tra bằng trình kiểm tra đầu ra ____ 167 và kết quả được định dạng bằng các phương thức python -m doctest -v example.py18. ________ 419 ([Verbose]) ¶([verbose])¶ In một bản tóm tắt tất cả các trường hợp thử nghiệm đã được điều hành bởi DocTestrunner này và trả lại một Tuple python -m doctest -v example.py20 có tên.named tuple python -m doctest -v example.py20. Đối số dài dòng tùy chọn kiểm soát mức độ chi tiết của bản tóm tắt. Nếu độ mâu thuẫn không được chỉ định, thì độ verbosity ____ 167 được sử dụng. Đã thay đổi trong phiên bản 2.6: Sử dụng một tuple có tên.Use a named tuple. 25.2.6.6. OutputChecker Đối tượngOutputChecker objects¶Lớp ________ 116 ________ 423¶Một lớp được sử dụng để kiểm tra xem đầu ra thực tế từ một ví dụ tài liệu có phù hợp với đầu ra dự kiến hay không. $ python example.py -v Trying: factorial(5) Expecting: 120 ok Trying: [factorial(n) for n in range(6)] Expecting: [1, 1, 2, 6, 24, 120] ok Trying: [factorial(long(n)) for n in range(6)] Expecting: [1, 1, 2, 6, 24, 120] ok66 định nghĩa hai phương pháp: python -m doctest -v example.py25, so sánh một cặp đầu ra nhất định và trả về đúng nếu chúng khớp; và python -m doctest -v example.py26, trả về một chuỗi mô tả sự khác biệt giữa hai đầu ra. Mới trong phiên bản 2.4. $ python example.py -v Trying: factorial(5) Expecting: 120 ok Trying: [factorial(n) for n in range(6)] Expecting: [1, 1, 2, 6, 24, 120] ok Trying: [factorial(long(n)) for n in range(6)] Expecting: [1, 1, 2, 6, 24, 120] ok66 Xác định các phương thức sau: ________ 428 (muốn, có, tùy chọn)(want, got, optionflags)¶ Trả về $ python example.py -v Trying: factorial(5) Expecting: 120 ok Trying: [factorial(n) for n in range(6)] Expecting: [1, 1, 2, 6, 24, 120] ok Trying: [factorial(long(n)) for n in range(6)] Expecting: [1, 1, 2, 6, 24, 120] ok20 IFF Đầu ra thực tế từ một ví dụ (GOT) khớp với đầu ra dự kiến (Want). Những chuỗi này luôn được coi là phù hợp nếu chúng giống hệt nhau; Nhưng tùy thuộc vào những cờ tùy chọn mà người chạy thử đang sử dụng, một số loại đối sánh không chính thức cũng có thể. Xem phần Cờ tùy chọn để biết thêm thông tin về các cờ tùy chọn.Option Flags for more information about option flags. ________ 430 (ví dụ, GOT, Tùy chọn)(example, got, optionflags)¶ Trả về một chuỗi mô tả sự khác biệt giữa đầu ra dự kiến cho một ví dụ đã cho (ví dụ) và đầu ra thực tế (GOT). Tùy chọnFlags là tập hợp các cờ tùy chọn được sử dụng để so sánh muốn và có. 25.2.7. Gỡ lỗiDebugging¶DocTest cung cấp một số cơ chế để gỡ lỗi các ví dụ về tài liệu:
Các chức năng chuyển đổi tài liệu thành mã Python và có thể chạy mã tổng hợp theo trình gỡ lỗi: ________ 116 ________ 442 (s) ¶(s)¶Chuyển đổi văn bản với các ví dụ thành một tập lệnh. Đối số S là một chuỗi chứa các ví dụ tài liệu. Chuỗi được chuyển đổi thành tập lệnh Python, trong đó các ví dụ tài liệu trong s được chuyển đổi thành mã thông thường và mọi thứ khác được chuyển đổi thành các bình luận của Python. Tập lệnh được tạo được trả về dưới dạng chuỗi. Ví dụ, python -m doctest -v example.py0 displays: python -m doctest -v example.py1 Hàm này được sử dụng bên trong bởi các chức năng khác (xem bên dưới), nhưng cũng có thể hữu ích khi bạn muốn chuyển đổi phiên Python tương tác thành tập lệnh Python. Mới trong phiên bản 2.4. $ python example.py -v Trying: factorial(5) Expecting: 120 ok Trying: [factorial(n) for n in range(6)] Expecting: [1, 1, 2, 6, 24, 120] ok Trying: [factorial(long(n)) for n in range(6)] Expecting: [1, 1, 2, 6, 24, 120] ok66 Xác định các phương thức sau:(module, name)¶ ________ 428 (muốn, có, tùy chọn) Trả về $ python example.py -v Trying: factorial(5) Expecting: 120 ok Trying: [factorial(n) for n in range(6)] Expecting: [1, 1, 2, 6, 24, 120] ok Trying: [factorial(long(n)) for n in range(6)] Expecting: [1, 1, 2, 6, 24, 120] ok20 IFF Đầu ra thực tế từ một ví dụ (GOT) khớp với đầu ra dự kiến (Want). Những chuỗi này luôn được coi là phù hợp nếu chúng giống hệt nhau; Nhưng tùy thuộc vào những cờ tùy chọn mà người chạy thử đang sử dụng, một số loại đối sánh không chính thức cũng có thể. Xem phần Cờ tùy chọn để biết thêm thông tin về các cờ tùy chọn. python -m doctest -v example.py2 ________ 430 (ví dụ, GOT, Tùy chọn) Trả về một chuỗi mô tả sự khác biệt giữa đầu ra dự kiến cho một ví dụ đã cho (ví dụ) và đầu ra thực tế (GOT). Tùy chọnFlags là tập hợp các cờ tùy chọn được sử dụng để so sánh muốn và có. 25.2.7. Gỡ lỗi(module, name[, pm])¶DocTest cung cấp một số cơ chế để gỡ lỗi các ví dụ về tài liệu: Một số chức năng chuyển đổi tài liệu thành các chương trình Python có thể thực thi, có thể được chạy theo trình gỡ lỗi Python, python -m doctest -v example.py31. A shallow copy of python -m doctest -v example.py53 is used for both local and global execution context. Optional argument pm controls whether post-mortem debugging is used. If pm has a true value, the script file is run directly, and the debugger gets involved only if the script terminates via raising an unhandled exception. If it does, then post-mortem debugging is invoked, via python -m doctest -v example.py54, passing the traceback object from the unhandled exception. If pm is not specified, or is false, the script is run under the debugger from the start, via passing an appropriate python -m doctest -v example.py55 call to python -m doctest -v example.py56. New in version 2.3. Changed in version 2.4: The pm argument was added. $ python example.py -v Trying: factorial(5) Expecting: 120 ok Trying: [factorial(n) for n in range(6)] Expecting: [1, 1, 2, 6, 24, 120] ok Trying: [factorial(long(n)) for n in range(6)] Expecting: [1, 1, 2, 6, 24, 120] ok16 python -m doctest -v example.py58(src[, pm][, globs])¶ Debug the doctests in a string. This is like function python -m doctest -v example.py36 above, except that a string containing doctest examples is specified directly, via the src argument. Optional argument pm has the same meaning as in function python -m doctest -v example.py36 above. Optional argument globs gives a dictionary to use as both local and global execution context. If not specified, or $ python example.py -v Trying: factorial(5) Expecting: 120 ok Trying: [factorial(n) for n in range(6)] Expecting: [1, 1, 2, 6, 24, 120] ok Trying: [factorial(long(n)) for n in range(6)] Expecting: [1, 1, 2, 6, 24, 120] ok88, an empty dictionary is used. If specified, a shallow copy of the dictionary is used. New in version 2.4. The python -m doctest -v example.py32 class, and the special exceptions it may raise, are of most interest to testing framework authors, and will only be sketched here. See the source code, and especially python -m doctest -v example.py32’s docstring (which is a doctest!) for more details: class $ python example.py -v Trying: factorial(5) Expecting: 120 ok Trying: [factorial(n) for n in range(6)] Expecting: [1, 1, 2, 6, 24, 120] ok Trying: [factorial(long(n)) for n in range(6)] Expecting: [1, 1, 2, 6, 24, 120] ok16 python -m doctest -v example.py65([checker][, verbose][, optionflags])¶ A subclass of $ python example.py -v Trying: factorial(5) Expecting: 120 ok Trying: [factorial(n) for n in range(6)] Expecting: [1, 1, 2, 6, 24, 120] ok Trying: [factorial(long(n)) for n in range(6)] Expecting: [1, 1, 2, 6, 24, 120] ok67 that raises an exception as soon as a failure is encountered. If an unexpected exception occurs, an python -m doctest -v example.py67 exception is raised, containing the test, the example, and the original exception. If the output doesn’t match, then a python -m doctest -v example.py68 exception is raised, containing the test, the example, and the actual output. For information about the constructor parameters and methods, see the documentation for $ python example.py -v Trying: factorial(5) Expecting: 120 ok Trying: [factorial(n) for n in range(6)] Expecting: [1, 1, 2, 6, 24, 120] ok Trying: [factorial(long(n)) for n in range(6)] Expecting: [1, 1, 2, 6, 24, 120] ok67 in section Advanced API. There are two exceptions that may be raised by python -m doctest -v example.py32 instances: exception $ python example.py -v Trying: factorial(5) Expecting: 120 ok Trying: [factorial(n) for n in range(6)] Expecting: [1, 1, 2, 6, 24, 120] ok Trying: [factorial(long(n)) for n in range(6)] Expecting: [1, 1, 2, 6, 24, 120] ok16 python -m doctest -v example.py72(test, example, got)¶ An exception raised by $ python example.py -v Trying: factorial(5) Expecting: 120 ok Trying: [factorial(n) for n in range(6)] Expecting: [1, 1, 2, 6, 24, 120] ok Trying: [factorial(long(n)) for n in range(6)] Expecting: [1, 1, 2, 6, 24, 120] ok67 to signal that a doctest example’s actual output did not match its expected output. The constructor arguments are used to initialize the attributes of the same names. python -m doctest -v example.py68 defines the following attributes: python -m doctest -v example.py75 python -m doctest -v example.py76¶ The Trying: factorial(1e100) Expecting: Traceback (most recent call last): ... OverflowError: n too large ok 2 items passed all tests: 1 tests in __main__ 8 tests in __main__.factorial 9 tests in 2 items. 9 passed and 0 failed. Test passed. $41 object that was being run when the example failed. python -m doctest -v example.py75 python -m doctest -v example.py79¶ The if __name__ == "__main__": import doctest doctest.testmod()00 that failed. python -m doctest -v example.py75 python -m doctest -v example.py82¶ The example’s actual output. exception$ python example.py -v Trying: factorial(5) Expecting: 120 ok Trying: [factorial(n) for n in range(6)] Expecting: [1, 1, 2, 6, 24, 120] ok Trying: [factorial(long(n)) for n in range(6)] Expecting: [1, 1, 2, 6, 24, 120] ok16 python -m doctest -v example.py84(test, example, exc_info)¶ An exception raised by $ python example.py -v Trying: factorial(5) Expecting: 120 ok Trying: [factorial(n) for n in range(6)] Expecting: [1, 1, 2, 6, 24, 120] ok Trying: [factorial(long(n)) for n in range(6)] Expecting: [1, 1, 2, 6, 24, 120] ok67 to signal that a doctest example raised an unexpected exception. The constructor arguments are used to initialize the attributes of the same names. python -m doctest -v example.py67 defines the following attributes: python -m doctest -v example.py87 python -m doctest -v example.py76¶ The Trying: factorial(1e100) Expecting: Traceback (most recent call last): ... OverflowError: n too large ok 2 items passed all tests: 1 tests in __main__ 8 tests in __main__.factorial 9 tests in 2 items. 9 passed and 0 failed. Test passed. $41 object that was being run when the example failed. python -m doctest -v example.py87 python -m doctest -v example.py79¶ The if __name__ == "__main__": import doctest doctest.testmod()00 that failed. python -m doctest -v example.py87 python -m doctest -v example.py94¶ A tuple containing information about the unexpected exception, as returned by python -m doctest -v example.py12. 25.2.8. Soapbox¶As mentioned in the introduction, python -m doctest -v example.py4 has grown to have three primary uses:
These uses have different requirements, and it is important to distinguish them. In particular, filling your docstrings with obscure test cases makes for bad documentation. When writing a docstring, choose docstring examples with care. There’s an art to this that needs to be learned—it may not be natural at first. Examples should add genuine value to the documentation. A good example can often be worth many words. If done with care, the examples will be invaluable for your users, and will pay back the time it takes to collect them many times over as the years go by and things change. I’m still amazed at how often one of my python -m doctest -v example.py4 examples stops working after a “harmless” change. Doctest also makes an excellent tool for regression testing, especially if you don’t skimp on explanatory text. By interleaving prose and examples, it becomes much easier to keep track of what’s actually being tested, and why. When a test fails, good prose can make it much easier to figure out what the problem is, and how it should be fixed. It’s true that you could write extensive comments in code-based testing, but few programmers do. Many have found that using doctest approaches instead leads to much clearer tests. Perhaps this is simply because doctest makes writing prose a little easier than writing code, while writing comments in code is a little harder. I think it goes deeper than just that: the natural attitude when writing a doctest-based test is that you want to explain the fine points of your software, and illustrate them with examples. This in turn naturally leads to test files that start with the simplest features, and logically progress to complications and edge cases. A coherent narrative is the result, instead of a collection of isolated functions that test isolated bits of functionality seemingly at random. It’s a different attitude, and produces different results, blurring the distinction between testing and explaining. Kiểm tra hồi quy được giới hạn tốt nhất cho các đối tượng hoặc tệp chuyên dụng. Có một số tùy chọn để tổ chức các bài kiểm tra:
Khi bạn đã đặt các bài kiểm tra của mình vào một mô -đun, mô -đun có thể là người chạy thử nghiệm. Khi một bài kiểm tra thất bại, bạn có thể sắp xếp cho người chạy thử nghiệm của mình để chỉ chạy lại tài liệu thất bại trong khi bạn gỡ lỗi vấn đề. Dưới đây là một ví dụ tối thiểu về một người chạy thử như vậy: python -m doctest -v example.py3 Chú thích 1Các ví dụ có chứa cả đầu ra dự kiến và một ngoại lệ không được hỗ trợ. Cố gắng đoán nơi một kết thúc và người kia bắt đầu quá dễ bị lỗi, và điều đó cũng làm cho một bài kiểm tra khó hiểu. |