Я пишу несколько тестов для алгоритма, выполнение которого на наборе тестов довольно дорогое. Для этого я, по сути, написал следующее:
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.