Nose không quét kiểm tra tĩnh, vì vậy bạn có thể sử dụng metaclass phép thuật để làm bài kiểm tra mà Nose tìm thấy.
Phần cứng là kỹ thuật metaclass tiêu chuẩn không đặt thuộc tính func_name chính xác, đó là những gì mũi tìm kiếm khi kiểm tra xem các phương pháp trên lớp của bạn là kiểm tra hay không.
Đây là một metaclass đơn giản. Nó xem xét thông qua fict dict và thêm một phương thức mới cho mọi phương thức mà nó tìm thấy, khẳng định rằng phương thức mà nó tìm thấy có một docstring. Những phương pháp tổng hợp mới này được đặt tên là "test_%d" %i
.
import new
from inspect import isfunction, getdoc
class Meta(type):
def __new__(cls, name, bases, dct):
newdct = dct.copy()
for i, (k, v) in enumerate(filter(lambda e: isfunction(e[1]), dct.items())):
def m(self, func):
assert getdoc(func) is not None
fname = 'test_%d' % i
newdct[fname] = new.function(m.func_code, globals(), fname,
(v,), m.func_closure)
return super(Meta, cls).__new__(cls, 'Test_'+name, bases, newdct)
Bây giờ, chúng ta hãy tạo ra một lớp mới sử dụng metaclass này
class Foo(object):
__metaclass__ = Meta
def greeter(self):
"sdf"
print 'Hello World'
def greeter_no_docstring(self):
pass
Khi chạy, Foo
thực sự sẽ được đặt tên Test_Foo
và sẽ có greeter
, greeter_no_docstring
, test_1
và test_2
như các phương pháp của nó. Khi tôi chạy nosetests
trong hồ sơ này, đây là kết quả:
$ nosetests -v test.py
test.Test_Foo.test_0 ... FAIL
test.Test_Foo.test_1 ... ok
======================================================================
FAIL: test.Test_Foo.test_0
----------------------------------------------------------------------
Traceback (most recent call last):
File "/Library/Frameworks/EPD64.framework/Versions/7.3/lib/python2.7/site-packages/nose/case.py", line 197, in runTest
self.test(*self.arg)
File "/Users/rmcgibbo/Desktop/test.py", line 10, in m
assert getdoc(func) is not None
AssertionError
----------------------------------------------------------------------
Ran 2 tests in 0.002s
FAILED (failures=1)
metaclass này là không thực sự hữu ích như là, nhưng nếu bạn thay vì sử dụng Meta
không phải là một metaclass thích hợp, nhưng như nhiều hơn một metaclass chức năng (tức là lấy một lớp làm đối số và trả về một lớp mới, một lớp được đổi tên để mũi sẽ tìm thấy nó), sau đó nó là là hữu ích. Tôi đã sử dụng phương pháp này để tự động kiểm tra rằng các tài liệu tuân theo tiêu chuẩn Numpy như một phần của bộ kiểm tra mũi.
Ngoài ra, tôi đã gặp phải rất nhiều sự cố khi đóng cửa hợp lý với hoạt động mới.chức năng, đó là lý do tại sao mã này sử dụng m(self, func)
trong đó func
được tạo thành đối số mặc định. Sẽ tự nhiên hơn khi sử dụng một đóng cửa trên value
, nhưng điều đó dường như không hoạt động.
Bạn đã thử giải pháp của mình chưa? Nó không dựa trên bất kỳ phép thuật nào, bộ kết quả sẽ được phát hiện. – muhuk
Tôi có, xem nhận xét trong chuỗi gốc. Có lẽ có một tùy chọn cấu hình cho nó, hoặc một số cách để thiết lập một "mục tiêu giả" cho mũi? – saffsd
BTW, tôi đã giải quyết vấn đề này mà không cần đến máy phát thử nghiệm của mũi (nó được giới hạn mà bạn không thể sử dụng nó cho các lớp con của 'unittest.TestCase'). Xem: http://stackoverflow.com/questions/5176396/nose-unittest-testcase-and-metaclass-auto-generated-test-methods-not-discover/5177625#5177625 – Santa