2013-07-31 162 views
0

我有一個產生測試用例的基類。類註冊測試的具體實現。由於鼻子只支持測試函數產生的測試生成(不是類),我想要一個類裝飾器,它應用必要的函數包裝。蟒蛇動態測試代

注:我需要產生測試用例的原因是測試類需要做一些無法在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

我有點困惑,爲什麼你正在做一個發電機,而不是隻用鼻子的鴨打字模式?爲什麼讓你的生活更難? – Greg

+0

你的意思是什麼鼻子的鴨子打字模式? –

+0

我的意思是沿'def test_foo():'def test_baz():'聲明所有的測試。你在用鼻子嗎? – Greg

回答

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