每个testcase的日志文件/Get下一个testca的名称

2024-04-28 19:26:43 发布

您现在位置:Python中文网/ 问答频道 /正文

我想为每个测试用例设置一个新的日志文件。如下所示:

import unittest
import logging

log = logging.getLogger()

class TestExample(unittest.TestCase):
    def setUp(self):
        next_testcase = ???
        self.hdl = logging.FileHandler(
                'testcase_%s.log' % next_testcase, mode='w')
        log.addHandler(self.hdl)

    def tearDown(self):
        log.removeHandler(self.hdl)

我怎样才能找到testcase这个名字?

或者你将如何实现上述的东西?在


Tags: 文件importselflogloggingdef测试用例unittest
2条回答

狡猾!:-)

这里的问题是你不知道下一个要调用的函数是哪个-不是 不会直接干扰unittest代码。在

但是,如果可能的话,将每个测试用例更改为另一种方法, 这将调用为该测试用例定制的“设置”,然后执行原始的 测试用例,它将被解决。在

换言之:需要自动更改声明类中的每个测试用例 在另一个函数中:执行个性化设置,并且它们执行 原始测试。这应该在类创建时完成。在

这可能看起来很复杂,但这是一个非常适合“元类”的工作——因为我们只是在做它们的本意:定制类的创建。在

因此,通过将TestCase的元类更改为检查类中每个项的元类- 如果它是一个测试(即,如果它的名称以“test”开头),则创建一个新的包装器函数 完成了以上功能,你就可以开始了。在

(还需要一个进一步的步骤:由于方法名和原始测试方法的(对象)在创建后必须保持不变,因此必须创建一个中间函数来保存每个测试用例的闭包。否则,下面代码中的变量method_nameoriginal_method都将在for循环结束时为类中最后一个函数的名称和内容设置)

给你:

# -*- coding: utf-8 -*-
import unittest
import logging

#template method:
def log_setup(self, name):
    #self.hdl = logging.FileHandler('testcase_%s.log' % name, mode='w')
    #log.addHandler(self.hdl)
    self.name = name


class MetaTestCase(type):
    def __new__(cls, cls_name, bases, dict):
        for name, item in dict.items():
            if name.startswith("test"):
                def scope_freezer(method_name, original_method):
                    def wrapper(self, *args, **kw):
                        log_setup(self, method_name)
                        return original_method(self, *args, **kw)
                    return wrapper
                dict[name] = scope_freezer(name, item)
        return type.__new__(cls, cls_name, bases, dict)


class TestExample(unittest.TestCase):
    __metaclass__ = MetaTestCase
    def test_a(self):
        print self.name

    def test_b(self):
        print self.name

    def tearDown(self):
        pass
        #log.removeHandler(self.hdl)

unittest.main()

(为了简化我这方面的测试,我注释掉了实际的日志行-“prints”运行良好,log\u setup函数中的任何代码都将在正确设置self和{}的情况下运行。)

当然,您可以将这个metclass分解到另一个模块中,然后导入它以用于您的测试。在



import unittest
import logging

def log_setup(self, name):
    print name


class TestExample(unittest.TestCase):

    def test_method_name(self):
        print self.method_name

    def __getattribute__(self, name):
        safe_getattr =  super(TestExample, self).__getattribute__

        if name.startswith("test_"):
            self.method_name = name
            log_setup(self, name)

        return safe_getattr(name)



if __name__ == "__main__":
    unittest.main()

相关问题 更多 >