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

标签 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.>

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

最佳答案

截至目前,我认为您无法做到这一点。 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

关于python - 在 Python 中进行单元测试后基于结果的方法调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30379811/

相关文章:

c# - 无法使用 Microsoft.QualityTools.Testing.Fakes.Shims.ShimNotSupportedException 填充 WebException

python - 具有多个元素的数组的真值是不明确的。使用 a.any() 或 a.all() - Numpy 库

python - 在scrapy中使用mysql插入数据

python - 如何根据先前的解决方案在 Python Gekko 中重新初始化优化

unit-testing - 将单元测试提升到一个新的水平

python - 从 python 调用任务运行 unittest.main()

python - 朱皮特 : Arguments in line magic commands

c++ - 使用 googletest 测试 const 行为

Python Mock - 如何像普通方法一样返回 MagicMock

Python self.assertRaises