2010-04-25 34 views
33

Có thể sử dụng khái niệm doctest của Python cho các lớp học, không chỉ các chức năng?Python: sử dụng doctests cho các lớp học

Nếu có, tôi sẽ đặt tài liệu ở đâu - tại docstring của lớp học hoặc tại docstring của nhà xây dựng?

Để làm rõ, tôi đang tìm một cái gì đó như:

class Test: 
    """ 
    >>> a=Test(5) 
    >>> a.multiply_by_2() 
    10 
    """ 
    def __init__(self, number): 
     self._number=number 

    def multiply_by_2(self): 
     return self._number*2 

Cảm ơn trước,

Adam

+5

Là một mặt lưu ý, luôn kế thừa từ 'object' chứ không phải là không có gì để bạn có đang sử dụng * mới các lớp kiểu *. –

+9

Ngoại trừ trong python 3, nơi chỉ có các lớp kiểu mới và 'đối tượng' được ngụ ý không có bố mẹ được khai báo. – Daenyth

Trả lời

23

Bạn đang thiếu mã để thực sự chạy các tài liệu ở cuối tệp:

class Test: 
    <snip> 

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

Để biết vị trí cần kiểm tra:

  • Nếu thử nghiệm toàn bộ lớp học, tôi sẽ đặt chúng trong chuỗi tài liệu của lớp học.
  • Nếu nó đang thử nghiệm hàm tạo, tôi sẽ đặt chúng trong chuỗi tài liệu của hàm tạo.
  • Nếu nó thử nghiệm một phương pháp (như nó có vẻ là trong trường hợp này), tôi thực sự sẽ đặt nó trong docstring của phương pháp đó.
+1

+1 Cảm ơn! Tuy nhiên, việc ghi lại một phương thức có vẻ hơi tẻ nhạt, bởi vì nó đòi hỏi tôi phải khởi tạo một đối tượng cho mỗi doctest. –

+4

@Adam: nếu bạn cần thử nghiệm phức tạp hơn, hãy sử dụng mô-đun không nhất thiết. doctest chủ yếu dành cho việc kiểm tra các tài liệu, chứ không phải kiểm tra mã. –

5

Module doctest tìm kiếm bất kỳ docstrings trong một tập tin và thực hiện bất kỳ mã nhúng trong đó, vì vậy có thể sử dụng doctest cho các lớp học.

Để biết liệu tốt hơn là đặt các tài liệu trong chuỗi tài liệu của lớp hoặc hàm tạo, tôi nghĩ điều đó phụ thuộc vào chính xác những gì bạn đang làm tài liệu.

Nếu chuỗi cung cấp tổng quan chung về lớp học và cách sử dụng nó thì tôi nghĩ tốt hơn nên đặt nó trong lớp.

Nếu chuỗi tài liệu cụ thể về cách tạo các phiên bản của lớp thì nó sẽ theo phương thức __init__.

Hãy nhớ ý định của doctests chủ yếu là có mã mẫu tự xác thực trong tài liệu, vì vậy IMHO khía cạnh tài liệu nên được ưu tiên hơn khía cạnh thử nghiệm.

Edit:

Trong ví dụ của bạn ở trên không có mã để thực hiện doctest - chạy python test.py -v sẽ thực thi mã python chính mà chỉ định nghĩa lớp.

Bạn cần phải thêm video này vào cuối file:

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

Ngoài Nếu bạn đang sử dụng Python 2.6 hoặc mới hơn chạy nó với:

python -m doctest -v test.py 
+0

Cảm ơn, nhưng tại sao ví dụ của tôi không hoạt động? Tôi đã thử 'python test.py -v', và không có gì –

+1

@Adam Nếu những gì bạn đăng là tệp' test.py' đầy đủ, bạn không làm 'if __name__ ==" __main__ ": nhập doctest; doctest.testmod() '; nếu bạn đã sử dụng nó, không có đầu ra có nghĩa là không có lỗi. :) – badp

+0

không nếu anh ấy thêm -v –

47

Thay vì instantiating các đối tượng trong mọi phương pháp, bạn có thể làm một cái gì đó như thế này:

class Test: 
    def multiply_by_2(self): 
     """ 
     >>> t.multiply_by_2() 
     10 
     """ 
     return self._number*2 

if __name__ == "__main__": 
    import doctest 
    doctest.testmod(extraglobs={'t': Test()}) 
+3

Tôi không biết về từ khóa extraglobs. Cảm ơn! Nó rất hữu ích. –

Các vấn đề liên quan