Làm quen với việc viết mã kiểm tra và chạy song song mã này hiện được coi là một thói quen tốt. Được sử dụng một cách khôn ngoan, phương pháp này giúp xác định ý định mã của bạn chính xác hơn và có kiến trúc tách biệt hơn
Một số quy tắc kiểm thử chung
- Một đơn vị thử nghiệm nên tập trung vào một chức năng nhỏ và chứng minh nó đúng
- Mỗi đơn vị thử nghiệm phải hoàn toàn độc lập. Mỗi thử nghiệm phải có khả năng chạy một mình và cả trong bộ thử nghiệm, bất kể thứ tự mà chúng được gọi. Hàm ý của quy tắc này là mỗi thử nghiệm phải được tải với một tập dữ liệu mới và có thể phải thực hiện một số thao tác dọn dẹp sau đó. Điều này thường được xử lý bằng phương pháp
def square[x]: """Return the square of x. >>> square[2] 4 >>> square[-2] 4 """ return x * x if __name__ == '__main__': import doctest doctest.testmod[]
2 vàdef square[x]: """Return the square of x. >>> square[2] 4 >>> square[-2] 4 """ return x * x if __name__ == '__main__': import doctest doctest.testmod[]
3 - Cố gắng hết sức để thực hiện các bài kiểm tra chạy nhanh. Nếu một bài kiểm tra đơn lẻ cần nhiều hơn một vài mili giây để chạy, quá trình phát triển sẽ bị chậm lại hoặc các bài kiểm tra sẽ không được chạy thường xuyên như mong muốn. Trong một số trường hợp, các bài kiểm tra không thể nhanh vì chúng cần một cấu trúc dữ liệu phức tạp để hoạt động và cấu trúc dữ liệu này phải được tải mỗi khi chạy thử nghiệm. Giữ các bài kiểm tra nặng hơn này trong một bộ kiểm tra riêng biệt được chạy bởi một số tác vụ đã lên lịch và chạy tất cả các bài kiểm tra khác thường xuyên nếu cần
- Tìm hiểu các công cụ của bạn và tìm hiểu cách chạy thử nghiệm đơn lẻ hoặc trường hợp thử nghiệm. Sau đó, khi phát triển một chức năng bên trong mô-đun, hãy chạy thử nghiệm chức năng này thường xuyên, lý tưởng nhất là chạy tự động khi bạn lưu mã
- Luôn chạy bộ thử nghiệm đầy đủ trước phiên viết mã và chạy lại sau. Điều này sẽ giúp bạn tự tin hơn rằng bạn đã không vi phạm bất cứ điều gì trong phần còn lại của mã
- Bạn nên triển khai hook chạy tất cả các thử nghiệm trước khi đẩy mã vào kho lưu trữ dùng chung
- Nếu bạn đang ở giữa một phiên phát triển và phải gián đoạn công việc của mình, bạn nên viết một bài kiểm tra đơn vị bị hỏng về những gì bạn muốn phát triển tiếp theo. Khi quay lại làm việc, bạn sẽ có một con trỏ đến nơi bạn đã làm và quay lại đúng hướng nhanh hơn
- Bước đầu tiên khi bạn gỡ lỗi mã của mình là viết một bài kiểm tra mới xác định lỗi. Mặc dù không phải lúc nào cũng có thể thực hiện được, nhưng những bài kiểm tra bắt lỗi đó là một trong những đoạn mã có giá trị nhất trong dự án của bạn
- Sử dụng tên dài và mô tả cho các chức năng thử nghiệm. Hướng dẫn về phong cách ở đây hơi khác so với hướng dẫn về mã đang chạy, trong đó các tên ngắn thường được ưu tiên. Lý do là các chức năng kiểm tra không bao giờ được gọi một cách rõ ràng.
def square[x]: """Return the square of x. >>> square[2] 4 >>> square[-2] 4 """ return x * x if __name__ == '__main__': import doctest doctest.testmod[]
4 hoặc thậm chídef square[x]: """Return the square of x. >>> square[2] 4 >>> square[-2] 4 """ return x * x if __name__ == '__main__': import doctest doctest.testmod[]
5 đều ổn khi chạy mã, nhưng trong mã kiểm tra, bạn sẽ có các tên nhưdef square[x]: """Return the square of x. >>> square[2] 4 >>> square[-2] 4 """ return x * x if __name__ == '__main__': import doctest doctest.testmod[]
6,def square[x]: """Return the square of x. >>> square[2] 4 >>> square[-2] 4 """ return x * x if __name__ == '__main__': import doctest doctest.testmod[]
7. Các tên chức năng này được hiển thị khi thử nghiệm không thành công và phải mang tính mô tả nhất có thể - Khi xảy ra sự cố hoặc phải thay đổi và nếu mã của bạn có một bộ kiểm tra tốt, bạn hoặc những người bảo trì khác sẽ chủ yếu dựa vào bộ kiểm tra để khắc phục sự cố hoặc sửa đổi một hành vi nhất định. Do đó, mã kiểm tra sẽ được đọc nhiều bằng hoặc thậm chí nhiều hơn mã đang chạy. Một bài kiểm tra đơn vị có mục đích không rõ ràng không hữu ích lắm trong trường hợp này
- Một cách sử dụng khác của mã thử nghiệm là để giới thiệu cho các nhà phát triển mới. Khi ai đó sẽ phải làm việc trên cơ sở mã, việc chạy và đọc mã kiểm tra liên quan thường là điều tốt nhất họ có thể làm để bắt đầu. Họ sẽ hoặc nên phát hiện ra những điểm nóng, nơi phát sinh nhiều khó khăn nhất và các trường hợp khó khăn nhất. Nếu họ phải thêm một số chức năng, thì bước đầu tiên là thêm thử nghiệm để đảm bảo rằng chức năng mới chưa phải là đường dẫn hoạt động chưa được cắm vào giao diện
Những thứ cơ bản¶
đơn vị nhất¶
def square[x]: """Return the square of x. >>> square[2] 4 >>> square[-2] 4 """ return x * x if __name__ == '__main__': import doctest doctest.testmod[]8 là mô-đun thử nghiệm đi kèm pin trong thư viện chuẩn Python. API của nó sẽ quen thuộc với bất kỳ ai đã sử dụng bất kỳ loạt công cụ JUnit/nUnit/CppUnit nào
Tạo các trường hợp thử nghiệm được thực hiện bằng cách phân lớp
def square[x]: """Return the square of x. >>> square[2] 4 >>> square[-2] 4 """ return x * x if __name__ == '__main__': import doctest doctest.testmod[]9
________số 8
Kể từ Python 2. 7 unittest cũng bao gồm các cơ chế khám phá thử nghiệm của riêng nó
unittest trong tài liệu thư viện chuẩn
Tiến sĩ¶
Mô-đun
$ pip install pytest
0 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 trong tài liệu, sau đó thực thi các phiên đó để xác minh rằng chúng hoạt động chính xác như được hiển thịDoctests có trường hợp sử dụng khác với các bài kiểm tra đơn vị thích hợp. chúng thường ít chi tiết hơn và không nắm bắt được các trường hợp đặc biệt hoặc các lỗi hồi quy khó hiểu. Chúng hữu ích như một tài liệu rõ ràng về các trường hợp sử dụng chính của một mô-đun và các thành phần của nó. Tuy nhiên, doctests sẽ tự động chạy mỗi khi bộ kiểm tra đầy đủ chạy
Một doctest đơn giản trong một chức năng
def square[x]: """Return the square of x. >>> square[2] 4 >>> square[-2] 4 """ return x * x if __name__ == '__main__': import doctest doctest.testmod[]
Khi chạy mô-đun này từ dòng lệnh như trong
$ pip install pytest
1, các tài liệu sẽ chạy và khiếu nại nếu có bất kỳ điều gì không hoạt động như được mô tả trong các tài liệuCông cụ¶
py. kiểm tra¶
py. test là một giải pháp thay thế không có sẵn cho mô-đun unittest tiêu chuẩn của Python
$ pip install pytest
Mặc dù là một công cụ kiểm tra đầy đủ tính năng và có thể mở rộng, nhưng nó có một cú pháp đơn giản. Tạo một bộ thử nghiệm dễ dàng như viết một mô-đun với một vài chức năng
def square[x]: """Return the square of x. >>> square[2] 4 >>> square[-2] 4 """ return x * x if __name__ == '__main__': import doctest doctest.testmod[]3
và sau đó chạy py. lệnh kiểm tra
def square[x]: """Return the square of x. >>> square[2] 4 >>> square[-2] 4 """ return x * x if __name__ == '__main__': import doctest doctest.testmod[]4
ít công việc hơn nhiều so với yêu cầu đối với chức năng tương đương với mô-đun unittest
py. kiểm tra
Giả thuyết¶
Giả thuyết là một thư viện cho phép bạn viết các bài kiểm tra được tham số hóa bởi một nguồn ví dụ. Sau đó, nó tạo ra các ví dụ đơn giản và dễ hiểu khiến bài kiểm tra của bạn không thành công, cho phép bạn tìm thấy nhiều lỗi hơn với ít công việc hơn
def square[x]: """Return the square of x. >>> square[2] 4 >>> square[-2] 4 """ return x * x if __name__ == '__main__': import doctest doctest.testmod[]5
Ví dụ: kiểm tra danh sách float sẽ thử nhiều ví dụ, nhưng báo cáo ví dụ tối thiểu của từng lỗi [loại và vị trí ngoại lệ được phân biệt]
def square[x]: """Return the square of x. >>> square[2] 4 >>> square[-2] 4 """ return x * x if __name__ == '__main__': import doctest doctest.testmod[]6
def square[x]: """Return the square of x. >>> square[2] 4 >>> square[-2] 4 """ return x * x if __name__ == '__main__': import doctest doctest.testmod[]7
Giả thuyết là thực tế cũng như rất mạnh mẽ và thường sẽ tìm thấy các lỗi thoát khỏi tất cả các hình thức thử nghiệm khác. Nó tích hợp tốt với py. thử nghiệm và tập trung mạnh vào khả năng sử dụng trong cả các tình huống đơn giản và nâng cao
giả thuyết
độc tố¶
tox là một công cụ để tự động hóa việc quản lý và kiểm tra môi trường thử nghiệm đối với nhiều cấu hình trình thông dịch
def square[x]: """Return the square of x. >>> square[2] 4 >>> square[-2] 4 """ return x * x if __name__ == '__main__': import doctest doctest.testmod[]8
tox cho phép bạn định cấu hình ma trận kiểm tra đa thông số phức tạp thông qua tệp cấu hình kiểu INI đơn giản
chất độc
chế nhạo¶
$ pip install pytest
2 là một thư viện để thử nghiệm bằng Python. Kể từ Python 3. 3, nó có sẵn trong thư viện tiêu chuẩnĐối với các phiên bản Python cũ hơn
def square[x]: """Return the square of x. >>> square[2] 4 >>> square[-2] 4 """ return x * x if __name__ == '__main__': import doctest doctest.testmod[]0
Nó cho phép bạn thay thế các phần của hệ thống đang thử nghiệm bằng các đối tượng giả và đưa ra xác nhận về cách chúng đã được sử dụng
Ví dụ: bạn có thể vá một phương thức
def square[x]: """Return the square of x. >>> square[2] 4 >>> square[-2] 4 """ return x * x if __name__ == '__main__': import doctest doctest.testmod[]0
Để mô phỏng các lớp hoặc đối tượng trong một mô-đun đang được kiểm tra, hãy sử dụng trình trang trí
$ pip install pytest
3. Trong ví dụ dưới đây, một hệ thống tìm kiếm bên ngoài được thay thế bằng một mô hình luôn trả về cùng một kết quả [nhưng chỉ trong khoảng thời gian thử nghiệm]