Python unittest:如何重用TestCase.assert函数
我正在写一个unittest.TestCase的子类,目的是为了简化我们代码中的一些细节。我想使用我自己的断言函数,但我需要确保这些断言的结果能够被记录到测试结果中。我尝试像这样重用unittest的断言函数:
class MyTestCase(unittest.TestCase):
def assertState(state, value):
if state_dict[state] == value:
self.assertTrue(True)
else:
self.assertTrue(False)
问题是,在我的MyTestCase实例中调用assertState时,会报告assertError,而不是将错误报告到测试结果对象中。
请告诉我如何在unittest.TestCase的子类中编写我自己的断言函数。
编辑:我想实现的目标是提供一个自己的MyTestCase类作为基类,里面包含更多的与业务逻辑相关的断言函数。这样,真正的测试只需要继承MyTestCase,就可以使用这些断言,而不需要重复相同的代码。这意味着我希望能够在MyTestCase的子类中调用MyTestCase.assertState,并且仍然能够将测试失败的结果报告到具体的测试结果中。类似于以下内容:
class ConcreteTestCase(MyTestCase):
def test_1(self):
#do something here
self.assertState("state", "on")
如果有办法做到这一点,请告诉我。
3 个回答
1
首先,你忘记加上 self
这个参数了。其次,你是怎么运行这个的?如果你真的想要测试结果的对象,下面就是你该怎么做:
In [1]: import unittest
In [2]: state_dict = {1:2}
In [3]: class MyTestCase(unittest.TestCase):
...: def assertState(self, state, value):
...: if state_dict[state] == value:
...: self.assertTrue(True)
...: else:
...: self.assertTrue(False)
...: def runTest(self):
...: self.assertState(1,2)
...: self.assertState(1,1)
...:
In [4]: r = unittest.TestResult()
In [5]: MyTestCase().run(r)
In [6]: r
Out[6]: <unittest.TestResult run=1 errors=0 failures=1>
In [7]: r.errors
Out[7]: []
In [8]: r.failures
Out[8]:
[(<__main__.MyTestCase testMethod=runTest>,
'Traceback (most recent call last):\n File "<ipython console>", line 9, in runTest\n File "<ipython console>", line 6, in assertState\nAssertionError\n')]
2
虽然回复得很晚,但我终于找到了解决办法,因为我在定义自己的测试用例子类时也遇到了同样的问题。希望这对其他有类似需求的人有帮助。
你只需要在定义这个类的模块里添加 __unittest = True
。
import unittest
__unittest = True
class MyTestCase(unittest.TestCase):
def assertState(state, value):
if state_dict[state] != value:
standardMsg = 'the state %s does not match %s' % (state, value)
self.fail(self._formatMessage(msg, standardMsg))
这样你自己定义的断言方法就会像 unittest.TestCase 里的那样工作,并且在失败时不会显示多余的错误信息。
这个方法适用于 Python 2.7。
来源: http://www.gossamer-threads.com/lists/python/python/1014779
2
class MyTestCase(unittest.TestCase):
def assertState(self, state, value):
self.assertEqual(value, self.state_dict[state])
def test_whatever(self):
self.assertState(1, 1)
self.assertState(2, 2)
当然可以!请把你想要翻译的内容发给我,我会帮你用简单易懂的语言解释清楚。