Python 单元测试的继承导致错误

Inheritance for Python unit tests leads to error

当我 运行 下面的代码片段时,出现错误:

'TypeError: __init__() takes 1 positional argument but 2 were given'. 

但是,如果我删除 unittest.Main() 并只创建 B 的一个实例:b = B(),它工作正常并按应有的方式调用 A 的构造函数。

编辑 2:A 并不意味着 运行 作为单元测试。只有A,它继承了B。

编辑:我想通过这种继承(虽然在代码片段中没有很好地显示)来完成的是为两个单元测试创​​建一个公共基础 class .

import unittest
from unittest import TestCase

class A(TestCase):

    def __init__(self, message):
        print(message)

class B(A):
    def __init__(self):
        super().__init__('It works!')

    def test_function(self):
        print('B - test method')

unittest.main()

根据文档,TestCase 构造函数有一个可选参数:

class unittest.TestCase(methodName='runTest')

但是你的构造函数没有:

class B(A):
    def __init__(self):
        super().__init__('It works!')

这就是为什么当 unittest 尝试实例化您的测试用例时,会抛出您观察到的 TypeError: __init__() takes 1 positional argument but 2 were given 异常。


当您继承 TestCase 时,您必须考虑它的参数。最好使用可变参数 *args, **kwargs,因为它可以转发任意数量的位置参数或关键字参数:

class A(TestCase):
    def __init__(self, message, *args, **kwargs):
        super().__init__(*args, **kwargs)
        print(message)


class B(A):
    def __init__(self, *args, **kwargs):
        super().__init__('It works!', *args, **kwargs)

    def test_function(self):
        print('B - test method')

确保不要忘记在 A 的构造函数中调用 super().__init__ - 这是您代码中的另一个问题。