Переменные неизменяемого объекта Unittest? - PullRequest
0 голосов
/ 24 января 2019

У меня проблемы с изменением переменных объекта в методе класса.Пример:

import unittest

class Example(unittest.TestCase):

    def setUp(self):
        self.var_A = "foo"

    def test_1(self):
        self.assertEqual(self.var_A, "foo")
        self.var_A = "bar"

    def test_2(self):
        self.assertEqual(self.var_A, "bar")

if __name__ == '__main__':
    unittest.main()

test_2 завершается ошибкой, поскольку self.var_A значение не было изменено на "bar" в test_1

Если я пытаюсьпоместите его снаружи setUp и измените его с помощью self.__class__.var_A, он работает.
Рабочий пример:

import unittest

class Example(unittest.TestCase):
    var_A = "foo"

    def setUp(self):
        pass

    def test_1(self):
        self.assertEqual(self.var_A, "foo")
        self.__class__.var_A = "bar"

    def test_2(self):
        self.assertEqual(self.var_A, "bar")

if __name__ == '__main__':
    unittest.main()

Вопрос: Почему работает второй пример, а первый - нет?'t?
Это сбивает с толку, поскольку кажется, что self.var_A является неизменным и не может быть изменено после setUp , но я могу использовать его как часть объекта в других методах тестирования

1 Ответ

0 голосов
/ 24 января 2019

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

Атрибуты класса, с другой стороны, остаются одни, поэтому ваш второй пример "работает".

Обратите внимание, что есть также метод setUpClass, который выполняется только один раз для всех тестов в тестовом примере, но вы должны использовать его только для атрибутов, которые 1 / только для чтения и 2 / дорогостоящие для настройки. Еще раз, ваши тесты НЕ должны зависеть от побочных эффектов от других тестов, каждый тест ДОЛЖЕН работать изолированно, и каждый тест должен работать независимо от того, какие другие тесты из того же тестового набора были (или не были) выполнены ранее.

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