我有一个产生测试用例的基类。类的具体实现注册测试。由于nose只支持测试函数(不是类)的yield生成测试,我想要一个应用必要函数包装的类装饰器。
注意:我需要产生测试用例的原因是测试类需要进行一些无法在setUp中运行的初始化。
下面是一个显示预期行为的最小示例,但是,只有make_generator
装饰器>> 当前模块时才有效 - 当我将其移动到单独的模块时没有测试屈服了。谁能告诉我为什么会这样?
def make_generator(cls):
"""returns a function that instantiates ``cls`` and yields tests. """
def generator():
obj = cls()
for t in obj:
yield t
generator.__name__ = 'test_%s' % cls.__name__
return generator
def register(func):
"""Set _check attr of ``func``. """
func._check = True
return func
class BaseMixin(object):
def __init__(self):
"""Register check handlers. """
self.check_handlers = []
attrs = (attr for attr in dir(self) if not attr.startswith('__'))
for attr in attrs:
func = getattr(self, attr)
if getattr(func, '_check', False):
self.check_handlers.append(attr)
def __iter__(self):
"""Generate tests for registered handlers. """
# do stuff
args = []
for check in self.check_handlers:
func = getattr(self, check)
yield func, args
@make_generator
class ConcreteTest(BaseMixin):
@register
def check_foobar(self, args):
assert False
答案 0 :(得分:0)
我发现如果我将make_generator
装饰器移动到另一个模块,为什么不会产生测试。
make_generator将返回一个函数,此函数的__module__
属性将是定义make_generator
的模块 - 这不是经过测试的模块,因此nose不会运行生成的测试函数。
如果我设置返回函数的__module__
属性,它可以正常工作::
def make_generator(cls):
"""returns a function that instantiates ``cls`` and yields tests. """
def generator():
obj = cls()
for t in obj:
yield t
generator.__name__ = 'test_%s' % cls.__name__
# set to the same module as test case so that nose runs it
generator.__module__ = cls.__module__
return generator