#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 был разработан таким образом (это только мое мнение, я не знаю намерения автора), заключается в том, что чтение переменных среды-это операция ввода-вывода (или должна рассматриваться как), которая также должна быть изолирована от производственного и тестового кода. Однако в интеграционных тестах вам может потребоваться настроить среду тестирования, и вот ссылка на документы: