Установка глобальных переменных в методах класса pytest

#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