1

У меня есть базовый класс (который наследует только от object) с общими тестами для набора алгоритмов сортировки. Теперь для каждого конкретного алгоритма я хотел бы создать тестовый класс, который наследует как от unittest.TestCase, так и от этого класса с общими тестами для всех алгоритмов сортировки.Попытка наследовать от 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 

Так как я очень новый с этим модулем unittest, но я уже создал модульные тесты для Java-проекта, я не уверен, в чем проблема.

Я заметил, что если у меня нет способа __init__, т.е. TestBubbleSort выглядит следующим образом:

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) 

У меня нет ошибки выше больше. Проблема в том, что мне нужно передать алгоритм сортировки в базовый класс SortingAlgoTests, поэтому мне нужно вызвать его конструктор, и обычно я делаю это в методе __init__.

Как я могу решить эту проблему?

ответ

0

Похоже, вы переопределены addTest метод в классе SortingAlgoTests

2

мне удалось решить эту проблему путем изменения моего TestBubbleSort к:

class TestBubbleSort(unittest.TestCase, SortingAlgoTests): 

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

По-видимому, это необходимо, чтобы подкласс unittest.TestCase имеет __init__ метод с сигнатурой, аналогичной той, что приведена выше, то есть с параметром methodName, который необходимо передать супер-конструктору unittest.TestCase.