装饰师在鼻子测试案件,产生

时间:2016-03-02 15:22:47

标签: python decorator yield

我有以下装饰器,它应该在try / except块中包含测试用例函数的实现,并在发生异常时打印日志。

def print_log(test_case):
    @wraps(test_case)
    def run_test(self):
        try:
            test_case(self)
        except:
            Test_Loop.failure_teardown(self)
            raise
   return run_test

然而,这似乎不适用于我的一个调用yield生成器的测试用例

请耐心等待,因为这是一个基本的例子:

class Test_Loop:
    # ton of implementation here (e.g. initialization, etc)

    def runIt(self, name, ip, port):
        # code here

    @print_log
    def test_log_looper(self):
        for l in self.links:
            # initialize variables seen below and other stuff
            for n in names:
                # do stuff
                for i in ips:
                    # do stuff
                    for p in ports:
                        yield self.runIt, l, n, i, p

从调试开始,当应用装饰器时,它似乎甚至没有进入第一个循环。我做错了什么?

1 个答案:

答案 0 :(得分:1)

您需要迭代生成器。像这样修改装饰器:

def print_log(test_case):
    @wraps(test_case)
    def run_test(self):
        try:
            for _ in test_case(self): pass
        except:
            Test_Loop.failure_teardown(self)
            raise
   return run_test