Tạm thời tắt các bài kiểm tra đơn vị Python riêng lẻ


128

Làm thế nào các bài kiểm tra đơn vị riêng lẻ có thể tạm thời bị vô hiệu hóa khi sử dụng unittestmô-đun trong Python?

Câu trả lời:


229

Các phương thức kiểm tra riêng lẻ hoặc các lớp đều có thể bị vô hiệu hóa bằng cách sử dụng unittest.skiptrang trí.

@unittest.skip("reason for skipping")
def test_foo():
    print('This is foo test case.')


@unittest.skip  # no reason needed
def test_bar():
    print('This is bar test case.')

Đối với các tùy chọn khác, hãy xem tài liệu để bỏ qua các bài kiểm tra và các thất bại dự kiến .


9
Trong Python 3, câu trả lời của Akif bên dưới có @unittest.SkipTesttác dụng và không@unittest.skip
cuộc sống

7
Tôi đang sử dụng Python 3.6.1 và @unittest.skipcũng hoạt động tốt.
Pete

2
@Pete, trong Python 3.4.0, @unittest.skipkhông hoạt động.
cuộc sống

Làm thế nào để ngăn chặn các lớp trẻ bị bỏ qua?
reubenjohn

Chú thích sẽ chỉ được áp dụng cho một phương pháp thử nghiệm duy nhất. Bạn có dự định có một lớp cha với các phương thức kiểm tra và chỉ một số lớp con có phương thức bị vô hiệu hóa không? Tôi tưởng tượng điều đó là có thể, mặc dù bạn có thể cần thiết kế các lớp cha / con một cách thích hợp. Bạn có thể đánh vần kịch bản bạn đang cố gắng giải quyết bằng một ví dụ đồ chơi không?
yoni

26

Bạn có thể sử dụng các công cụ trang trí để vô hiệu hóa kiểm tra có thể bao bọc chức năng và ngăn kiểm tra đơn vị googletest hoặc python để chạy testcase.

def disabled(f):
    def _decorator():
        print f.__name__ + ' has been disabled'
    return _decorator

@disabled
def testFoo():
    '''Foo test case'''
    print 'this is foo test case'

testFoo()

Đầu ra:

testFoo has been disabled

11

Phiên bản mới nhất (2.7 - chưa được phát hành) hỗ trợ bỏ qua / vô hiệu hóa thử nghiệm như vậy . Bạn chỉ có thể lấy mô-đun này và sử dụng nó trên bản cài đặt Python hiện có của bạn. Nó có thể sẽ làm việc.

Trước đó, tôi đã sử dụng để đổi tên các bài kiểm tra tôi muốn bỏ qua để xtest_testnametừ test_testname.


Đây là một kịch bản elisp nhanh chóng để làm điều này. Elisp của tôi là một chút gỉ nên tôi xin lỗi trước cho bất kỳ vấn đề nó có. Chưa được kiểm tra.

  (defun disable_enable_test ()
  (interactive "")
  (save-excursion
    (beginning-of-line)
    (search-forward "def")
    (forward-char)
    (if (looking-at "disable_")
    (zap-to-char 1 ?_)
      (insert "disable_"))))

+1, nhưng trong toàn bộ dự án tôi đang làm việc, mọi người đang sử dụng python v2.6.2 và tôi không nghĩ điều này sẽ thay đổi: /, nhưng đó là một giải pháp, cảm ơn
coelhudo

Bạn có thể điều chỉnh trình chỉnh sửa của mình một chút để cung cấp cho bạn một macro để bật / tắt một testcase nhưng tôi nói với tư cách là người dùng Emacs nên ... :)
Noufal Ibrahim

Tôi cũng là người dùng Emacs, bạn đã tạo macro chưa?
coelhudo

Không. Tôi chỉ để họ thất bại nhưng điều đó không khó lắm. Tôi đã cập nhật câu trả lời với một quickie mặc dù.
Noufal Ibrahim

Câu trả lời được chấp nhận này không phải là một câu trả lời, chỉ là một liên kết. Câu trả lời thực sự, hiện tại cũng không phải là câu trả lời hàng đầu. Cấp, nó được 4 tuổi. Các elisp vô cớ chỉ đơn thuần là obfuscates.
jwd630

10

Chỉ cần đặt @unittest.SkipTesttrang trí trên thử nghiệm là đủ.


Tôi không biết ai đã làm điều đó. Nhưng, tôi đã đọc tài liệu và nó nói rằng SkipTest là một ngoại lệ. Dù sao, nó khác với unittest.skip theo nghĩa là bỏ qua không bao giờ thực hiện kiểm tra (làm cho nó bị vô hiệu hóa), trong khi mục đích của SkipTest là được nêu ra nếu có điều gì đó không mong đợi xảy ra trong khi thử nghiệm đang thực thi. Tôi có đúng không Thú vị khó khăn.
coelhudo

unittest.skip(không có lý do) cho tôi lỗi trong Python 2 nhưng không phải ở Python 3.
Akif

5

Tôi chỉ đổi tên một phương thức trường hợp thử nghiệm với dấu gạch dưới: test_myfunc trở thành _test_myfunc.


3

Các tài liệu cho 2.1 không chỉ định phương thức bỏ qua hoặc bỏ qua.

Thông thường, tôi chặn bình luận khi cần thiết.


1

Tập trung vào phần "tạm thời bị vô hiệu hóa" của câu hỏi, câu trả lời tốt nhất phần nào phụ thuộc vào trường hợp sử dụng. Trường hợp sử dụng đưa tôi đến đây là tôi đang thực hiện phát triển dựa trên thử nghiệm trên một chức năng. Trong quá trình này, tôi liên tiếp viết các bài kiểm tra và thường sử dụng các điểm ngắt trong hàm để gỡ lỗi. Nếu tôi chỉ chạy tất cả các bài kiểm tra mỗi lần tôi chạy bài kiểm tra, tôi sẽ dừng tại các điểm dừng để kiểm tra đã hoạt động. Thêm "bỏ qua" hoặc trộn tên thử nghiệm hoặc một cái gì đó tương tự không phải là điều tôi muốn bởi vì khi tôi viết xong chức năng, tôi muốn tất cả các thử nghiệm chạy. Nếu tôi sử dụng "bỏ qua", tôi sẽ phải quay lại và "bỏ qua".

Đối với trường hợp sử dụng của tôi, giải pháp nằm trong trình chạy thử chứ không phải trong mã kiểm tra. Tôi sử dụng pytest . Với pytest, thật dễ dàng để chỉ định một thử nghiệm duy nhất từ ​​dòng lệnh:

PYTHON_FILENAME.TEST_CLASS.TEST_NAME

(thay thế các mũ bằng các giá trị của bạn).

Tôi hiểu câu hỏi đó là dành cho python-unitest. Tôi đã không sử dụng nó trong một thời gian dài. Tôi sẽ không ngạc nhiên nếu nó có thứ gì đó tương tự như pytest. Nếu không, bạn có thể dễ dàng chuyển sang pytest. Bạn không cần phải sửa đổi mã của bạn. Chỉ cần cài đặt nó và thay đổi lệnh chạy thử nghiệm của bạn.

Ngoài ra, tôi sử dụng PyCharm Pro. Trên trang hiển thị mã kiểm tra của tôi, có một biểu tượng nhỏ bên cạnh def cho mỗi bài kiểm tra. Tôi có thể nhấp vào biểu tượng đó và chạy thử nghiệm riêng lẻ.

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.