Python 尝试从unittest.TestCase和其他类继承

Python 尝试从unittest.TestCase和其他类继承,python,unit-testing,multiple-inheritance,python-unittest,Python,Unit Testing,Multiple Inheritance,Python Unittest,我有一个基类,它只从具有一组排序算法的公共测试的对象继承。现在,对于每个特定的算法,我想创建一个测试类,它继承unittest.TestCase和这个类,并对所有排序算法进行公共测试 例如,我想创建一个类来测试冒泡排序。目前,我正在做: import unittest from ands.algorithms.sorting import bubble_sort from tests.algorithms.sorting.base_tests import * class TestBubb

我有一个基类,它只从具有一组排序算法的公共测试的对象继承。现在,对于每个特定的算法,我想创建一个测试类,它继承unittest.TestCase和这个类,并对所有排序算法进行公共测试

例如,我想创建一个类来测试冒泡排序。目前,我正在做:

import unittest

from ands.algorithms.sorting import bubble_sort
from tests.algorithms.sorting.base_tests import *


class TestBubbleSort(unittest.TestCase, SortingAlgoTests):

    def __init__(self):
        unittest.TestCase.__init__(self)
        SortingAlgoTests.__init__(self, bubble_sort, True)


if __name__ == "__main__":
    unittest.main(verbosity=2)
现在,当我使用以下命令运行TestBubbleSort时:

coverage run -m unittest discover . -v
我会遇到很多错误,比如:

Traceback (most recent call last):
  File "/Library/Frameworks/Python.framework/Versions/3.5/lib/python3.5/unittest/__main__.py", line 18, in <module>
    main(module=None)
  File "/Library/Frameworks/Python.framework/Versions/3.5/lib/python3.5/unittest/main.py", line 93, in __init__
    self.parseArgs(argv)
  File "/Library/Frameworks/Python.framework/Versions/3.5/lib/python3.5/unittest/main.py", line 117, in parseArgs
    self._do_discovery(argv[2:])
  File "/Library/Frameworks/Python.framework/Versions/3.5/lib/python3.5/unittest/main.py", line 228, in _do_discovery
    self.test = loader.discover(self.start, self.pattern, self.top)
  File "/Library/Frameworks/Python.framework/Versions/3.5/lib/python3.5/unittest/loader.py", line 341, in discover
    tests = list(self._find_tests(start_dir, pattern))
  File "/Library/Frameworks/Python.framework/Versions/3.5/lib/python3.5/unittest/loader.py", line 398, in _find_tests
    full_path, pattern, namespace)
  File "/Library/Frameworks/Python.framework/Versions/3.5/lib/python3.5/unittest/loader.py", line 452, in _find_test_path
    return self.loadTestsFromModule(module, pattern=pattern), False
  File "/Library/Frameworks/Python.framework/Versions/3.5/lib/python3.5/unittest/loader.py", line 123, in loadTestsFromModule
    tests.append(self.loadTestsFromTestCase(obj))
  File "/Library/Frameworks/Python.framework/Versions/3.5/lib/python3.5/unittest/loader.py", line 92, in loadTestsFromTestCase
    loaded_suite = self.suiteClass(map(testCaseClass, testCaseNames))
  File "/Library/Frameworks/Python.framework/Versions/3.5/lib/python3.5/unittest/suite.py", line 24, in __init__
    self.addTests(tests)
  File "/Library/Frameworks/Python.framework/Versions/3.5/lib/python3.5/unittest/suite.py", line 57, in addTests
    for test in tests:
TypeError: __init__() takes 1 positional argument but 2 were given
我不再有上面的错误了。问题是我需要将排序算法传递给SortingAlgoTests基类,所以我需要调用它的构造函数,通常我会在u_init_u_方法中执行


如何解决此问题?

看起来您已经覆盖了SortingAlgoTests类中的addTest方法

我通过将TestBubbleSort修改为:

显然,unittest.TestCase的子类需要有一个_init__方法,该方法的签名与上面的签名类似,即带有参数methodName,该参数需要传递给unittest.TestCase的超级构造函数

import unittest

from ands.algorithms.sorting import bubble_sort
from tests.algorithms.sorting.base_tests import *


class TestBubbleSort(unittest.TestCase, SortingAlgoTests):
    pass

if __name__ == "__main__":
    unittest.main(verbosity=2)
class TestBubbleSort(unittest.TestCase, SortingAlgoTests):

    def __init__(self, methodName="runTest"):
        unittest.TestCase.__init__(self, methodName)
        SortingAlgoTests.__init__(self, bubble_sort, True)