如何根据测试结果在Python unittest.TestCase
派生类中的每次测试后调用函数?
例如,假设我们有以下测试类:
import sys
from unittest import TestCase
class TestFeedback(TestCase):
def msg(self, text):
sys.stdout.write(text + ' ...')
def on_fail(self):
sys.stdout.write(' FAILED!\n')
def on_success(self):
sys.stdout.write(' SUCCEEDED!\n')
def test_something(self):
self.msg('Testing whether True == 1')
self.assertTrue(True == 1)
def test_another(self):
self.msg('Testing whether None == 0')
self.assertEqual(None, 0)
我希望在每次测试后调用方法on_success()
或on_fail()
,具体取决于测试结果,例如:
>>> unittest.main()
...
Testing whether True == 1 ... SUCCEEDED!
Testing whether None == 0 ... FAILED!
<etc.>
可以这样做,如果可以,怎么做?
答案 0 :(得分:2)
截至目前,我认为你无法做到这一点。在您使用TestResult
方法之前,tearDown
对象已经消失,这很可能是最简单的方法。
相反,您可以推送自己的TestSuite
(请参阅here获取基本说明),这样您就可以访问每项测试的结果。缺点是您必须单独添加每个测试或创建自己的发现方法。
另一种选择是将错误消息传递给您的断言;消息将在失败时打印:
self.assertEqual(None, 0, 'None is not 0')
这里的最终目标是什么?运行单元测试会告诉您哪些测试失败并带有追溯信息,所以我想你有一个不同的目标。
修改强>:
好吧,我认为一个解决方案是编写自己的自定义TestCase
类并覆盖__call__
方法(注意:我还没有测试过这个):
from unittest import TestCase
class CustomTestCase(TestCase):
def __call__(self, *args, **kwds):
result = self.run(*args, **kwds)
<do something with result>
return result
编辑2 :
另一种可能的解决方案......查看this answer