Python 2.7 无法重写超类uuu init_uuuu():对象没有属性'_testMethodName';?
根据这个答案,我试图用python unittest覆盖测试项目的超类init函数,该函数有三个类,如下所示: base.pyPython 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
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 classHELPER
的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()函数,而不是类助手本身。谢谢非常感谢您的帮助性回答,我成功地从这个答案中解决了问题。无论如何,我学到了一些新东西:)