Избегать повторения в тестах при использовании юнит-тестов Python? - PullRequest
1 голос
/ 06 марта 2019

У меня проблемы с попыткой найти элегантное решение для этой ситуации.

Допустим, у меня есть тестовый модуль в 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? без понятия) и передать эти значения каждому методу тестирования, прежде чем получить следующий.но я понятия не имею, как на самом деле это сделать, тем более что в нем задействован менеджер контекста ... У кого-нибудь есть другие решения или просто нет обходных путей для этого?

...