无法覆盖超类__init __():对象没有属性'_testMethodName'?

时间:2019-07-10 00:52:40

标签: python-2.7 class python-unittest

遵循此thread的答案之后,我尝试使用具有以下三个类的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'

helper.py

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)

test_province.py

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()

详细信息是,在test_province.py中,我尝试覆盖超类HELPER的init函数,但不适用于错误执行

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

这是什么问题或缺失?如何正确覆盖超类初始化函数?请帮助谢谢

2 个答案:

答案 0 :(得分:1)

unittest.TestCase的文档字符串包含以下文本:

  

如果有必要重写__init__方法,则必须始终调用基类__init__方法。重要的是,子类不得更改其__init__方法的签名,因为类的实例由框架的各个部分自动实例化以便运行。

所以问题不在于TestProvince是如何从HELPER继承的,而是问题是HELPER是如何覆盖从库代码继承的__init__方法的。如果您向super(HELPER, self).__init__添加呼叫,则可能会正常工作。

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

最后一点:Python 2将于今年年底失去对Python开发人员的官方支持,因此,现在最好学习Python 3,而不是学习Python 2,而他们需要更新您的Python。较新版本的知识。在这种情况下这是相关的,因为Python 3允许您不带任何参数使用super,这非常好(无需使用当前的类名重复自己)。

答案 1 :(得分:0)

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

我设法从这个old thread中找到了解决方案(7年前),所以我将所有三个类更改如下:

base.py

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

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()

test_province.py

从助手导入*

var myList = new List<object>();    
myList?.Add(new object());

此后,我可以从子类TestProvince中访问超类HELPER中的任何变量。

问题的根本原因可能是我可能尝试继承unittest类的testCase的 init ()函数,而不是HELPER类本身。谢谢