Изменение глобальных переменных в системе 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")
Спасибо.
Изменить: сделал пример кода более откровенным.
Ответы
Ответ 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
вместо.