2009-07-13 32 views
41

Khi sử dụng nosetests cho Python, bạn có thể tắt kiểm tra đơn vị bằng cách đặt thuộc tính __test__ của hàm thử nghiệm thành false. Tôi đã triển khai điều này bằng cách sử dụng công cụ trang trí sau:Vô hiệu hóa các nosetests Python

def unit_test_disabled(): 
    def wrapper(func): 
     func.__test__ = False 
     return func 

    return wrapper 

@unit_test_disabled 
def test_my_sample_test() 
    #code here ... 

Tuy nhiên, điều này có tác dụng phụ khi gọi trình bao bọc là kiểm tra đơn vị. Wrapper sẽ luôn luôn vượt qua nhưng nó được bao gồm trong đầu ra nosetests. Có một cách khác để cấu trúc trang trí để kiểm tra sẽ không chạy và không xuất hiện trong đầu ra nosetests.

Trả lời

-17

Tôi nghĩ bạn cũng sẽ cần phải đổi tên trang trí của bạn thành một thứ chưa được kiểm tra. Phần dưới đây chỉ thất bại trong lần kiểm tra thứ hai đối với tôi và lần đầu tiên không xuất hiện trong bộ thử nghiệm.

def unit_disabled(func): 
    def wrapper(func): 
     func.__test__ = False 
     return func 

    return wrapper 

@unit_disabled 
def test_my_sample_test(): 
    assert 1 <> 1 

def test2_my_sample_test(): 
    assert 1 <> 1 
+6

Những nhược điểm này đang trở nên ngớ ngẩn. –

+7

Tại sao không xóa bài đăng này và giành được huy hiệu 'áp lực ngang hàng'? –

+1

Tại sao điều này lại bị ảnh hưởng rất nhiều? Lý do không rõ ràng. – CaffeineConnoisseur

130

Nose đã có một trang trí BUILTIN cho việc này:

from nose.tools import nottest 

@nottest 
def test_my_sample_test() 
    #code here ... 

Ngoài ra kiểm tra các tính năng khác mà mũi cung cấp: https://nose.readthedocs.org/en/latest/testing_tools.html

+1

Kiểm tra sẽ không chạy và không đánh dấu là bỏ qua ... Đôi khi sẽ hữu ích hơn khi tăng ngoại lệ SkipTest, như đã được đề xuất trong câu trả lời @Anders Waldenborg, vì vậy sẽ có thể thấy kết quả là một số thử nghiệm đã bị bỏ qua. – Serge

+0

Điều này là duyên dáng, vì người ta có thể kế thừa từ một lớp '@ nottest' và vẫn có thể đánh dấu hậu duệ là' @ istest'. Tôi tin rằng tôi đã ở khắp nơi để tìm cách để đạt được hành vi này, và đây là người duy nhất hoạt động mà không làm rách mã. (Lồng ghép lớp con cháu để tránh theo dõi mũi làm cho toàn bộ điều trông khủng khiếp: /) – Rubens

30

Ngoài ra còn có một plugin skiptest cho nosetest, mà sẽ gây ra chương trình thử nghiệm trong đầu ra thử nghiệm bị bỏ qua. Đây là một trang trí cho rằng:

đầu ra Ví dụ:

$ nosetests tests 
.......................................................................... 
..................................S............. 
---------------------------------------------------------------------- 
Ran 122 tests in 2.160s 

OK (SKIP=1) 
+4

Hoặc bạn chỉ có thể 'tăng SkipTest' vào lúc bắt đầu bài kiểm tra của bạn. Cũng lưu ý rằng bạn có thể thực hiện 'từ mũi nhập khẩu SkipTest'. –

+0

Lưu ý tài liệu về điều này: _ "Thông thường bạn có thể sử dụng TestCase.skipTest() hoặc một trong các trang trí bỏ qua thay vì tăng trực tiếp." ._ – Zitrax

54

Bạn cũng có thể sử dụng unittest.skip trang trí:

import unittest 


@unittest.skip("temporarily disabled") 
class MyTestCase(unittest.TestCase): 
    ... 
+1

Hoạt động hoàn hảo với mũi cũng như chức năng. Tuyệt quá! Xem http://pybites.blogspot.fr/2009/03/unittest-now-with-test-skipping-finally.html – gaborous

+1

Cảm ơn bạn, công trình này tuyệt vời, độc lập với mũi! – alexcasalboni

+1

Điều này cũng hoạt động tốt với các bài kiểm tra tham số bằng cách sử dụng '@ parameterized.expand()' decorator từ 'node_parameterized' ... miễn là bạn đặt' @ unittest.skip() '* below * other - ie. để trang trí không trang trí chạy trước trang trí được tham số hóa. – CivFan

4

Bạn chỉ có thể bắt đầu các lớp học, phương pháp hoặc chức năng tên với dấu gạch dưới và mũi sẽ bỏ qua nó.

@nottest có cách sử dụng nhưng tôi thấy rằng nó không hoạt động tốt khi các lớp bắt nguồn từ nhau và một số lớp cơ sở phải được bỏ qua bằng mũi. Điều này xảy ra thường xuyên khi tôi có một loạt các lượt xem Django tương tự để kiểm tra. Họ thường chia sẻ các đặc điểm cần thử nghiệm. Ví dụ: chúng chỉ có thể truy cập được đối với người dùng có quyền nhất định. Thay vì viết kiểm tra quyền tương tự cho tất cả chúng, tôi đã đặt thử nghiệm chia sẻ như vậy trong một lớp học ban đầu mà từ đó các lớp khác lấy được. Vấn đề mặc dù là lớp cơ sở chỉ có được bắt nguồn từ các lớp sau và không có nghĩa là để chạy trên riêng của nó. Dưới đây là một ví dụ về vấn đề này:

from unittest import TestCase 

class Base(TestCase): 

    def test_something(self): 
     print "Testing something in " + self.__class__.__name__ 

class Derived(Base): 

    def test_something_else(self): 
     print "Testing something else in " + self.__class__.__name__ 

Và đầu ra từ chảy nước mũi vào nó:

$ nosetests test.py -s 
Testing something in Base 
.Testing something in Derived 
.Testing something else in Derived 
. 
---------------------------------------------------------------------- 
Ran 3 tests in 0.000s 

OK 

Lớp Base được bao gồm trong các bài kiểm tra.

Tôi không thể chỉ tát @nottest trên Base vì nó sẽ đánh dấu toàn bộ phân cấp. Thật vậy, nếu bạn chỉ cần thêm @nottest vào mã ở trên trước class Base thì mũi sẽ không chạy bất kỳ thử nghiệm nào.

Những gì tôi làm là thêm một dấu gạch dưới ở phía trước của lớp cơ sở:

from unittest import TestCase 

class _Base(TestCase): 

    def test_something(self): 
     print "Testing something in " + self.__class__.__name__ 

class Derived(_Base): 

    def test_something_else(self): 
     print "Testing something else in " + self.__class__.__name__ 

Và khi chạy nó _Base bị bỏ qua:

$ nosetests test3.py -s 
Testing something in Derived 
.Testing something else in Derived 
. 
---------------------------------------------------------------------- 
Ran 2 tests in 0.000s 

OK 

Hành vi này cũng không phải là tài liệu nhưng mã mà chọn các bài kiểm tra explicitly checks for an underscore at the start of class names.

Một thử nghiệm tương tự được thực hiện bằng mũi tên hàm và phương thức để có thể loại trừ chúng bằng cách thêm dấu gạch dưới ở đầu tên.

Các vấn đề liên quan