Tạo test case tự động python

Kiểm tra đơn vị là chìa khóa để phát triển mã chất lượng. Có rất nhiều thư viện và dịch vụ có sẵn mà bạn có thể sử dụng để kiểm tra hoàn hảo mã Python của mình. Tuy nhiên, thử nghiệm đơn vị “truyền thống” tốn nhiều thời gian và không có khả năng bao quát toàn bộ các trường hợp mà mã của bạn được cho là có thể xử lý. Trong bài đăng này, tôi sẽ chỉ cho bạn cách sử dụng kiểm tra dựa trên thuộc tính với Giả thuyết để tự động kiểm tra mã Python của bạn. Tôi cũng thảo luận về một số ưu điểm của việc sử dụng khung thử nghiệm dựa trên thuộc tính

Thử nghiệm tự động dựa trên tài sản

Kiểm tra đơn vị liên quan đến việc kiểm tra các thành phần riêng lẻ trong mã của bạn. Một bài kiểm tra đơn vị điển hình lấy dữ liệu đầu vào, chạy nó thông qua một đoạn mã và kiểm tra kết quả dựa trên một số kết quả mong đợi được xác định trước

Giả thuyết làm một cái gì đó khác nhau. Nó là một tài sản dựa trên (hoặc. khuôn khổ thử nghiệm “tạo ra”). Thử nghiệm dựa trên thuộc tính liên quan đến việc xác định các kỳ vọng chung về mã của bạn thay vì các ví dụ cụ thể. Ví dụ: nếu bạn có một số mã để tính tổng VAT cho một số giao dịch, bạn có thể xác định một loạt các số giả định với số tiền VAT tương ứng của chúng ($100 giao dịch → $xx. xx tax) và đưa nó vào thử nghiệm. Tuy nhiên, nếu bạn biết rằng VAT, giả sử là 20 phần trăm, thử nghiệm dựa trên tài sản sẽ xác minh rằng tổng VAT luôn là 20 phần trăm của tổng số tiền

Giả thuyết được xây dựng trên những nguyên tắc này. Nó tạo dữ liệu đầu vào tùy ý theo một số thông số kỹ thuật và sau đó đưa dữ liệu đó vào thử nghiệm. Hơn nữa, khi Giả thuyết tìm thấy một ví dụ gây ra lỗi xác nhận, nó sẽ cố gắng đơn giản hóa ví dụ đó và tìm trường hợp lỗi nhỏ nhất — một quy trình được gọi là “thu nhỏ”. Về cơ bản, giả thuyết sẽ cố gắng “phá vỡ” mã của bạn. Do đó, các thử nghiệm của bạn sẽ bao gồm một phần lớn hơn nhiều không gian miền của bạn với cùng một lượng mã. Và, bạn nhất định tìm thấy những trường hợp khó khăn mà bạn thậm chí chưa từng nghĩ tới

Bắt đầu với giả thuyết

Hãy xem Giả thuyết hoạt động như thế nào trong thực tế. Giả thuyết có ba thành phần chính. mã mà bạn đang thử nghiệm, các chiến lược xác định dữ liệu thử nghiệm của bạn và một chức năng kiểm tra mã của bạn bằng cách sử dụng các chiến lược

Giả sử chúng ta có một đoạn mã Python đơn giản (và không nhạy cảm) để chuyển đổi một giá trị float thành một số nguyên

Mã này có thuộc tính rõ ràng. kết quả phải luôn là một kiểu số nguyên

chiến lược

Để kiểm tra mã này, trước tiên chúng ta sẽ xác định một “chiến lược”. Một chiến lược xác định dữ liệu mà Giả thuyết tạo ra để thử nghiệm và cách các ví dụ được “đơn giản hóa”. Trong mã của chúng tôi, chúng tôi chỉ xác định các tham số của dữ liệu; . “co lại”) là nội bộ của Giả thuyết

Chúng ta sẽ bắt đầu với một chiến lược tạo ra giá trị float giữa 0. 0 và 10. 0 (bao gồm). Chúng tôi xác định điều này trong một tệp riêng có tên là data_strategies.py. Sử dụng một lớp dữ liệu cho việc này có vẻ như lạm dụng nó, nhưng nó rất hữu ích khi bạn đang làm việc với mã phức tạp hơn cần nhiều tham số khác nhau

Sử dụng lớp dữ liệu và Giả thuyết để xác định chiến lược dữ liệu của bạn

Rất nhiều thời gian có thể dành cho việc xác định các chiến lược, và trên thực tế, nó nên. Toàn bộ điểm của thử nghiệm dựa trên thuộc tính với Giả thuyết là bạn xác định các tham số mà dữ liệu được tạo ra, để sau đó bạn cho phép thử nghiệm tự động của mình thực hiện phép thuật của nó. Bạn càng dành nhiều thời gian cho việc này, bài kiểm tra của bạn sẽ càng tốt hơn (nghĩ rằng. “đầu tư cao;

Mang mã của bạn và các chiến lược của bạn lại với nhau. Chạy thử nghiệm với Giả thuyết

Sau khi xác định chiến lược của mình, chúng tôi thêm một đoạn mã nhỏ để chuyển các ví dụ do Giả thuyết tạo ra cho hàm của mình và khẳng định điều gì đó về kết quả được yêu cầu ("thuộc tính") của mã mà chúng tôi muốn kiểm tra. Đoạn mã dưới đây rút ra một giá trị float từ đối tượng lớp dữ liệu generated_data mà chúng tôi đã xác định trong tệp data_strategies.py ở trên, chuyển giá trị đó qua hàm convert_to_integer của chúng tôi và cuối cùng xác nhận rằng thuộc tính mong muốn được giữ

Xác định mô-đun thử nghiệm của bạn bằng Giả thuyết

Cấu hình giả thuyết. Cài đặt hữu ích

Trước khi chúng tôi chạy mô-đun thử nghiệm mà chúng tôi đã phát triển ở trên, hãy xem lại một số cấu hình mà chúng tôi có thể sử dụng để điều chỉnh Giả thuyết cho trường hợp sử dụng của chúng tôi. Giả thuyết đi kèm với một loạt các cài đặt. Các cài đặt này có thể được chuyển đến chức năng kiểm tra của bạn bằng cách sử dụng trình trang trí settings() hoặc bằng cách đăng ký các cài đặt trong một cấu hình và chuyển cấu hình đó bằng trình trang trí (xem mã ví dụ bên dưới). Một số cài đặt hữu ích bao gồm

  • max_examples. Kiểm soát số lượng ví dụ vượt qua được yêu cầu trước khi thử nghiệm kết thúc. Điều này hữu ích nếu bạn có một số hướng dẫn nội bộ về khối lượng thử nghiệm cần thiết để một đoạn mã mới vượt qua đánh giá. Theo nguyên tắc chung. mã của bạn càng phức tạp, bạn càng muốn chạy nhiều ví dụ hơn (Các tác giả của Giả thuyết lưu ý rằng họ đã cố gắng tìm ra các lỗi mới sau vài triệu ví dụ trong khi thử nghiệm SymPy);
  • deadline. Chỉ định thời gian một ví dụ riêng lẻ được phép thực hiện. Bạn sẽ muốn tăng mức này nếu bạn có mã rất phức tạp trong đó một ví dụ có thể mất nhiều thời gian hơn thời gian mặc định để chạy;
  • suppress_health_check. Cho phép bạn chỉ định bỏ qua “kiểm tra sức khỏe” nào. Hữu ích khi bạn đang làm việc với các tập dữ liệu lớn (HealthCheck.data_too_large) hoặc dữ liệu mất nhiều thời gian để tạo (HealthCheck.too_slow)

Hãy sử dụng các cài đặt này trong mô-đun thử nghiệm của chúng tôi. Với những dòng mã đơn giản này, giờ đây chúng ta có thể tiếp tục và đưa hàng nghìn ví dụ vào hàm của mình để xác minh rằng nó hoạt động như mong đợi. Bạn có thể chạy thử nghiệm từ thiết bị đầu cuối (_______10) hoặc nếu bạn sử dụng IDE như Pycharm, bằng cách chỉ định cấu hình pytest thích hợp cho mã của bạn

Sử dụng cài đặt Giả thuyết để kiểm tra mã Python dựa trên thuộc tínhUpping trò chơi của bạn. Sử dụng các chiến lược tổng hợp

Cho đến nay, các ví dụ tôi đã sử dụng rất đơn giản. Giả thuyết có thể xử lý các trường hợp thử nghiệm phức tạp hơn nhiều bằng cách sử dụng các chiến lược tổng hợp, như tên gợi ý, cho phép bạn kết hợp các chiến lược để tạo các ví dụ thử nghiệm. Vì vậy, hãy bắt đầu trò chơi của chúng ta và sử dụng Giả thuyết trong một bối cảnh phức tạp hơn

Giả sử bạn đã phát triển một đoạn mã để tính toán giá trị phần trăm của một mảng. Có rất nhiều thư viện Python sẽ làm điều này cho bạn, nhưng giả sử bạn đặc biệt đam mê phần trăm và chỉ muốn triển khai phần mềm của riêng bạn. Trong ví dụ này, mục đích của chúng tôi là so sánh giải pháp của chúng tôi với triển khai hiện tại. Với suy nghĩ này, chúng ta có thể định nghĩa hai thuộc tính đơn giản của mã này mà chúng ta có thể kiểm tra

  1. Thứ tự cung cấp mảng giá trị mà chúng tôi tính phần trăm được cung cấp không quan trọng đối với kết quả của nó;
  2. Đầu ra của hàm cần phải tương ứng với giá trị được tính toán với một thư viện khác, được chấp nhận rộng rãi (lưu ý rằng việc xác định giá trị này là "thuộc tính" hơi không điển hình - thông tin thêm về điều này trong phần cuối cùng của bài viết này)

Hãy bắt đầu với chức năng phần trăm của chúng tôi. Ở đây, chúng tôi triển khai một phiên bản sử dụng phép nội suy trung điểm. Hàm chấp nhận một mảng các giá trị số nguyên hoặc float (_______11), sắp xếp nó, xác định giá trị sàn và giá trần dựa trên phân vị đã chỉ định (generated_data2) và cuối cùng lấy điểm giữa của hai giá trị

Một hàm phần trăm đơn giản

Bây giờ, hãy chuyển sang chiến lược của chúng tôi, đó là định nghĩa về dữ liệu mà chúng tôi tạo để thử nghiệm. Ở đây, chúng tôi định nghĩa một hàm có tên là generated_data3 tạo ra một mảng các giá trị float có độ dài ngẫu nhiên (generated_data4), dựa trên phân phối được chọn ngẫu nhiên (generated_data5). Chúng tôi cũng tạo ra giá trị phần trăm mà chúng tôi muốn tính toán (generated_data2). Chúng tôi trả về các giá trị và phần trăm dưới dạng từ điển, vì vậy chúng tôi có thể dễ dàng truy cập các giá trị mà chúng tôi cần để kiểm tra. Lưu ý việc sử dụng trình trang trí generated_data7, chuyển đổi “một hàm trả về một ví dụ thành một hàm trả về một chiến lược tạo ra các ví dụ như vậy”

Xác định một chiến lược tổng hợp trong Giả thuyết

Cuối cùng, chúng ta có thể sử dụng chiến lược tổng hợp của mình trong mô-đun thử nghiệm. Trong mô-đun này, chúng tôi chỉ định cài đặt chiến lược của mình (generated_data8) và chỉ định chức năng chạy mã của riêng chúng tôi. Hàm generated_data9 kiểm tra việc đảo ngược thứ tự của mảng không ảnh hưởng đến đầu ra của hàm phân vị của chúng tôi và so sánh kết quả với triển khai NumPy. Với cấu hình mà chúng tôi đã thiết lập ở đây, chúng tôi chạy 10.000 ví dụ, mất khoảng 30 giây để hoàn thành trên máy tính xách tay năm tuổi của tôi

Ví dụ về mô-đun thử nghiệm sử dụng chiến lược tổng hợpTrước khi bạn bắt đầu thử nghiệm. Một lưu ý về thời điểm bạn nên và không nên sử dụng Giả thuyết

Trước khi bạn bắt đầu phát triển các bài kiểm tra đơn vị của riêng mình, có một số điều bạn cần lưu ý. Thử nghiệm dựa trên thuộc tính hoạt động tốt trong các ngữ cảnh cụ thể. Đó là một khung mạnh mẽ khi các thuộc tính của một đoạn mã được xác định rõ ràng và dễ dàng, nghĩa là “phần x trong mã của tôi cần tạo ra kết quả có thuộc tính y”. Khi việc xác định các điều kiện của câu lệnh “khẳng định” cũng phức tạp như mã mà bạn đang cố gắng kiểm tra, thì cuối cùng bạn sẽ triển khai lại mã hiện tại của mình

Có hai triển khai song song có thể phù hợp trong một số trường hợp, chẳng hạn như khi bạn đã tạo một đoạn mã mới hoặc triển khai lại thứ gì đó bằng một khung mới mà bạn cần so sánh với các triển khai hiện có, như minh họa trong ví dụ trên. Tuy nhiên, trong hầu hết các trường hợp, nó không phải là. bạn sẽ lãng phí thời gian và tài nguyên, và cuối cùng phải duy trì hai đoạn mã thực hiện chính xác cùng một việc

Ngay cả khi tự động hóa thử nghiệm của bạn, bạn nên chỉ đạo một khóa học trung gian giữa thử nghiệm đơn vị “truyền thống” và thử nghiệm dựa trên thuộc tính. Bạn sẽ muốn tránh làm cho các bài kiểm tra của mình quá nhiều “hộp đen” và đảm bảo rằng bạn bao gồm các trường hợp rõ ràng, đặc biệt là ở giai đoạn đầu của quá trình phát triển. Tạo ít nhất một vài kịch bản được hiểu rõ luôn được khuyến nghị. Và, việc kết hợp các trường hợp kiểm thử “thủ công” của riêng bạn với kiểm thử tự động sẽ là một chặng đường dài để cải thiện phạm vi kiểm thử của bạn và có thể cải thiện đáng kể mã của bạn

Cảm ơn vì đã đọc. Bạn muốn sử dụng công cụ Python nào để cải thiện chất lượng mã?

Hỗ trợ công việc của tôi. Nếu bạn thích bài viết này và bạn muốn hỗ trợ công việc của tôi, vui lòng cân nhắc trở thành thành viên trả phí của Phương tiện thông qua trang giới thiệu của tôi. Giá của đăng ký là như nhau nếu bạn đăng ký qua trang giới thiệu của tôi, nhưng tôi sẽ nhận được một phần phí thành viên hàng tháng của bạn

Nếu bạn thích bài viết này, đây là một số bài viết khác mà bạn có thể thưởng thức

Cách cải thiện kiểu mã Python của bạn với pre-commit hooks

Thực thi kiểu mã là chìa khóa để hợp lý hóa các quy trình phát triển và đây là cách tự động hóa nó

Trung bình. com

Tự động hóa thẻ phiên bản và nhật ký thay đổi cho các dự án Python của bạn

Hướng dẫn thực hành để tự động hóa các thẻ phiên bản và nhật ký thay đổi dựa trên lịch sử cam kết của dự án với commitizen

hướng tới khoa học dữ liệu. com

Đơn giản hóa mã Python của bạn. Tự động hóa phân tích độ phức tạp của mã với Wily

Đây là cách biến việc đánh giá độ phức tạp của mã thành một phần trong quy trình phát triển Python của bạn

hướng tới khoa học dữ liệu. com

Vui lòng đọc kỹ tuyên bố từ chối trách nhiệm này trước khi dựa vào bất kỳ nội dung nào trong các bài viết của tôi trên Medium. com

Làm cách nào để sử dụng pynguin trong Python?

Phát triển bằng PyCharm. .
Nhập pynguin vào PyCharm
Để thơ hỗ trợ cấu hình môi trường ảo. Nếu bạn sử dụng phiên bản PyCharm trước năm 2021. 3 , bạn phải cài hỗ trợ thơ như một plugin
Đặt trình chạy thử nghiệm mặc định thành pytest
Đặt định dạng DocString thành Google

Làm cách nào để kiểm tra tập lệnh Python?

1 Cách viết và kiểm tra chương trình Python .
Viết chương trình Python để nói “Xin chào, Thế giới. ”
Xử lý các đối số dòng lệnh bằng cách sử dụng argparse
Chạy thử nghiệm mã với Pytest
Tìm hiểu về $PATH
Sử dụng các công cụ như YAPF và Black để định dạng mã
Sử dụng các công cụ như Flake8 và Pylint để tìm các vấn đề trong mã

Các phương pháp hay nhất để thử nghiệm đơn vị Python là gì?

Kiểm tra đơn vị Python. Các phương pháp hay nhất nên tuân theo .
Tránh toàn cầu cấp mô-đun. .
Toàn cầu không phải lúc nào cũng xấu. .
Sử dụng tiêm phụ thuộc

Làm cách nào để kiểm tra các chức năng trong Python?

Trước tiên, bạn cần tạo một tệp thử nghiệm. Sau đó nhập mô-đun unittest, xác định lớp thử nghiệm kế thừa từ unittest. TestCase, và cuối cùng, viết một loạt các phương thức để kiểm tra tất cả các trường hợp hành vi của chức năng của bạn. Đầu tiên, bạn cần nhập một unittest và chức năng bạn muốn kiểm tra, formatted_name()