Единый метод тестирования, собирающий результаты других методов тестирования (пакет unittest) - PullRequest
1 голос
/ 16 июня 2020

Я пишу несколько тестов для алгоритма, выполнение которого на наборе тестов довольно дорогое. Для этого я, по сути, написал следующее:

class MyAlgoTestCase(unittest.TestCase):
    @classmethod
    def setUpClass(cls):
        cls.results = {expensive_computation(x) for x in something}
    def assertResultFound(self, single_result):
        if single_result in self.results:
            self.results.remove(single_result)
        else:
            raise self.failureException("a meaningful message")

С этим я могу использовать тесты следующим образом

class SpecificTestCase(MyAlgoTestCase)
    def test_result_found1(self):
        self.assertResultFound('foo')
        self.assertResultFound('bar')
    def test_result_found2(self):
        self.assertResultFound('baz')

Все работает как шарм. Но здесь возникает одна проблема:

В конце я хочу проверить, что набор результатов пуст (мой алгоритм нашел все, что он собирался найти).

Я уже пробовал следующее:

  • Выполнить тест во время tearDownClass. Недостаток: когда я запускаю python -m unittest ..., tearDownClass выступает в качестве теста, что мне неприятно.
  • Запишите соответствующий тест как метод MyAlgoTest. Тем самым я не могу гарантировать, что этот тест будет последним. Таким образом, некоторые элементы остаются в наборе результатов, которые впоследствии удаляются. Следовательно, тест ложно не выполняется.

Пожалуйста, не используйте ответы типа «это не модульные тесты - используйте что-нибудь другое» (я видел здесь много таких ответов). Эта структура одинакова для всей нашей среды DevOps.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...