Python unittest:如何重用TestCase.assert函数

1 投票
3 回答
1573 浏览
提问于 2025-04-16 17:13

我正在写一个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)

当然可以!请把你想要翻译的内容发给我,我会帮你用简单易懂的语言解释清楚。

撰写回答