【问题标题】:Result based method call after a unittest in PythonPython中单元测试后基于结果的方法调用
【发布时间】:2015-05-21 16:50:08
【问题描述】:

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

这可以做到吗?如果可以,怎么做?

【问题讨论】:

  • 与您的要求相关,您可以向每个assert 方法传递一个附加参数,如果测试失败将显示该参数。一般来说,您可能希望查看使用 unittest.result.TestResult 的自定义子类
  • 下面的答案解决了你的问题吗?

标签: python unit-testing python-unittest


【解决方案1】:

到目前为止,我认为您无法做到这一点。在您使用 tearDown 方法之前,TestResult 对象已经消失,这很可能是最简单的方法。

相反,您可以推出自己的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

【讨论】:

  • 感谢您的好建议 - 您对替代目标的怀疑是正确的。我希望有可能调用一种方法,比如将结果附加到成功和不成功测试的自定义结果表中,但也许我更容易使用类似HTMLTestRunner.. .
  • 我通常更喜欢尝试现有的解决方案而不是重新发明轮子,但如果这是一个简单的案例,也许你可以使用自定义的TestCase(见编辑)。
  • 我已经接受了您的回答,因为我觉得您在您的回复中付出了很多思考和努力 - 再次感谢!
  • 我很感激!它真的解决了你的问题吗?
  • 事实证明,实现自定义 TestCase 是最简单和最灵活的(因此也是最好的恕我直言)——它实现了我想要的,但我确实喜欢指向 3rd 方包的第二个编辑!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-06-07
相关资源
最近更新 更多