如果测试方法位于所有测试通用的类中,如何记录测试类的名称?

时间:2019-04-11 06:52:03

标签: python python-3.x python-2.7 unit-testing logging

我具有以下项目结构:

/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中进行存储和访问)。如果确切的测试用例需要一些特定的测试,则将它们直接添加到该特定类中。

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

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

我的问题是:

  1. 是否有办法仅使用内置的logging模块来实现我想要的目标?
  2. 使用一些第三方/其他模块(我想也许是inspect的一些“ hacky”解决方案)?
  3. 是否完全可以(在Python中)实现?

2 个答案:

答案 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]