Python 2.7 无法重写超类uuu init_uuuu():对象没有属性'_testMethodName';?

Python 2.7 无法重写超类uuu init_uuuu():对象没有属性'_testMethodName';?,python-2.7,class,python-unittest,Python 2.7,Class,Python Unittest,根据这个答案,我试图用python unittest覆盖测试项目的超类init函数,该函数有三个类,如下所示: base.py import unittest class BaseTest(unittest.TestCase): def setUp(self): print '\n\t Prepare configuration' #: executed after each test def tearDown(s

根据这个答案,我试图用python unittest覆盖测试项目的超类init函数,该函数有三个类,如下所示:

base.py

import unittest

    class BaseTest(unittest.TestCase):
        def setUp(self):
            print '\n\t Prepare configuration'
        #: executed after each test
        def tearDown(self):
            print '\n\t Closing session'
from base import *

class HELPER(BaseTest):
    """ Predefine Parameter """
    URL         = ''
    ID          = ''
    Module      = ''
    def __init__(self, module=''):

        self.Module = module

    def open_url(self):
        print "INIT FROM SUPER CLASS IS "
        print self.Module
        status_code = 200
        self.assertEqual(200,status_code)
from helper import *

class TestProvince(HELPER):
    def __init__(self, module = ''):
        super(TestProvince, self).__init__()
        self.Module = 'Province'

    def test_open_url(self):
        self.open_url()



if __name__ == "__main__":
    unittest.main()
import unittest

class BaseTest(unittest.TestCase):
    # ** Adding init Function from unittest class **
    def __init__(self, *args, **kwargs):
        unittest.TestCase.__init__(self, *args, **kwargs)

    def setUp(self):
        print '\n\t Prepare configuration'
    #: executed after each test
    def tearDown(self):
        print '\n\t Closing session'
from base import *

class HELPER(BaseTest):
    """ Predefine Parameter """
    URL         = ''
    ID          = ''
    Module      = ''
    # *** Adding init function from class BaseTest ***
    def __init__(self, *args, **kwargs):
        BaseTest.__init__(self, *args, **kwargs)
        self.controller = object()


    def open_url(self):
        print "INIT FROM SUPER CLASS IS "
        print self.Module
        status_code = 200
        self.assertEqual(200,status_code)
helper.py

import unittest

    class BaseTest(unittest.TestCase):
        def setUp(self):
            print '\n\t Prepare configuration'
        #: executed after each test
        def tearDown(self):
            print '\n\t Closing session'
from base import *

class HELPER(BaseTest):
    """ Predefine Parameter """
    URL         = ''
    ID          = ''
    Module      = ''
    def __init__(self, module=''):

        self.Module = module

    def open_url(self):
        print "INIT FROM SUPER CLASS IS "
        print self.Module
        status_code = 200
        self.assertEqual(200,status_code)
from helper import *

class TestProvince(HELPER):
    def __init__(self, module = ''):
        super(TestProvince, self).__init__()
        self.Module = 'Province'

    def test_open_url(self):
        self.open_url()



if __name__ == "__main__":
    unittest.main()
import unittest

class BaseTest(unittest.TestCase):
    # ** Adding init Function from unittest class **
    def __init__(self, *args, **kwargs):
        unittest.TestCase.__init__(self, *args, **kwargs)

    def setUp(self):
        print '\n\t Prepare configuration'
    #: executed after each test
    def tearDown(self):
        print '\n\t Closing session'
from base import *

class HELPER(BaseTest):
    """ Predefine Parameter """
    URL         = ''
    ID          = ''
    Module      = ''
    # *** Adding init function from class BaseTest ***
    def __init__(self, *args, **kwargs):
        BaseTest.__init__(self, *args, **kwargs)
        self.controller = object()


    def open_url(self):
        print "INIT FROM SUPER CLASS IS "
        print self.Module
        status_code = 200
        self.assertEqual(200,status_code)
测试省份。py

import unittest

    class BaseTest(unittest.TestCase):
        def setUp(self):
            print '\n\t Prepare configuration'
        #: executed after each test
        def tearDown(self):
            print '\n\t Closing session'
from base import *

class HELPER(BaseTest):
    """ Predefine Parameter """
    URL         = ''
    ID          = ''
    Module      = ''
    def __init__(self, module=''):

        self.Module = module

    def open_url(self):
        print "INIT FROM SUPER CLASS IS "
        print self.Module
        status_code = 200
        self.assertEqual(200,status_code)
from helper import *

class TestProvince(HELPER):
    def __init__(self, module = ''):
        super(TestProvince, self).__init__()
        self.Module = 'Province'

    def test_open_url(self):
        self.open_url()



if __name__ == "__main__":
    unittest.main()
import unittest

class BaseTest(unittest.TestCase):
    # ** Adding init Function from unittest class **
    def __init__(self, *args, **kwargs):
        unittest.TestCase.__init__(self, *args, **kwargs)

    def setUp(self):
        print '\n\t Prepare configuration'
    #: executed after each test
    def tearDown(self):
        print '\n\t Closing session'
from base import *

class HELPER(BaseTest):
    """ Predefine Parameter """
    URL         = ''
    ID          = ''
    Module      = ''
    # *** Adding init function from class BaseTest ***
    def __init__(self, *args, **kwargs):
        BaseTest.__init__(self, *args, **kwargs)
        self.controller = object()


    def open_url(self):
        print "INIT FROM SUPER CLASS IS "
        print self.Module
        status_code = 200
        self.assertEqual(200,status_code)
详细说明是,在
test_province.py
中,我试图重写super class
HELPER
的init函数,但它无法使用错误执行选项

AttributeError: 'TestProvince' object has no attribute '_testMethodName'

这有什么错或遗漏?如何正确重写超类init函数?请帮忙谢谢unittest的文档字符串。TestCase包含以下文本:

如果需要重写
\uuuuu init\uuuu
方法,则必须始终调用基类
\uuuuuu init\uuuu
方法。重要的是,子类不应更改其
\uuuu init\uuuu
方法的签名,因为类的实例是由框架的部分自动实例化的,以便运行

因此,问题不在于
TestProvince
如何从
HELPER
继承,而在于
HELPER
如何覆盖它从库代码继承的
\uuu init\uuu
方法。如果您添加对超级(助手,self)的调用。\uuu init\uuu,它可能会正常工作

您可能还需要更改
\uuuuu init\uuuu
以匹配基类使用的签名:
\uuuuuu init\uuuuu(self,methodName='runTest')


最后一点注意:Python 2将在年底失去Python开发人员对它的官方支持,因此现在学习Python 3可能比学习Python 2更好,因为他们需要更新您的知识以获得新版本。这与本文相关,因为Python3允许您使用无参数的
super
,这非常好(无需重复当前类名)。

首先,我非常感谢@Blckknght提供了有用的详细答案

我设法从中找到了解决方案(7年前),因此我将所有三个类更改为:

base.py

import unittest

    class BaseTest(unittest.TestCase):
        def setUp(self):
            print '\n\t Prepare configuration'
        #: executed after each test
        def tearDown(self):
            print '\n\t Closing session'
from base import *

class HELPER(BaseTest):
    """ Predefine Parameter """
    URL         = ''
    ID          = ''
    Module      = ''
    def __init__(self, module=''):

        self.Module = module

    def open_url(self):
        print "INIT FROM SUPER CLASS IS "
        print self.Module
        status_code = 200
        self.assertEqual(200,status_code)
from helper import *

class TestProvince(HELPER):
    def __init__(self, module = ''):
        super(TestProvince, self).__init__()
        self.Module = 'Province'

    def test_open_url(self):
        self.open_url()



if __name__ == "__main__":
    unittest.main()
import unittest

class BaseTest(unittest.TestCase):
    # ** Adding init Function from unittest class **
    def __init__(self, *args, **kwargs):
        unittest.TestCase.__init__(self, *args, **kwargs)

    def setUp(self):
        print '\n\t Prepare configuration'
    #: executed after each test
    def tearDown(self):
        print '\n\t Closing session'
from base import *

class HELPER(BaseTest):
    """ Predefine Parameter """
    URL         = ''
    ID          = ''
    Module      = ''
    # *** Adding init function from class BaseTest ***
    def __init__(self, *args, **kwargs):
        BaseTest.__init__(self, *args, **kwargs)
        self.controller = object()


    def open_url(self):
        print "INIT FROM SUPER CLASS IS "
        print self.Module
        status_code = 200
        self.assertEqual(200,status_code)
helper.py

import unittest

    class BaseTest(unittest.TestCase):
        def setUp(self):
            print '\n\t Prepare configuration'
        #: executed after each test
        def tearDown(self):
            print '\n\t Closing session'
from base import *

class HELPER(BaseTest):
    """ Predefine Parameter """
    URL         = ''
    ID          = ''
    Module      = ''
    def __init__(self, module=''):

        self.Module = module

    def open_url(self):
        print "INIT FROM SUPER CLASS IS "
        print self.Module
        status_code = 200
        self.assertEqual(200,status_code)
from helper import *

class TestProvince(HELPER):
    def __init__(self, module = ''):
        super(TestProvince, self).__init__()
        self.Module = 'Province'

    def test_open_url(self):
        self.open_url()



if __name__ == "__main__":
    unittest.main()
import unittest

class BaseTest(unittest.TestCase):
    # ** Adding init Function from unittest class **
    def __init__(self, *args, **kwargs):
        unittest.TestCase.__init__(self, *args, **kwargs)

    def setUp(self):
        print '\n\t Prepare configuration'
    #: executed after each test
    def tearDown(self):
        print '\n\t Closing session'
from base import *

class HELPER(BaseTest):
    """ Predefine Parameter """
    URL         = ''
    ID          = ''
    Module      = ''
    # *** Adding init function from class BaseTest ***
    def __init__(self, *args, **kwargs):
        BaseTest.__init__(self, *args, **kwargs)
        self.controller = object()


    def open_url(self):
        print "INIT FROM SUPER CLASS IS "
        print self.Module
        status_code = 200
        self.assertEqual(200,status_code)
测试省份。py

import unittest

    class BaseTest(unittest.TestCase):
        def setUp(self):
            print '\n\t Prepare configuration'
        #: executed after each test
        def tearDown(self):
            print '\n\t Closing session'
from base import *

class HELPER(BaseTest):
    """ Predefine Parameter """
    URL         = ''
    ID          = ''
    Module      = ''
    def __init__(self, module=''):

        self.Module = module

    def open_url(self):
        print "INIT FROM SUPER CLASS IS "
        print self.Module
        status_code = 200
        self.assertEqual(200,status_code)
from helper import *

class TestProvince(HELPER):
    def __init__(self, module = ''):
        super(TestProvince, self).__init__()
        self.Module = 'Province'

    def test_open_url(self):
        self.open_url()



if __name__ == "__main__":
    unittest.main()
import unittest

class BaseTest(unittest.TestCase):
    # ** Adding init Function from unittest class **
    def __init__(self, *args, **kwargs):
        unittest.TestCase.__init__(self, *args, **kwargs)

    def setUp(self):
        print '\n\t Prepare configuration'
    #: executed after each test
    def tearDown(self):
        print '\n\t Closing session'
from base import *

class HELPER(BaseTest):
    """ Predefine Parameter """
    URL         = ''
    ID          = ''
    Module      = ''
    # *** Adding init function from class BaseTest ***
    def __init__(self, *args, **kwargs):
        BaseTest.__init__(self, *args, **kwargs)
        self.controller = object()


    def open_url(self):
        print "INIT FROM SUPER CLASS IS "
        print self.Module
        status_code = 200
        self.assertEqual(200,status_code)
从助手导入*

class TestProvince(HELPER):
    # *** Calling init function from class HELPER
    def __init__(self, *args, **kwargs):
        HELPER.__init__(self,*args, **kwargs)
        self.Module = 'Province'

    def test_open_url(self):
        self.open_url()

if __name__ == "__main__":
    unittest.main()
在此之后,我可以从子类TestProvince访问超级类帮助器中的任何变量


问题的根源可能是我试图继承unittest类的testCase的init()函数,而不是类助手本身。谢谢

非常感谢您的帮助性回答,我成功地从这个答案中解决了问题。无论如何,我学到了一些新东西:)