Подтвердить что ты не робот

Изменение глобальных переменных в системе unitest Python

Я работаю над серией модульных тестов в Python, некоторые из которых зависят от значения переменной конфигурации. Эти переменные хранятся в глобальном файле конфигурации Python и используются в других модулях. Я хотел бы написать модульные тесты для разных значений конфигурационных переменных, но пока не нашел способ сделать это.

У меня нет возможности переписать подписи методов, которые я тестирую.

Это то, что я хотел бы достичь:

from my_module import my_function_with_global_var

class TestSomething(self.unittest):

    def test_first_case(self):
         from config import MY_CONFIG_VARIABLE
         MY_CONFIG_VARIABLE = True
         self.assertEqual(my_function_with_global_var(), "First result")

    def test_second_case(self):
         from config import MY_CONFIG_VARIABLE
         MY_CONFIG_VARIABLE = False
         self.assertEqual(my_function_with_global_var(), "Second result")

Спасибо.

Изменить: сделал пример кода более откровенным.

4b9b3361

Ответ 1

Не делайте этого:

from my_module import my_function_with_global_var

Но это:

import my_module

И затем вы можете ввести MY_CONFIG_VARIABLE в импортированный my_module, не меняя тестируемую систему следующим образом:

class TestSomething(unittest.TestCase): # Fixed that for you!

    def test_first_case(self):
         my_module.MY_CONFIG_VARIABLE = True
         self.assertEqual(my_module.my_function_with_global_var(), "First result")

    def test_second_case(self):
         my_module.MY_CONFIG_VARIABLE = False
         self.assertEqual(my_module.my_function_with_global_var(), "Second result")

Я сделал что-то подобное в моем ответе Как смоделировать вход для stdin для pyunit?.

Ответ 2

Возможно, вы захотите высмеять эти глобальные переменные. Преимущество этого заключается в том, что глобальные таблицы получают reset, как только вы закончите. Python поставляется с издевательским модулем, который позволяет вам это делать.

unittest.mock.patch можно использовать в качестве декоратора:

class TestSomething(self.unittest):

    @patch('config.MY_CONFIG_VARIABLE', True)
    def test_first_case(self):
         self.assertEqual(my_function_with_global_var(), "First result")

Вы также можете использовать его в качестве менеджера контекста:

    def test_first_case(self):
        with patch('config.MY_CONFIG_VARIABLE', True):
            self.assertEqual(my_function_with_global_var(), "First result")

Ответ 3

Вы импортируете код MY_CONFIG_VARIABLE в локальную область, а затем сразу же перезаписываете это имя другим объектом. Это не изменит значение в модуле config. Попробуйте

import config
config.MY_CONFIG_VARIABLE = False

вместо.