Python单元测试:具有自己的构造函数的testcase类在标准库中失败

时间:2016-02-05 17:11:29

标签: python unit-testing

我有这个简单的vanilla单元测试,只要我省略了构造函数,它就会按预期工作。

import sys
import unittest

class Instance_test(unittest.TestCase):

  def __init__(self):
     super(Instance_test, self).__init__()
     self.attribute = "new"

  def test_something(self):
     pass

  def test_other(self):
     self.assertTrue(True)
     pass

  def setUp(self):
     pass

  def tearDown(self):
     pass

def suite():
  return unittest.makeSuite(Instance_test, "test")

def main():
  runner = unittest.TextTestRunner(sys.stdout)
  runner.run(suite())

if __name__ == "__main__":
   main()

使用构造函数获取此回溯:


 Traceback (most recent call last):
   File "f:\gt\check.py", line 31, in  main()
   File "f:\gt\check.py", line 28, in main
      runner.run(suite())
   File "f:\gt\check.py", line 24, in suite
    return unittest.makeSuite(Instance_test, "test")
  File "C:\Python34\lib\unittest\loader.py", line 374, in makeSuite
    testCaseClass)
  File "C:\Python34\lib\unittest\loader.py", line 70, in loadTestsFromTestCase
    loaded_suite = self.suiteClass(map(testCaseClass, testCaseNames))
  File "C:\Python34\lib\unittest\suite.py", line 24, in __init__
    self.addTests(tests)
  File "C:\Python34\lib\unittest\suite.py", line 60, in addTests
    for test in tests:
 TypeError: __init__() takes 1 positional argument but 2 were given

我有什么错误以及如何通过不同的test_xxx方法共享中心属性?

3 个答案:

答案 0 :(得分:2)

我会使用unittest.TestCase的setUp()和tearDown()方法而不是 init 。除了使用setUp方法之外,您可以做同样的事情。

答案 1 :(得分:1)

这种情况正在发生,因为__init__需要多个参数,你忘了提供args和kwargs作为参数。应该是这样的 -

class Instance_test(unittest.TestCase):

    def __init__(self, *args, **kwargs):
        super(Instance_test, self).__init__(*args, **kwargs)
        self.attribute = "new"

除此之外,当__init__方法完全用于此目的时,为什么要覆盖setUp(如2achary建议的那样)。

class Instance_test(unittest.TestCase):

    def setUp(self):
        self.attribute = 'new'

答案 2 :(得分:0)

只需将一个名为methodName的参数添加到您自己的__init__方法中,就可以了:

class Instance_test(unittest.TestCase):

  def __init__(self, methodName='runTest'):
     super(Instance_test, self).__init__(methodName=methodName)
     self.attribute = "new"

  ...

基本TestCase.__init__签名如下:

class TestCase(object):

    def __init__(self, methodName='runTest'):
        ...

正如您所看到的,它需要一个额外的methodName参数,没有它的构造函数,因此您遇到了失败。