首页 > 解决方案 > 如果测试方法驻留在所有测试通用的类中,如何记录测试类的名称?

问题描述

我有以下项目结构:

/root
  /tests
    common_test_case.py
    test_case_1.py
    test_case_2.py
    ...
  project_file.py
  ...

每个测试test_case_...都继承自unittest.TestCasecommon_test_case.CommonTestCase。类CommonTestCase包含应该由所有测试执行的测试方法(尽管使用每个测试唯一的数据,在测试中存储和访问self.something)。如果某个特定的测试用例需要一些特定的测试,它们会被直接添加到那个特定的类中。

目前我正在努力将日志记录添加到我的测试中。除其他外,我想记录运行该方法的类(因为上面的方法意味着不同类的相同测试方法名称)。我想坚持使用内置的日志记录模块来实现这一点。

我尝试了以下LogRecord属性%(filename)s、、、%(module)s%(pathname)s但是,对于其中定义的方法,common_test_case.py它们都返回路径/名称,common_test_case.py而不是它们实际运行的测试模块。

我的问题是:

  1. 有没有办法实现我想要的,只使用内置logging模块?
  2. 使用一些第三方/其他模块(我在想可能是一些“hacky”解决方案inspect)?
  3. 有可能实现(在 Python 中)吗?

标签: pythonpython-3.xpython-2.7unit-testinglogging

解决方案


您的问题与此类似,并通过以下方式解决:

self.id()

请参阅此处的函数定义,它调用self.__class__被实例化的TestCase类的实例。鉴于您正在使用多重继承,来自 Python 的多重继承规则适用:

对于大多数目的,在最简单的情况下,您可以将搜索从父类继承的属性视为深度优先、从左到右,而不是在层次结构中有重叠的同一类中搜索两次。

这意味着common_test_case.CommonTestCase它将被搜索unittest.TestCase。如果事物中没有 id 函数,common_test_case.CommonTestCase则它应该像仅从unittest.TestCase. 如果你觉得需要向 中添加一个id函数CommonTestCase,像这样(如果真的有必要的话):

def id(self):
  if issubclass(self,unittest.TestCase):
    return super(unittest.TestCase,self).id()

推荐阅读