Сбросить атрибуты класса для тестирования - PullRequest
0 голосов
/ 25 февраля 2019

У меня есть такой класс Python:

class MyClass():
    class_att = 0

@classmethod
def increase_value(cls):
    att = att + 1

Я хочу подготовить два теста для класса: в одном из них он проверяет начальное значение, а в другом он увеличивается с помощьюmethod.

test_initial_value(self):
    self.assertEqual(MyClass.class_att, 0)

test_increase_value(self):
     MyClass.increase_value()
     self.assertEqual(MyClass.class_att, 1)

Но между обоими тестами существует зависимость, поскольку первый будет проходить только в том случае, если он будет выполнен до второго.Поэтому мне нужно было бы «сбросить» атрибуты класса.Это возможно?Как я мог это сделать?

Ответы [ 2 ]

0 голосов
/ 25 февраля 2019

Хорошо, что вы пытаетесь сохранить свои тесты независимыми.В вашем конкретном случае у вас есть несколько опций.

Опция 1: вы можете предоставить явный статический метод init для вашего класса MyClass.Такой метод может затем использоваться в ваших тестах.

test_increase_value(self):
    MyClass.init()
    MyClass.increase_value()
    self.assertEqual(MyClass.class_att, 1)

Это лишает ваши модульные тесты прямого доступа к внутренним компонентам класса, чтобы вернуть класс в исходное состояние.Это также может быть хорошим выбором, если вы обнаружите, что в вашем коде есть другие причины, чтобы иметь такую ​​возможность, не только по причинам модульного тестирования.

Вариант 2. Сбросьте состояние класса из ваших юнит-тестов, так какбыл показан Mebin Joe.Это делает ваши тесты немного менее стабильными, потому что вы каким-то образом дублируете внутренние компоненты класса и, следовательно, должны изменить свои тесты, если изменения в классе.Вы можете сделать это с помощью setUp и teardown (что в этом случае было бы предпочтительным) или непосредственно из каждого теста (только для демонстрации):

test_increase_value(self):
    MyClass.class_att = 0
    MyClass.increase_value()
    self.assertEqual(MyClass.class_att, class_att_before + 1)
    MyClass.class_att = 0 # bring back to initial state

Вариант 3: напишите свои тесты такони также надежно работают независимо от состояния класса:

test_increase_value(self):
    class_att_before = MyClass.class_att
    MyClass.increase_value()
    self.assertEqual(MyClass.class_att, class_att_before + 1)

У этого есть пара недостатков: тестовый код становится сложнее для чтения, и может быть нелегко реализовать все желаемые тестовые примеры таким образом.

Резюме: Я бы рекомендовал выбрать вариант 1, если вы действительно не хотите такой метод инициализации.Тогда вариант 2 предпочтительнее, чем 3, для которого я не вижу много применений.

0 голосов
/ 25 февраля 2019

Сброс переменных на None, общий объем памяти очищается после каждого юнит-теста.

Образец:

class TestEx(unittest.TestCase):

    def setUp(self):
        self.class_att = "value"

    def teardown(self):
        self.class_att = None
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...