Python - doctest so với unittest [đã đóng]


159

Tôi đang cố gắng bắt đầu với thử nghiệm đơn vị trong Python và tôi đã tự hỏi liệu ai đó có thể giải thích những lợi thế và bất lợi của doctest và không đáng tin nhất.

Những điều kiện bạn sẽ sử dụng mỗi cho?

Câu trả lời:


177

Cả hai đều có giá trị. Tôi sử dụng cả doctest và mũi thay thế cho ít nhất. Tôi sử dụng doctest cho các trường hợp trong đó bài kiểm tra đưa ra một ví dụ về việc sử dụng thực sự hữu ích như tài liệu. Nói chung, tôi không làm cho các bài kiểm tra này toàn diện, chỉ nhằm mục đích cung cấp thông tin. Tôi đang sử dụng doctest một cách hiệu quả ngược lại: không phải để kiểm tra mã của tôi là đúng dựa trên doctest của tôi, nhưng để kiểm tra xem tài liệu của tôi có đúng dựa trên mã không.

Lý do là tôi thấy các tài liệu toàn diện sẽ làm lộn xộn tài liệu của bạn quá nhiều, vì vậy bạn sẽ kết thúc với các tài liệu không thể sử dụng hoặc kiểm tra không đầy đủ.

Để thực sự kiểm tra , mục tiêu là kiểm tra kỹ lưỡng mọi trường hợp, thay vì minh họa những gì được thực hiện bằng ví dụ, đó là một mục tiêu khác mà tôi nghĩ là được đáp ứng tốt hơn bởi các khung công tác khác.


29
Có rất ít bản tóm tắt, và tôi thấy các bài kiểm tra viết (và đọc) đơn giản hơn nhiều. Chi phí khởi động thấp để viết các bài kiểm tra (tức là chỉ viết một hàm "test_foo ()" và đi) cũng giúp chống lại sự cám dỗ để thực hiện các bit mã thú vị trước khi đóng các bài kiểm tra của bạn.
Brian

6
Tôi nghĩ rằng đây là một câu trả lời tuyệt vời.
James Brady

Những khung kiểm tra nào khác mà bạn sử dụng? Hay là độc quyền mũi?
Joe

6
Với độ tuổi của câu trả lời này, có lẽ đáng để đề cập đến là phần lớn "bản tóm tắt" của các phiên bản cũ nhất không đáng kể phần lớn đã biến mất. Tôi vẫn thích Mũi tốt hơn, nhưng nó khá là khó chịu.
Adam Parkin

1
Mũi FYI đã ở trong "chế độ bảo trì" trong nhiều năm qua và có khả năng sẽ ngừng mọi sự phát triển (vắng mặt sự can thiệp của bên thứ 3). Các nhà bảo trì đề nghị các dự án mới sử dụng một giải pháp thay thế.
Sáu

48

Tôi sử dụng unittest gần như độc quyền.

Thỉnh thoảng, tôi sẽ đặt một số thứ vào một chuỗi tài liệu mà doctest có thể sử dụng được.

95% các trường hợp thử nghiệm là không đáng kể.

Tại sao? Tôi thích giữ các tài liệu có phần ngắn hơn và nhiều hơn đến điểm. Đôi khi các trường hợp kiểm tra giúp làm rõ một chuỗi. Hầu hết thời gian, các trường hợp thử nghiệm của ứng dụng quá dài cho một chuỗi.


Sẽ thật tuyệt khi xem một ví dụ, những gì bạn nghĩ là phù hợp docstringvà những gì không. Tôi thực sự thích doc Chuỗi trong thuật ngữ rằng nó hiển thị rõ ràng cách sử dụng giao diện, nhưng sử dụng cả hai cho điều đó và kiểm tra đơn vị có thể không phù hợp.
dùng1767754

33

Một ưu điểm khác của doctesting là bạn có thể đảm bảo mã của bạn thực hiện những gì tài liệu của bạn nói. Sau một thời gian, các thay đổi phần mềm có thể khiến tài liệu và mã của bạn làm những việc khác nhau. :-)


6
+1 từ tôi - điểm xuất sắc
doug

28

Tôi làm việc như một nhà sinh học và hầu hết các mã tôi viết là các tập lệnh "một lần, một nhiệm vụ", mã sẽ chỉ được chạy một hoặc hai lần và thực thi một nhiệm vụ cụ thể.

Trong tình huống này, việc viết những điều không đáng có có thể là quá mức cần thiết, và các tài liệu là một sự thỏa hiệp hữu ích. Chúng nhanh hơn để viết và vì chúng thường được kết hợp trong mã, chúng cho phép luôn theo dõi cách mã nên hoạt động, mà không cần phải mở tệp khác. Điều đó hữu ích khi viết kịch bản nhỏ.

Ngoài ra, doctests rất hữu ích khi bạn phải chuyển kịch bản của mình cho một nhà nghiên cứu không phải là chuyên gia lập trình. Một số người cảm thấy rất khó hiểu làm thế nào unittests được cấu trúc; mặt khác, doctests là những ví dụ đơn giản về cách sử dụng, vì vậy mọi người chỉ cần sao chép và dán chúng để xem cách sử dụng chúng.

Vì vậy, để tiếp tục câu trả lời của tôi: doctests rất hữu ích khi bạn phải viết các tập lệnh nhỏ và khi bạn phải chuyển chúng hoặc đưa chúng cho các nhà nghiên cứu không phải là nhà khoa học máy tính.


6
"doctests rất hữu ích khi bạn phải viết các tập lệnh nhỏ và khi bạn phải chuyển chúng hoặc đưa chúng cho các nhà nghiên cứu không phải là nhà khoa học máy tính." Điểm tuyệt vời. Tôi làm điều tương tự và các lập trình viên không phải trăn luôn ngạc nhiên rằng tài liệu có thể được thực thi.
Daniel Canas

14

Nếu bạn chỉ mới bắt đầu với ý tưởng thử nghiệm đơn vị, tôi sẽ bắt đầu với doctestvì nó rất đơn giản để sử dụng. Nó cũng tự nhiên cung cấp một số mức độ tài liệu. Và để thử nghiệm toàn diện hơn với doctest, bạn có thể đặt các thử nghiệm trong một tệp bên ngoài để nó không làm lộn xộn tài liệu của bạn.

Tôi sẽ đề nghị unittestnếu bạn đến từ một nền tảng đã sử dụng JUnit hoặc một cái gì đó tương tự, nơi bạn muốn có thể viết các bài kiểm tra đơn vị theo cách tương tự như bạn đã từng ở nơi khác.


4
Tôi đã được khuyến khích theo hướng này ( doctestđể bắt đầu), nhưng cuối cùng đã hối hận. Đối với các trường hợp thử nghiệm không tầm thường, tôi đã mất đánh dấu cú pháp và tự động hoàn thành trình soạn thảo của mình. Khi các bài kiểm tra nằm trong một tệp riêng biệt, tôi không còn có thể chạy nó trực tiếp từ trình chỉnh sửa - tôi sẽ phải thay đổi ngữ cảnh trở lại tệp nguồn tương ứng mỗi lần.
Oddthinking

7

Tôi sử dụng độc nhất; Tôi nghĩ rằng doctest làm hỏng mô-đun chính quá nhiều. Điều này có lẽ phải làm với việc viết các bài kiểm tra kỹ lưỡng.


7

Sử dụng cả hai là một lựa chọn hợp lệ và khá đơn giản. Các doctestmô-đun cung cấp DoctTestSuiteDocFileSuite phương pháp mà tạo ra một TestSuite unittest tương thích từ một mô-đun hoặc tập tin tương ứng.

Vì vậy, tôi sử dụng cả hai và thường sử dụng doctest cho các thử nghiệm đơn giản với các hàm yêu cầu ít hoặc không cần thiết lập (các loại đơn giản cho các đối số). Tôi thực sự nghĩ rằng một vài thử nghiệm doctest giúp ghi lại chức năng, thay vì làm mất giá trị của nó.

Nhưng đối với các trường hợp phức tạp hơn và đối với tập hợp các trường hợp kiểm thử toàn diện hơn, tôi sử dụng unittest để cung cấp nhiều kiểm soát và linh hoạt hơn.


7

Tôi không sử dụng doctest như một sự thay thế cho không đáng tin cậy. Mặc dù chúng trùng nhau một chút, hai mô-đun không có cùng chức năng:

  • Tôi sử dụng unittestnhư một khung kiểm tra đơn vị, có nghĩa là nó giúp tôi xác định nhanh chóng tác động của bất kỳ sửa đổi nào đối với phần còn lại của mã.

  • Tôi sử dụng doctestnhư một sự đảm bảo rằng các bình luận (cụ thể là các tài liệu) vẫn có liên quan đến phiên bản hiện tại của mã.

Những lợi ích được ghi nhận rộng rãi của sự phát triển dựa trên thử nghiệm mà tôi nhận được từ unittest. doctestgiải quyết mối nguy hiểm tinh vi hơn nhiều khi có những bình luận lỗi thời làm sai lệch việc duy trì mã.


4

Tôi gần như không bao giờ sử dụng doctests. Tôi muốn mã của tôi được tự ghi lại và các tài liệu cung cấp tài liệu cho người dùng. IMO thêm hàng trăm dòng kiểm tra vào một mô-đun làm cho các tài liệu ít được đọc hơn. Tôi cũng tìm thấy các bài kiểm tra đơn vị dễ dàng sửa đổi khi cần thiết.


4

Doctestmột số lần có thể dẫn đến kết quả sai. Đặc biệt là khi đầu ra chứa các chuỗi thoát. Ví dụ

def convert():
    """
    >>> convert()
    '\xe0\xa4\x95'
    """
    a = '\xe0\xa4\x95'
    return a
import doctest
doctest.testmod()

cho

**********************************************************************
File "hindi.py", line 3, in __main__.convert
Failed example:
    convert()
Expected:
    'क'
Got:
    '\xe0\xa4\x95'
**********************************************************************
1 items had failures:
   1 of   1 in __main__.convert
***Test Failed*** 1 failures. 

Cũng không kiểm tra loại đầu ra. Nó chỉ so sánh các chuỗi đầu ra. Ví dụ, nó đã tạo ra một số loại hợp lý in giống như số nguyên nếu nó là một số nguyên. Sau đó, giả sử bạn có chức năng trả về hợp lý. Vì vậy, một doctest sẽ không phân biệt nếu đầu ra là số nguyên hợp lý hoặc số nguyên.


5
Bạn có thể sử dụng docstrings thô ( r""" ... """) để khắc phục sự cố đầu tiên.
icktoofay

Hoạt động tốt trong Python 3.4. Để làm cho nó hoạt động trong Python 2.7, hãy sử dụng '\\xe0\\xa4\\x95'trong chuỗi doc của bạn.
Cees Timmerman

Tôi cũng đã phát hiện ra rằng các chữ unicode cũng không hoạt động với doctests (ngay cả với dòng nhận xét 'mã hóa utf-8' đúng ở đầu tệp. Nói chung, doctests không được hỗ trợ như các bài kiểm tra không đáng tin cậy, do đó, có một số lỗi không được sửa.
RichVel

2

Tôi thích các hệ thống dựa trên khám phá ("mũi" và "py.test", sử dụng hệ thống trước đây).

doctest là tốt khi bài kiểm tra cũng tốt như một tài liệu, nếu không họ có xu hướng làm lộn xộn mã quá nhiều.


mũi trông cực kỳ hữu ích; Tôi chưa có cơ hội sử dụng nó, nhưng tôi đã có hy vọng cao :)
Tony Arkles

mũi là khá nhiều khung thử nghiệm dễ sử dụng nhất, IMO. Nó làm cho viết và chạy các trường hợp thử nghiệm khá nhiều nỗ lực.
Kamil Kisiel
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.