Python 单元测试后基于结果的方法调用
Result based method call after a unittest in Python
如何根据测试结果在 Python unittest.TestCase
派生的 class 中每次测试后调用函数?
例如,假设我们有以下测试 class:
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
class 并覆盖 __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 unittest.TestCase
派生的 class 中每次测试后调用函数?
例如,假设我们有以下测试 class:
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
class 并覆盖 __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