#python #python-3.x #unit-testing #testing #pytest
#python #python-3.x #модульное тестирование #тестирование #pytest
Вопрос:
У меня есть приложение, которое считывает некоторые настройки конфигурации из удаленного источника при запуске и сохраняет их в глобальной области. Функция в этом приложении использует настройку в этой глобальной конфигурации. Функционально это выглядит примерно так…
def define_globals():
global MY_THRESHOLD
MY_THRESHOLD = 123
def my_func(my_input):
return my_input > MY_THRESHOLD
def run():
define_globals()
my_func(122)
Я хотел бы протестировать my_func
с помощью pytest, но MY_THRESHOLD не определен во время теста. Своего рода новичок в тестировании, поэтому немного изучил приспособления. У вас есть что-то подобное, но вы все еще не находите это глобальное значение при запуске теста.
import pytest
import my_file
@pytest.fixture()
def set_gloabls():
global MY_THRESHOLD
MY_THRESHOLD = 123
class TestMyApplication(object):
@pytest.mark.usefixtures("set_gloabls")
def test_my_func(self):
assert my_file.my_func(122) == False
Наверное, я думал, что приспособление будет работать в области тестируемого файла? IDK с трудом понимает, как это сделать без изменения кода в приложении.
Комментарии:
1. Помните, что «глобальные» переменные являются глобальными только в контексте module….so если ваше приложение ищет
MY_THRESHOLD
, вам нужно будет установить это в модуле приложения. То есть, если ваш тест имеетimport myapp
, вам нужно будет установитьmyapp.MY_THRESHOLD
. Можете ли вы показать нам свой полный тестовый файл (включаяimport
строки)?2. @larsks Я сильно упрощаю тестовый файл для примера, но я отредактировал тестовый код для импорта из кода приложения. По сути, это то, что я имею в реальной жизни.
Ответ №1:
Повторяя то, что я сказал в комментариях, «глобальная» переменная является «глобальной» только в модуле. Поэтому, когда вы пытаетесь установить MY_THRESHOLD
в своем тестовом модуле, это никогда не будет видно в вашем my_file
модуле.
Вам нужно будет сделать что-то вроде этого:
import pytest
import my_file
@pytest.fixture()
def set_globals():
my_file.MY_THRESHOLD = 123
class TestMyApplication(object):
@pytest.mark.usefixtures("set_globals")
def test_my_func(self):
assert my_file.my_func(122) == False
И на самом деле, поскольку это глобальный, вы также можете просто сделать это (предполагая, что MY_THRESHOLD
это константа во время вашего тестирования):
import pytest
import my_file
my_file.MY_THRESHOLD = 123
class TestMyApplication(object):
def test_my_func(self):
assert my_file.my_func(122) == False