почему нельзя считывать переменные среды во время unittest?

#python #visual-studio-code #pytest

Вопрос:

используя vscode pytest, в то время как тестовые случаи написаны не полностью, например:

 class MyTest(unittest.TestCase):
    def testEnvVar(self):
        account = os.getenv("ACCOUNT")
 

Он не умеет читать ACCOUNT . Тем не менее, os.getenv("ACCOUNT") вы получите правильный результат, если он будет выполнен python test.py напрямую:

 # test.py
import os
print(os.getenv("ACCOUNT"))
 

это гарантирует, что envar «УЧЕТНАЯ ЗАПИСЬ» уже установлен.

Если выполняется pytest tests/test.py , var среды также не может быть прочитан, поэтому это вызвано pytest. Я знаю, что pytest выполнит некоторые трюки (например, pytest захватит все выходные данные консоли/stderr), но я не знаю, что именно он делает с envar’ом. И то же, что и tox(в tox вы должны установить passenv=* , чтобы тест env мог наследовать все переменные среды от оболочки, в которой живет tox.

Я имею в виду, я полностью понимаю, что это трюк, который могут сделать все инструменты, связанные с тестированием, я просто не знаю, как отключить его в pytest. Поэтому не предполагайте, что я забыл установить переменную, или мой код неверен и т. Д.

Я знаю, как взломать это, используя макет или добавить .env vars в файл запуска vscode. Однако это определенно приведет к раскрытию учетной записи/пароля в некоторых файлах/настройках. поскольку учетная запись и пароль являются секретами, я не хочу раскрывать их в каких-либо файлах.

Я думаю, что это очень распространенное требование, и pytest уже должен был это учитывать. Так почему же это все еще происходит?

Комментарии:

1. Очевидно, что переменная среды не задана в вашей тестовой среде. Не зная больше, трудно сказать, почему, но сам по себе pytest не меняет окружающую среду. Где код, который его устанавливает?

2. Пожалуйста, предоставьте минимально воспроизводимый код с описанием шагов.

3. выше приведен мимимальный воспроизводимый код, по крайней мере, в моем env. Чтобы уточнить: 1. среда (УЧЕТНАЯ ЗАПИСЬ) настроена так, чтобы простой скрипт мог ее прочитать, например: python -c 'import os;print(os.getenv('ACCOUNT')) 2. в то же время приведенный выше unittest не сможет прочитать «УЧЕТНАЯ ЗАПИСЬ».

4. Это странно. Итак, если вы сделаете python -c 'import os;print(os.getenv('ACCOUNT') это непосредственно перед python -m pytest (или что бы вы ни использовали для вызова pytest ), это покажет, что переменная установлена, но в тесте она не установлена?

5. очень странно, что сегодня эта проблема исчезает… Я думал, что это связано с тестированием, потому что я знаю, что когда вы начинаете тест с tox, вы должны установить pass_env=* , хотите ли вы наследовать envars оболочки, поэтому я подумал, что тест сделает то же самое. Я буду следить за этим еще несколько дней и верну вас @MrBeanBremen. Спасибо за всю помощь.

Ответ №1:

Самый простой способ-использовать https://github.com/MobileDynasty/pytest-env. Но я не думаю, что вам следует проверять переменные среды в ваших модульных тестах.

Комментарии:

1. Обратите внимание, что для этого есть setenv встроенное monkeypatch приспособление. В любом случае, это не отвечает на первоначальный вопрос.

2. Я проверил pytest-env, я не понимаю, почему это ответило на мой вопрос. У меня есть «УЧЕТНАЯ ЗАПИСЬ/ПАРОЛЬ», установленный в моей оболочке, я просто хочу, чтобы их можно было прочитать во время unittest, а не скрывать с помощью pytest.

3. Вопросы, которые начинаются с » почему «, приглашают к дебатам. Есть много уровней, на которые вы могли бы ссылаться. Простой ответ заключается в том, что pytest запускает новый процесс с чистой средой, но я сомневаюсь, что это вам поможет. Более глубокий ответ на вопрос, почему pytest был разработан таким образом (это только мое мнение, я не знаю намерения автора), заключается в том, что чтение переменных среды-это операция ввода-вывода (или должна рассматриваться как), которая также должна быть изолирована от производственного и тестового кода. Однако в интеграционных тестах вам может потребоваться настроить среду тестирования, и вот ссылка на документы:

4. docs.pytest.org/en/6.2.x/example/…