Làm cách nào để tắt kiểm tra bằng pytest?


86

Giả sử tôi có một loạt các bài kiểm tra:

def test_func_one():
    ...

def test_func_two():
    ...

def test_func_three():
    ...

Có trình trang trí hoặc thứ gì đó tương tự mà tôi có thể thêm vào các chức năng để ngăn không cho pytestchạy thử nghiệm đó không? Kết quả có thể trông giống như ...

@pytest.disable()
def test_func_one():
    ...

def test_func_two():
    ...

def test_func_three():
    ...

Câu trả lời:


133

Pytest có trình trang trí bỏ qua và bỏ qua, tương tự như mô-đun đơn nhất Python (sử dụng skipskipIf), có thể được tìm thấy trong tài liệu tại đây .

Ví dụ từ liên kết có thể được tìm thấy ở đây:

@pytest.mark.skip(reason="no way of currently testing this")
def test_the_unknown():
    ...

import sys
@pytest.mark.skipif(sys.version_info < (3,3),
                    reason="requires python3.3")
def test_function():
    ...

Ví dụ đầu tiên luôn bỏ qua bài kiểm tra, ví dụ thứ hai cho phép bạn bỏ qua các bài kiểm tra có điều kiện (tuyệt vời khi các bài kiểm tra phụ thuộc vào nền tảng, phiên bản thực thi hoặc các thư viện tùy chọn.

Ví dụ: nếu tôi muốn kiểm tra xem ai đó đã cài đặt thư viện gấu trúc để kiểm tra.

import sys
try:
    import pandas as pd
except ImportError:
    pass

@pytest.mark.skipif('pandas' not in sys.modules,
                    reason="requires the Pandas library")
def test_pandas_function():
    ...

Có điều gì giống với sự tao nhã .skipmà Mocha (Node.js) có không? it('tests something'...)-> it.skip('tests something'...)sẽ vô hiệu hóa thử nghiệm cụ thể đó. Nó cũng có điều ngược lại tiện dụng: .onlysẽ chỉ chạy thử nghiệm đó và không chạy gì khác.
Juha Untinen

Ý tôi là, về onlyphần, bạn có thể làm điều đó thông qua dòng lệnh hoặc bất cứ thứ gì bạn sử dụng để khởi tạo trình chạy thử nghiệm: stackoverflow.com/a/36539692/4131059 Về phần itit.skip, tôi tin rằng chức năng ở đây bao gồm đầy đủ điều đó.
Alexander Huszagh

21

Người skiptrang trí sẽ thực hiện công việc:

@pytest.mark.skip(reason="no way of currently testing this")
def test_func_one():
    # ...

( reasonđối số là tùy chọn, nhưng bạn nên chỉ rõ lý do tại sao thử nghiệm bị bỏ qua).

Nó cũng skipif()cho phép vô hiệu hóa kiểm tra nếu một số điều kiện cụ thể được đáp ứng.


Các trình trang trí này có thể được áp dụng cho các phương thức, hàm hoặc lớp.

Để bỏ qua tất cả các thử nghiệm trong một mô-đun , hãy xác định một pytestmarkbiến toàn cục:

# test_module.py
pytestmark = pytest.mark.skipif(...)

10

Tôi không chắc liệu nó có bị phản đối hay không, nhưng bạn cũng có thể sử dụng pytest.skiphàm bên trong một bài kiểm tra:

def test_valid_counting_number():
     number = random.randint(1,5)
     if number == 5:
         pytest.skip('Five is right out')
     assert number <= 3

2
đến nhờ sự trợ giúp của pytest, ở lại để tham khảo
Uzebeckatrente

nó tham khảo những gì. Tôi phải biết
XChikuX


Tôi e rằng điều này đã tốt trước thời của tôi. Nhưng, tôi rất vui vì tôi đã biết nó bây giờ.
XChikuX

6

Bạn cũng có thể muốn chạy thử nghiệm ngay cả khi bạn nghi ngờ rằng thử nghiệm đó sẽ thất bại. Đối với trường hợp như vậy, https://docs.pytest.org/en/latest/skipping.html đề xuất sử dụng decorator @ pytest.mark.xfail

@pytest.mark.xfail
def test_function():
    ...

Trong trường hợp này, Pytest vẫn sẽ chạy thử nghiệm của bạn và cho bạn biết nếu nó vượt qua hay không, nhưng sẽ không phàn nàn và phá vỡ bản dựng.


2

Nếu bạn muốn bỏ qua bài kiểm tra nhưng không phải mã cứng một điểm đánh dấu, tốt hơn hãy sử dụng biểu thức từ khóa để thoát khỏi nó.

pytest test/test_script.py -k 'not test_func_one'

1

Bạn có thể đánh dấu một bài kiểm tra bằng skipskipifdecorator khi bạn muốn bỏ qua một bài kiểm tra trong pytest.

Bỏ qua một bài kiểm tra

@pytest.mark.skip(reason="no way of currently testing this")
def test_func_one():
    ...

Cách đơn giản nhất để bỏ qua một bài kiểm tra là đánh dấu nó bằng người skiptrang trí. Bài kiểm tra này có thể được vượt qua một tùy chọn reason.

Cũng có thể bỏ qua thứ bậc trong quá trình thực thi hoặc thiết lập thử nghiệm bằng cách gọi pytest.skip(reason)hàm. Điều này hữu ích khi không thể đánh giá điều kiện bỏ qua trong thời gian nhập.

def test_func_one():
    if not valid_config():
        pytest.skip("unsupported configuration")

Bỏ qua một bài kiểm tra dựa trên một điều kiện

@pytest.mark.skipif(sys.version_info < (3, 6), reason="requires python3.6 or higher")
def test_func_one():
    ...

Nếu bạn muốn bỏ qua dựa trên một điều kiện thì bạn có thể sử dụng skipifthay thế. Trong ví dụ trước, hàm kiểm tra bị bỏ qua khi chạy trên trình thông dịch sớm hơn Python3.6.

Cuối cùng, nếu bạn muốn bỏ qua một bài kiểm tra vì bạn chắc chắn rằng nó không đạt, bạn cũng có thể cân nhắc sử dụng xfailđiểm đánh dấu để cho biết rằng bạn mong đợi một bài kiểm tra không đạt.

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.