在Python中进行单元测试后基于结果的方法调用

时间:2015-05-21 16:50:09

标签: python unit-testing python-unittest

如何根据测试结果在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.>

可以这样做,如果可以,怎么做?

1 个答案:

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