我具有以下项目结构:
/root
/tests
common_test_case.py
test_case_1.py
test_case_2.py
...
project_file.py
...
每个测试test_case_...
都继承自unittest.TestCase
和common_test_case.CommonTestCase
。类CommonTestCase
包含应由所有测试执行的测试方法(尽管使用每个测试所独有的数据,这些数据在测试的self.something
中进行存储和访问)。如果确切的测试用例需要一些特定的测试,则将它们直接添加到该特定类中。
当前,我正在努力将日志添加到测试中。除其他事项外,我想记录运行该方法的类(因为上述方法暗含着针对不同类的相同测试方法名称)。我想坚持使用内置的logging模块来实现这一目标。
我尝试了以下LogRecord attributes:%(filename)s
,%(module)s
,%(pathname)s
。但是,对于common_test_case.py
中定义的方法,它们都将路径/名称返回到common_test_case.py
,而不是它们实际从中运行的测试模块。
我的问题是:
logging
模块来实现我想要的目标?inspect
的一些“ hacky”解决方案)?答案 0 :(得分:1)
您的问题似乎与此one类似,并通过以下方式解决:
+-----------+---------+-----+---+----------------+
|Description|Sub-Tower|Tower|_id| input_data|
+-----------+---------+-----+---+----------------+
| a b,c| crt|A B C| 27|alpha beta gamma|
| a b,c| crt|A B C| 91|alpha beta gamma|
| a b,c| crt|A B C| 21|alpha beta gamma|
| a b,c| crt|A B C| 29|alpha beta gamma|
+-----------+---------+-----+---+----------------+
请参见函数定义here,该函数定义为实例化的self.id()
类的实例调用self.__class__
。假设您正在使用多重继承,则multiple inheritance rules from Python适用于
在大多数情况下,在最简单的情况下,您可以将对从父类继承的属性的搜索视为深度优先,从左到右,而不是在同一类中重复搜索两次层次结构。
这意味着将先搜索TestCase
,然后搜索common_test_case.CommonTestCase
。如果unittest.TestCase
中没有id函数,则应该像仅从common_test_case.CommonTestCase
派生的那样工作。如果您需要在unittest.TestCase
上添加id
函数,请执行以下操作(如果确实需要):
CommonTestCase
答案 1 :(得分:0)
解决方案I've found(到目前为止,已达到目的):
import inspect
class_called_from = inspect.stack()[1][0].f_locals['self'].__class__.__name__
不过,我仍然想知道,是否有一种“更清晰”的方法,或者是否可以使用logging模块来实现。
根据West's answer(在Python 3.6.1上测试)的配方:
test_name = self.id().split('.')[-1]
class_called_from = self.id().split('.')[-2]