У меня проблемы с попыткой найти элегантное решение для этой ситуации.
Допустим, у меня есть тестовый модуль в Python, который будет тестировать несколько элементов из итерируемого.Поскольку эта итерация является дорогостоящей для создания памяти, я хочу создать ее только один раз с помощью метода setUpClass
.Затем в каждом тесте я хочу последовательно передать каждый элемент итерируемого теста, что я могу использовать с помощью диспетчера контекста и метода subTest
.Это все нормально.
Следующий код является примером фиктивного теста, выполняющего именно то, что я описал:
import unittest
class NumberTest(unittest.TestCase):
@classmethod
def setUpClass(cls):
cls.numbers = []
for x in range(1000):
cls.numbers.append(x)
@classmethod
def tearDownClass(cls):
del cls.numbers
def test_number_is_even(self):
for n in self.numbers:
with self.subTest(current_number=n):
self.assertEqual(n % 2, 0)
def test_number_is_odd(self):
for n in self.numbers:
with self.subTest(current_number=n):
self.assertEqual(n % 2, 1)
def test_number_is_positive(self):
for n in self.numbers:
with self.subTest(current_number=n):
self.assertTrue(n > 0)
def test_number_is_negative(self):
for n in self.numbers:
with self.subTest(current_number=n):
self.assertTrue(n < 0)
if __name__ == '__main__':
unittest.main()
Что меня здесь беспокоит, так это то, что строки for n in self.numbers: with self.subTest(current_number=n): . . .
повторяются для каждого метода испытаний.Есть ли способ избежать этого?Я знаю, что мог бы просто собрать все операторы self.assert
вместе в одном методе, но это в первую очередь сводит на нет цель иметь разные тесты для разных аспектов.
На мой взгляд, "идеальным" решением было быкаким-то образом yield
значения из итерируемого (может быть, с помощью метода setUp
? без понятия) и передать эти значения каждому методу тестирования, прежде чем получить следующий.но я понятия не имею, как на самом деле это сделать, тем более что в нем задействован менеджер контекста ... У кого-нибудь есть другие решения или просто нет обходных путей для этого?