Thể dục
Trong bài tập này, bạn sẽ sử dụng pytest với cách để kiểm tra một hàm. Sau đó, bạn cập nhật một lớp học thử nghiệm để sử dụng một fixture thay vì một setup() và teardown() pháp. Sử phép đo phép đo và làm việc với thiết bị cố định cho phép bạn linh hoạt hơn khi tạo hoặc cập nhật kiểm tra.
Bước 1 - Thêm một tệp với các bài kiểm tra cho bài tập này
Tạo một tệp thử nghiệm mới có test_advanced.py và thêm mã sau đây:
def str_to_bool(string): if string.lower() in ['yes', 'y', '1']: return True elif string.lower() in ['no', 'n', '0']: return FalseHàm
str_to_bool()nhận một chuỗi làm dữ liệu đầu vào và tùy thuộc vào nội dung của nó, nó trả về mộtTruehoặcFalsetrị.Trong cùng một tệp, chắp thêm các kiểm tra cho hàm
str_to_bool()này. Sử dụngpytest.mark.parametrize()kiểm tra tất cả các giá trị đúng trước tiên:import pytest @pytest.mark.parametrize("string", ['Y', 'y', '1', 'YES']) def test_str_to_bool_true(string): assert str_to_bool(string) is TrueTiếp theo, chắp thêm một kiểm tra khác với giá trị false:
@pytest.mark.parametrize("string", ['N', 'n', '0', 'NO']) def test_str_to_bool_false(string): assert str_to_bool(string) is FalseBây giờ có hai kiểm tra bao gồm tất cả các đầu vào có thể cho cả hai giá
TruevàFalsetrả lại.
Ghi
Không phổ biến khi có các kiểm tra trong cùng một tệp với mã thực tế. Để đơn giản, các ví dụ trong bài tập này sẽ có mã thực tế trong cùng một tập tin. Trong thế giới thực Python dự án bạn sẽ thấy rằng các xét nghiệm được phân tách bởi các tập tin và thư mục từ mã nó đang thử nghiệm.
Bước 2 - Chạy các bài kiểm tra và khám phá báo cáo
Sau khi bạn thêm kiểm tra, bước tiếp theo là chạy thử pytest kiểm tra đầu ra. Sử dụng cờ tăng mức độ chi tiết (-v) để bạn có thể xem tất cả các giá trị đầu vào được coi là một kiểm tra riêng biệt.
$ pytest -v test_avanced.py
============================= test session starts ==============================
Python 3.9.6, pytest-6.2.5, py-1.11.0, pluggy-1.0.0
rootdir: /private
collected 8 items
test_advanced.py::test_str_to_bool_true[Y] PASSED [ 12%]
test_advanced.py::test_str_to_bool_true[y] PASSED [ 25%]
test_advanced.py::test_str_to_bool_true[1] PASSED [ 37%]
test_advanced.py::test_str_to_bool_true[YES] PASSED [ 50%]
test_advanced.py::test_str_to_bool_false[N] PASSED [ 62%]
test_advanced.py::test_str_to_bool_false[n] PASSED [ 75%]
test_advanced.py::test_str_to_bool_false[0] PASSED [ 87%]
test_advanced.py::test_str_to_bool_false[NO] PASSED [100%]
============================== 8 passed in 0.01s ===============================
Mặc dù bạn chỉ viết hai hàm kiểm tra, pytest đã có thể tạo tổng cộng tám bài kiểm tra nhờ hàm parametrize() này.
Bước 3 - Nối cổng kiểm tra hiện có vào một thiết bị cố định
Thêm kiểm tra dựa trên lớp mới vào tệp test_advanced.py này. Kiểm tra này nên sử dụng một
setup()vàteardown()tạo ra một tệp tạm thời với một số văn bản trên đó. Sau mỗi lần kiểm tra, tệp sẽ bị loại bỏ. Nó sẽ trông như thế này:import os class TestFile: def setup(self): with open("/tmp/done", 'w') as _f: _f.write("1") def teardown(self): try: os.remove("/tmp/done") except OSError: pass def test_done_file(self): with open("/tmp/done") as _f: contents = _f.read() assert contents == "1"Lớp kiểm tra này tạo ra một tệp, nhưng có vấn đề vì đường dẫn /tmp/ không đảm bảo có mặt trên mọi hệ thống.
Tạo một fixture sử dụng
pytesttmpdir()cố định để ghi vào tệp và trả về đường dẫn:import pytest @pytest.fixture def tmpfile(tmpdir): def write(): file = tmpdir.join("done") file.write("1") return file.strpath return writeThiết
tmpfile()cố định sử dụng thiết bịtmpdir()cố định của pytest, đảm bảo một tệp tạm thời hợp lệ được làm sạch sau khi kiểm tra xong.Cập nhật lớp
TestFilesao cho nó sử dụng công cụ thay vì các phương pháp trợ giúp:class TestFile: def test_f(self, tmpfile): path = tmpfile() with open(path) as _f: contents = _f.read() assert contents == "1"Lớp kiểm tra này giờ đây có thể đảm bảo rằng tệp tạm thời được tạo và có nội dung thích hợp để xác nhận hoạt động.
Kiểm tra công việc của bạn
Đến bây giờ, bạn sẽ có một tệp Python có tên test_advanced.py với mã sau:
- Hàm
str_to_bool()chấp nhận chuỗi và trả về giá trị boolean tùy thuộc vào nội dung của chuỗi. - Hai kiểm tra parametrized cho hàm
str_to_bool(), một kiểm tra các giá trịTruevà một kiểm tra các giáFalsetrị. - Một bản
pytestsửa lỗi tùy chỉnh sử dụngtmpdir()cố định để tạo tệp được thực hiện với một số nội dung. - Lớp kiểm tra sử dụng trình sửa lỗi
tmpfile()chỉnh để tạo tệp.
Tất cả các xét nghiệm sẽ vượt qua khi chạy chúng trong thiết bị đầu cuối, không có lỗi.