Viết bài kiểm tra đơn vị bằng Python: Làm thế nào để tôi bắt đầu? [đóng cửa]


534

Tôi đã hoàn thành dự án thích hợp đầu tiên của mình trong Python và bây giờ nhiệm vụ của tôi là viết các bài kiểm tra cho nó.

Vì đây là lần đầu tiên tôi thực hiện một dự án, đây là lần đầu tiên tôi sẽ viết bài kiểm tra cho nó.

Câu hỏi là, làm thế nào để tôi bắt đầu? Tôi hoàn toàn không có ý tưởng. Bất cứ ai cũng có thể chỉ cho tôi một số tài liệu / hướng dẫn / liên kết / cuốn sách mà tôi có thể sử dụng để bắt đầu với bài kiểm tra viết (và tôi đoán cụ thể là kiểm tra đơn vị)

Bất kỳ lời khuyên sẽ được hoan nghênh về chủ đề này.


4
Sẽ không bao giờ là quá muộn để viết bài kiểm tra nếu đó là ý định của bạn. Tốt hơn là có một số ít hơn không có gì cho tất cả những gì phàn nàn ...
Asken

1
Đây là một cuốn sách phát triển dựa trên thử nghiệm tốt được phát hành trực tuyến miễn phí: chimera.labs.oreilly.com/books/1234000000754/index.html
Will

4
tài nguyên tốt Tôi tình cờ tìm thấy https://www.jeffknupp.com/blog/2013/12/09/improve-your-python-under Hiểu-unit-testing / . Là một người mới chơi python, tôi thấy nó dễ hiểu.
phà

2
Hướng dẫn về Python của Hitchhiker có một cái nhìn tổng quan ngắn gọn về các công cụ để kiểm tra đơn vị: python-guide-pt-br.readthedocs.io/en/latest/wr/tests
Anton Tarasenko

Nhận xét trước nên được đánh giá cao hơn, vì hướng dẫn cũng có kho lưu trữ mã ví dụ trên github.com/kennethreitz/samplemod , một nơi tuyệt vời để bắt đầu, quá.
setempler

Câu trả lời:


101

Nếu bạn là người hoàn toàn mới khi sử dụng những điều không mong muốn, cách tiếp cận đơn giản nhất để học thường là tốt nhất. Trên cơ sở đó, tôi khuyên bạn nên sử dụng py.testthay vì mô-đun mặc địnhunittest .

Hãy xem xét hai ví dụ này, chúng làm cùng một điều:

Ví dụ 1 (không đáng tin cậy nhất):

import unittest

class LearningCase(unittest.TestCase):
    def test_starting_out(self):
        self.assertEqual(1, 1)

def main():
    unittest.main()

if __name__ == "__main__":
    main()

Ví dụ 2 (pytest):

def test_starting_out():
    assert 1 == 1

Giả sử rằng cả hai tệp được đặt tên test_unittesting.py, làm thế nào để chúng tôi chạy thử nghiệm?

Ví dụ 1 (không đáng tin cậy nhất):

cd /path/to/dir/
python test_unittesting.py

Ví dụ 2 (pytest):

cd /path/to/dir/
py.test

7
Tôi đã nghe nói về sự đơn giản của py.test tại nhiều nơi ( docs.python-guide.org/en/latest/wr/tests/#py-test , docs.python.org/3.5/l Library / unittest.html # module -unittest , jeffknupp.com/blog/2013/12/09/ Quảng cáo ) Tại sao unit-testvẫn được đưa vào thư viện chuẩn, nếu py.testnosecung cấp cùng chức năng với giao diện đơn giản hơn nhiều? Là nó chỉ để cung cấp khả năng tương thích ngược, hoặc không unittestcó một số lợi thế mà py.testnosetestkhông thể cung cấp?
alpha_989

@ alpha_989 Thư viện python tiêu chuẩn không có ý định chứa các công cụ tốt nhất hiện có. Đó là những gì PyPI dành cho. unittestGói tiêu chuẩn vẫn đủ tốt. Đó là tiêu chuẩn có nghĩa là nó được đảm bảo để hoạt động tốt. Cuối cùng, bất cứ ai sử dụng mã của bạn đều không cần cài đặt các gói bổ sung.
Jeyekomon

72

Cuốn sách Python miễn phí Lặn vào Python có một chương về thử nghiệm đơn vị mà bạn có thể thấy hữu ích.

Nếu bạn làm theo các thực tiễn hiện đại, có lẽ bạn nên viết các bài kiểm tra trong khi bạn đang viết dự án của mình và không đợi đến khi dự án của bạn gần hoàn thành.

Bit muộn bây giờ, nhưng bây giờ bạn biết cho lần sau. :)


13
Tôi vẫn nói rằng nếu bạn muốn cấu trúc lại mã không có kiểm tra đơn vị, trước tiên bạn nên viết kiểm tra đơn vị cho nó
Hubert Kario

9
Vâng, rất nhiều người lần đầu tiên đến với những người không quen biết lần đầu tiên nghe thấy những gì nghe có vẻ như "tốt, đó là quá muộn cho dự án hiện tại của bạn" từ những bàn tay cũ: ngay cả khi đó không phải là những gì họ thực sự muốn nói, đó là những gì người mới nghe thấy . Nó giống như câu tục ngữ của Trung Quốc về việc trồng cây: thời điểm tốt nhất để bắt đầu thử nghiệm là khi bắt đầu một dự án; bây giờ là thời điểm tốt nhất để bắt đầu các bài kiểm tra!
JP

4
Lặn vào liên kết Python bị hỏng ... :-(
Scott Skiles

40

Theo tôi, có ba khung thử nghiệm trăn tuyệt vời rất tốt để kiểm tra.
unittest - mô-đun đạt tiêu chuẩn với tất cả các
mũi phân phối python - có thể chạy các thử nghiệm không đáng tin cậy nhất và có ít nồi hơi hơn.
pytest - cũng chạy các thử nghiệm không đáng tin cậy nhất , có ít bản tóm tắt hơn, báo cáo tốt hơn, nhiều tính năng bổ sung thú vị

Để có được sự so sánh tốt về tất cả những điều này, hãy đọc qua phần giới thiệu cho từng người tại http://pythontesting.net/start-here .
Ngoài ra còn có các bài viết mở rộng về đồ đạc, và nhiều hơn nữa ở đó.


35

Các tài liệu cho unittest sẽ là một nơi tốt để bắt đầu.

Ngoài ra, bây giờ hơi muộn, nhưng trong tương lai, hãy xem xét việc viết bài kiểm tra đơn vị trước hoặc trong chính dự án. Bằng cách đó, bạn có thể sử dụng chúng để kiểm tra khi bạn thực hiện và (về lý thuyết) bạn có thể sử dụng chúng làm kiểm tra hồi quy, để xác minh rằng các thay đổi mã của bạn không phá vỡ bất kỳ mã hiện có nào. Điều này sẽ cung cấp cho bạn đầy đủ lợi ích của việc viết các trường hợp thử nghiệm :)


Đó là nếu bạn muốn phát triển dựa trên thử nghiệm, đó không phải là điều xấu. Trong trường hợp của tôi, tôi đang xem mã hiện có và cố gắng hiểu nó bằng cách viết và điều chỉnh các bài kiểm tra để vượt qua, và điều đó đã khiến tôi bắt đầu unittest. Khi tôi hiểu rõ mọi thứ, tôi sẽ sử dụng nó nhiều hơn để phát triển, cũng như tăng số lượng các trường hợp thử nghiệm cho mỗi đơn vị.
icedwater

27

unittest đi kèm với thư viện tiêu chuẩn, nhưng tôi sẽ giới thiệu cho bạn nosetests .

" mũi kéo dài không đáng kể để làm cho thử nghiệm dễ dàng hơn. "

Tôi cũng muốn giới thiệu bạn pylint

" phân tích mã nguồn Python tìm kiếm các lỗi và dấu hiệu chất lượng kém. "


8

Như những người khác đã trả lời, đã muộn để viết bài kiểm tra đơn vị, nhưng không quá muộn. Câu hỏi là liệu mã của bạn có thể kiểm tra được hay không. Thật vậy, không dễ để đặt mã hiện tại vào thử nghiệm, thậm chí còn có một cuốn sách về điều này: Hoạt động hiệu quả với Mã kế thừa (xem các điểm chính hoặc PDF tiền thân ).

Bây giờ viết bài kiểm tra đơn vị hay không là cuộc gọi của bạn. Bạn chỉ cần nhận thức rằng nó có thể là một nhiệm vụ tẻ nhạt. Trước tiên, bạn có thể giải quyết vấn đề này để tìm hiểu thử nghiệm đơn vị hoặc xem xét kiểm tra chấp nhận bằng văn bản (từ đầu đến cuối) và bắt đầu viết thử nghiệm đơn vị khi bạn thay đổi mã hoặc thêm tính năng mới vào dự án.


2
+1 cho "Làm việc hiệu quả với Mã kế thừa". Đó là tất cả về mã không có bài kiểm tra.
David

3

nosetests là giải pháp tuyệt vời để thử nghiệm đơn vị ở trăn. Nó hỗ trợ cả testcase và doctests dựa trên không đáng tin cậy nhất và giúp bạn bắt đầu với nó chỉ với tập tin cấu hình đơn giản.


Liên kết nosetests của bạn đã lỗi thời. Có vẻ như địa điểm mới là: Nose.readthedocs.org/en/latest
odigity

1
Theo tài liệu trên github và trang web nosetest, nosenose2đang ở chế độ bảo trì. Tốt hơn hết là bắt đầu py.testvì nó có nhiều hỗ trợ hơn
alpha_989
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.