Tập tin csv kiểm tra đơn vị python

Khi làm việc với mã cấp sản xuất, việc kiểm tra trở nên quan trọng như chính mã đó. Nếu bạn đã từng đóng góp cho bất kỳ dự án phần mềm đáng chú ý nào, bạn sẽ biết rằng ngay cả những thay đổi nhỏ cũng yêu cầu bạn viết bài kiểm tra để đảm bảo mã của bạn không bị hỏng. Trong một bài viết khác, chúng tôi đã xem xét những kiến ​​thức cơ bản về kiểm tra mã của bạn bằng thư viện unittest. Ở đây chúng ta sẽ xem xét thư viện thử nghiệm Python được sử dụng rộng rãi khác, pytest. Làm việc với thư viện pytest có thể nhanh chóng trở nên khó hiểu và đôi khi thậm chí không phải Pythonic. Chúng tôi sẽ xem xét một số phần quan trọng của thư viện cũng như chức năng có thể gây nhầm lẫn cho người dùng mới

Tham số hóa chức năng kiểm tra

Có nhiều tình huống khi chúng ta có thể muốn kiểm tra nhiều đầu vào cho cùng một chức năng kiểm tra. Thông thường, điều này sẽ được thực hiện bằng cách sử dụng vòng lặp for lặp qua một số vòng lặp. Trong pytest, chúng ta có thể thực hiện điều này một cách hoàn toàn bằng cách trang trí chức năng kiểm tra của chúng ta với trình trang trí @pytest.mark.parametrize

Tham số hóa một hàm

Sử dụng trình trang trí ở trên, chúng tôi thấy rằng chúng tôi đang trang trí chức năng test_numeric_values. Đầu tiên, trình trang trí nhận đầu vào chuỗi biểu thị tên đối số. Trong ví dụ của chúng ta, đây sẽ là my_intmy_float. Tham số tiếp theo là một bộ giá trị mà chúng tôi muốn gán cho tên đối số của mình. Ở đây chúng tôi có hai danh sách, [1, 1.1][2, 2.2], ngụ ý rằng chức năng kiểm tra này sẽ chạy hai lần; . Với thiết lập như thế này, chúng tôi loại bỏ nhu cầu lặp thủ công qua một lần lặp đầu vào. Cũng có thể tham số hóa một lớp, làm cho trình trang trí parametrize có sẵn cho mọi phương thức trong lớp đó. Chúng tôi thấy một ví dụ chung về điều này trong đoạn mã dưới đây

đoạn dưới đây. Tham số hóa một lớp

Sử dụng đồ đạc

Sử dụng lịch thi đấu cho phép chúng tôi thiết lập môi trường thử nghiệm trước khi chạy thử nghiệm thực tế. Lịch thi đấu là một loại môi trường mà chúng tôi sử dụng để đảm bảo rằng chúng tôi có mọi thứ cần thiết để chạy thử nghiệm thành công. Pytest có công cụ trang trí vật cố định riêng cho mục đích này. Giả sử chúng ta có một nhóm nhiệm vụ cần thực hiện trước khi chạy thử nghiệm. Đây có thể là đăng nhập vào máy chủ hoặc lấy một số dữ liệu. Với sự trợ giúp của một vật cố định, chúng tôi có thể tự động chạy các hoạt động như thế này trước khi chạy thử nghiệm của mình

Sử dụng vật cố định để đọc trong tệp CSV trước khi kiểm tra

Ở trên, chúng ta thấy chức năng grab_test_filevới trang trí @pytest.fixture. Lịch thi đấu đọc trong tệp CSV trước khi chạy thử nghiệm. Khi chúng tôi có vật cố định của mình, chúng tôi muốn sử dụng nó làm tham số trong một trong các chức năng kiểm tra của chúng tôi. Đây chính xác là chức năng của hàm @pytest.mark.parametrize0. Lịch thi đấu sẽ không chạy cho mọi thử nghiệm đơn lẻ, chỉ những thử nghiệm mà chúng tôi đặt nó làm tham số. Thiết lập mã của chúng tôi như thế này giúp dễ dàng sử dụng lại các đồ đạc này bất cứ khi nào chúng tôi cần chúng

conftest. tập tin py

Việc sử dụng (và sự tồn tại) của conftest. py là một bí ẩn đối với tôi khi tôi lần đầu tiên bắt đầu sử dụng pytest để kiểm tra mã của mình. Tôi sẽ thấy một số thử nghiệm với các tham số không được xác định trong cùng một tệp cũng như không được nhập rõ ràng từ một tệp khác. Nó rất bất thường và tôi phải mất một thời gian để hiểu đầy đủ. Chỉ khi tôi nhận ra rằng conftest. py đã tồn tại mà cuối cùng tôi đã hiểu các tham số này đến từ đâu

Một bài kiểm tra đơn giản để kiểm tra xem đầu vào có phải là một chuỗi không

Giả sử chúng ta có một chức năng kiểm tra được gọi là @pytest.mark.parametrize1. Chúng tôi thấy có gì đó bất thường ở đây. Chúng tôi đang chuyển tham số @pytest.mark.parametrize2 nhưng nó không được xác định trong tệp thử nghiệm của chúng tôi. Vậy nó ở đâu? . Chúng tôi có thể có một tệp riêng tên là@pytest.mark.parametrize3 trong thư mục thử nghiệm của chúng tôi với đoạn mã sau

Bằng cách tạo tệp @pytest.mark.parametrize3 và thêm vào phần cố định này, giờ đây chúng tôi sẽ có thể truy cập tệp đó trên bất kỳ tệp thử nghiệm nào của chúng tôi mà không cần nhập. Việc có sẵn các thiết bị cố định này trên toàn cầu cho phép chúng tôi tách các thiết bị cố định khỏi các chức năng thử nghiệm thực tế của mình. Mặc dù nó có thể không phải là cách rõ ràng nhất để sử dụng đồ đạc, nhưng nó giữ cho mã của chúng tôi có tổ chức hơn rất nhiều

Bạn cũng có thể nhận thấy rằng chúng tôi đã sử dụng một tham số có tên là @pytest.mark.parametrize6 trong lịch thi đấu của mình. @pytest.mark.parametrize6 là một vật cố định đặc biệt trong pytest cung cấp cho chúng tôi thông tin về chức năng kiểm tra của chúng tôi. Khi chúng tôi trả về thuộc tính @pytest.mark.parametrize8 trên dòng 5, nó sẽ trả về các giá trị mà chúng tôi đã truyền trong đối số @pytest.mark.parametrize9 của trình trang trí của chúng tôi. Vì vậy, đối với ví dụ cụ thể này, hàm @pytest.mark.parametrize1 sẽ chạy hai lần, vì đối số cố định @pytest.mark.parametrize2 có danh sách hai phần tử làm đối số @pytest.mark.parametrize9 của nó

chức năng chế nhạo

Để sử dụng mock với pytest, chúng ta có thể sử dụng thư viện pytest-mock. Nhưng chính xác thì giả là gì? . Nếu chúng tôi phải chạy chức năng đó nhiều lần trong quá trình kiểm tra, toàn bộ quá trình sẽ mất nhiều thời gian để hoàn thành. Thay vì chạy chức năng này trong thử nghiệm, chúng ta có thể tạo một đối tượng giả bắt chước nó mà không thực sự chạy tính toán đắt tiền. Bằng cách này, chúng tôi đơn giản hóa thử nghiệm của mình và tiết kiệm thời gian. Tạo một bản mô phỏng cho phép chúng ta bắt chước hành vi của một hằng số, hàm, lớp hoặc bất kỳ đối tượng Python nào khác. Hãy xem một ví dụ để minh họa rõ hơn điều này

Giả sử chúng ta đang thử nghiệm một mô-đun và chúng ta phải thực hiện một số thao tác tổng hợp dữ liệu phức tạp trên một tập dữ liệu khổng lồ để có thể hoàn thành mô-đun đó

Một mô-đun có lời gọi hàm đắt tiền

Trong ví dụ này, chúng ta có hàm test_numeric_values3 mất 100 giây để hoàn thành. Chúng ta cũng có test_numeric_values4 gọi hàm test_numeric_values3. Nếu chúng tôi muốn kiểm tra điều này, sẽ mất 100 giây mỗi lần. Tuy nhiên, chúng tôi chỉ quan tâm đến những gì chức năng sẽ xuất ra sau khi nó chạy và chúng tôi không thực sự quan tâm nếu nó thực sự chạy. Chúng ta có thể sử dụng một đối tượng giả để vá hành vi của nó thay vì thực sự chạy nó

Chế nhạo giá trị trả về của lệnh gọi hàm đắt tiền

Trong chức năng test_numeric_values6 của chúng tôi, chúng tôi đã gọi test_numeric_values7. Chức năng này cho phép chúng tôi vá các thuộc tính của bất cứ thứ gì chúng tôi chuyển vào nó. Chúng tôi đã vượt qua vào test_numeric_values8. Đây là chức năng đắt tiền mà chúng ta đã thấy trong đoạn mã trước. Chúng tôi đã chế nhạo thuộc tính test_numeric_values9 của nó, đặt nó bằng 12. Trong khi thử nghiệm, điều này tương đương với việc chạy hàm đắt tiền và trả về giá trị 12. Chúng tôi vừa tiết kiệm cho mình 100 giây thời gian thử nghiệm

Cũng có thể sử dụng mô phỏng kết hợp với các khái niệm khác mà chúng ta đã học trước đây. Giả sử chúng ta cần chạy hàm test_numeric_values3 đó trên nhiều bài kiểm tra thay vì chỉ một bài kiểm tra?

Đặt một đối tượng giả làm vật cố định để sử dụng trong nhiều chức năng kiểm tra

Ở đây, chúng tôi đã chuyển cuộc gọi test_numeric_values7 thành lịch thi đấu của riêng mình với @pytest.fixture. Thay vì gọi nó bên trong mỗi chức năng kiểm tra của chúng tôi như trước đây, chúng tôi chỉ có thể bao gồm tên lịch thi đấu làm tham số trong các chức năng của mình để có thể sử dụng nó tự động

Phần kết luận

Chúng tôi đã thảo luận về một số chức năng quan trọng có sẵn trong thư viện pytest. Chúng tôi đã xem xét cách tham số hóa các chức năng kiểm tra để dễ dàng chạy thử nghiệm với nhiều đầu vào/bộ đầu vào khác nhau. Điều này giúp loại bỏ nhu cầu sử dụng các vòng lặp rườm rà để kiểm tra. Tiếp theo, chúng tôi đã xem xét các thiết bị cố định và cách chúng tôi có thể sử dụng chúng để thiết lập môi trường thử nghiệm trước khi chạy thử nghiệm. Chúng tôi cũng đã khám phá tệp @pytest.mark.parametrize3 cho phép chúng tôi đặt các đối tượng thử nghiệm có sẵn trên toàn cầu để chúng tôi sử dụng trong bất kỳ mô-đun thử nghiệm nào của chúng tôi. Cuối cùng, chúng tôi đã xem xét cách mô phỏng các đối tượng để thử nghiệm. Trong trường hợp của chúng tôi, chúng tôi đã xem xét cụ thể các chức năng mô phỏng tốn kém về mặt tính toán để chạy nhiều lần. Tôi hy vọng phần tổng quan này cho phép bạn đưa việc kiểm tra mã của mình lên một tầm cao mới

Làm cách nào để đọc tệp CSV trong JUnit?

Đọc dữ liệu thử nghiệm từ tệp CSV bằng JUnit .
Tạo một lớp thử nghiệm JUnit mới sử dụng trình chạy được tham số hóa bằng cách sử dụng. .
Thêm phương thức testData() sẽ trả về dữ liệu thử nghiệm từ tệp CSV dưới dạng tập hợp. .
Thêm phương thức getTestData() đọc tệp CSV và trả về dữ liệu trong bộ sưu tập

Là pytest tốt hơn so với unittest?

Đầu ra ở trên cho chúng ta biết rằng hai bài kiểm tra đã được chạy trong 0. 001 và một thất bại, nhưng không nhiều. Cuối cùng, pytest cung cấp nhiều thông tin phản hồi hơn , rất hữu ích khi đến lúc gỡ lỗi. Nói chung, cả pytest và unittest đều là những công cụ tuyệt vời để sử dụng để kiểm tra tự động trong Python.