PyTest使用os.environ.get读取环境变量无需ini/env文件的方法
你在独立终端执行脚本设置的环境变量,仅对当前终端会话及其直接启动的子进程生效。VS Code Test Explorer默认以VS Code主进程的后台子进程形式启动pytest,不会继承你后续在独立集成终端中手动注入的临时环境变量,因此os.environ.get()会返回None。
注:原生pytest本身默认完全继承父进程的所有系统环境变量,不存在无法读取系统环境变量的限制,网上教程提到的.ini、.env配置方案是第三方插件pytest-env的用法,不是pytest的必选要求,硬编码敏感信息本身就是不符合安全规范的错误用法。
方案1:从已注入变量的终端启动VS Code(零代码改动)
- 先在终端执行你编写的Amazon Parameter Store密钥拉取脚本,完成当前会话的环境变量注入
- 在同一个终端会话中执行
code .启动对应项目的VS Code窗口 - 该模式下VS Code主进程会完整继承当前终端的所有环境变量,后续Test Explorer启动的所有pytest进程会自动继承这些变量,直接调用
os.environ.get()即可正常读取,不需要任何额外配置。 - 如果你不想重启VS Code,直接在该已注入变量的终端中执行pytest命令(如
pytest tests/your_test_case.py)运行测试即可,绕开Test Explorer的后台进程启动逻辑,100%可读取到已设置的环境变量。
方案2:通过conftest.py动态注入变量(全场景兼容,无敏感信息落盘风险)
在项目根目录创建/修改pytest自动加载的conftest.py文件,复用你现有的Parameter Store拉取逻辑,在pytest启动阶段动态将密钥注入进程环境,全程敏感信息仅存在内存中,不会写入任何配置文件:
import os # 导入你已写好的SSM参数拉取逻辑 from your_existing_ssm_script import pull_parameters_from_aws def pytest_configure(config): # pytest初始化阶段执行,整个测试生命周期仅运行1次 creds = pull_parameters_from_aws() for env_key, env_value in creds.items(): # 不覆盖已存在的系统环境变量,保留手动设置的优先级 if env_key not in os.environ: os.environ[env_key] = env_value
配置完成后,无论你通过Test Explorer点击运行、还是终端执行pytest命令,都可以正常通过os.environ.get()读取到对应变量,完全不需要硬编码敏感值到ini或env文件。
方案3:调整VS Code配置,让测试在集成终端运行
修改项目下.vscode/settings.json配置,让Test Explorer不再以后台进程形式启动pytest,而是直接在集成终端中启动测试进程,即可继承终端中已注入的环境变量:
{ "python.testing.pytestEnabled": true, "python.testing.runTestsInTerminal": true, "python.testing.pytestArgs": ["tests"] }
配置完成后重载VS Code窗口,提前在集成终端执行密钥拉取脚本注入环境变量,之后通过Test Explorer触发的测试运行都会在该终端会话中执行,可正常读取到预设的环境变量。
内容的提问来源于stack exchange,提问作者Kevin

