Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/319.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/unit-testing/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python单元测试:具有自己构造函数的testcase类在标准库中失败_Python_Unit Testing - Fatal编程技术网

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

Python单元测试:具有自己构造函数的testcase类在标准库中失败,python,unit-testing,Python,Unit Testing,我有一个普通的单元测试,只要不使用构造函数,它就可以正常工作 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(

我有一个普通的单元测试,只要不使用构造函数,它就可以正常工作

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 回溯(最近一次呼叫最后一次): main()中第31行的文件“f:\gt\check.py” 文件“f:\gt\check.py”,第28行,主目录 runner.run(suite()) 文件“f:\gt\check.py”,第24行,在套件中 返回unittest.makeSuite(实例_测试,“测试”) makeSuite中第374行的文件“C:\Python34\lib\unittest\loader.py” testCaseClass) loadTestsFromTestCase中的第70行文件“C:\Python34\lib\unittest\loader.py” loaded_suite=self.suiteClass(映射(testCaseClass,testCaseNames)) 文件“C:\Python34\lib\unittest\suite.py”,第24行,在\uuu init中__ self.addTests(测试) addTests中第60行的文件“C:\Python34\lib\unittest\suite.py” 对于测试中的测试: TypeError:\uuuu init\uuuuuu()接受1个位置参数,但提供了2个
有什么问题吗?还有什么其他方法可以让不同的test\u xxx方法共享中心属性?

我将使用unittest.TestCase的setUp()和tearDown()方法,而不是init。除了使用
设置
方法外,只需执行与您正在执行的操作相同的操作。

只需将名为
方法名
的参数添加到您自己的
初始化
方法中,您就可以开始了:

class Instance_test(unittest.TestCase):

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

  ...
基本
TestCase.\uuuu init\uuuuu
签名如下:

class TestCase(object):

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

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

之所以发生这种情况,是因为
\uuuu init\uuuu
需要多个参数,而您忘记了提供args和kwargs作为参数。应该是这样的-

class Instance_test(unittest.TestCase):

    def __init__(self, *args, **kwargs):
        super(Instance_test, self).__init__(*args, **kwargs)
        self.attribute = "new"
此外,当
设置
方法正好用于此目的时,为什么还要重写
\uuuu init\uuuu
(正如2achary所建议的那样)

class Instance_test(unittest.TestCase):

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

您正在使用未处理的参数对方法进行子类化。您需要使
\uuuu init\uuuu
接受任意参数(通常是
*args,**kwargs
)并将它们传递给超类实现。@jonrsharpe:Yesss,谢谢