【问题标题】:python dynamic test generationpython动态测试生成
【发布时间】:2013-07-31 10:33:01
【问题描述】:

我有一个生成测试用例的基类。类注册测试的具体实现。由于鼻子只支持通过测试函数(不是类)的产量生成测试,我想要一个应用必要的函数包装的类装饰器。

注意:我需要 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

【问题讨论】:

  • 我有点困惑,为什么您要制作生成器而不是仅使用鼻子的鸭子类型模式?为什么要让你的生活更艰难?
  • 鼻子的鸭子打字模式到底是什么意思?
  • 我的意思是按照def test_foo():def test_baz(): 的方式声明您的所有测试。你在用鼻子吗?
  • 问题是我需要在运行测试之前进行一些初始化,而我不能在设置中这样做(有多个设置阶段,每个阶段之后应该运行特定的测试)

标签: python unit-testing nose


【解决方案1】:

我发现如果我将 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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-06-19
    • 1970-01-01
    • 1970-01-01
    • 2016-06-22
    • 2010-09-07
    • 1970-01-01
    相关资源
    最近更新 更多