<p>狡猾!:-)</p>
<p>这里的问题是你不知道下一个要调用的函数是哪个-不是
不会直接干扰unittest代码。在</p>
<p>但是,如果可能的话,将每个测试用例更改为另一种方法,
这将调用为该测试用例定制的“设置”,然后执行原始的
测试用例,它将被解决。在</p>
<p>换言之:需要自动更改声明类中的每个测试用例
在另一个函数中:执行个性化设置,并且它们执行
原始测试。这应该在类创建时完成。在</p>
<p>这可能看起来很复杂,但这是一个非常适合“元类”的工作——因为我们只是在做它们的本意:定制类的创建。在</p>
<p>因此,通过将TestCase的元类更改为检查类中每个项的元类-
如果它是一个测试(即,如果它的名称以“test”开头),则创建一个新的包装器函数
完成了以上功能,你就可以开始了。在</p>
<p>(还需要一个进一步的步骤:由于方法名和原始测试方法的(对象)在创建后必须保持不变,因此必须创建一个中间函数来保存每个测试用例的闭包。否则,下面代码中的变量<code>method_name</code>和<code>original_method</code>都将在<code>for</code>循环结束时为类中最后一个函数的名称和内容设置)</p>
<p>给你:</p>
<pre><code># -*- 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()
</code></pre>
<p>(为了简化我这方面的测试,我注释掉了实际的日志行-“prints”运行良好,log\u setup函数中的任何代码都将在正确设置<code>self</code>和{<cd5>}的情况下运行。)</p>
<p>当然,您可以将这个metclass分解到另一个模块中,然后导入它以用于您的测试。在</p>