【发布时间】:2026-02-13 20:55:02
【问题描述】:
使用vscode + pytest,而测试用例是用unittest写的,例如:
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"))
确保 "ACCOUNT" envar 已设置。
如果由pytest tests/test.py执行,环境变量也无法读取,是pytest造成的。我知道 pytest 会做一些技巧(例如,pytest 将捕获所有控制台/stderr 输出),但我不知道它对 envar 到底做了什么。和tox一样(在tox中,你必须设置passenv=*,所以test env可以从tox所在的shell继承所有环境变量。
我的意思是,我完全理解这是所有与测试相关的工具都可以使用的技巧,我只是不知道如何在 pytest 中禁用它。所以不要提示我忘记设置变量,或者我的代码错误等。
我知道如何破解这个,通过在 vscode 启动文件中使用模拟或添加 .env 变量。但是,这肯定会在某些文件/设置中暴露帐户/密码。由于 account 和 password 是机密,我不想在任何文件中公开它们。
我想这是一个非常普遍的要求,pytest 应该已经注意到了。那么为什么还会出现这种情况呢?
【问题讨论】:
-
显然您的测试环境中没有设置环境变量。不知道更多很难说为什么,但是 pytest 本身并没有改变环境。设置它的代码在哪里?
-
请提供包含步骤的最小可重现代码。
-
以上是最小的可重现代码,至少在我的环境中是这样。澄清一下: 1. 环境(ACCOUNT)已设置,以便简单的脚本可以读取它,例如:
python -c 'import os;print(os.getenv('ACCOUNT'))2. 同时,上面的单元测试将无法读取“ACCOUNT” -
这很奇怪。因此,如果您在
python -m pytest之前执行python -c 'import os;print(os.getenv('ACCOUNT')(或您用来调用pytest的任何内容),它将显示变量已设置,但在测试中未设置? -
很奇怪,今天这个问题消失了...我以为它与pytest有关,因为我知道当您开始使用tox进行测试时,如果您想设置
pass_env=*继承 shell 的 envars,所以我虽然 pytest 会做同样的事情。我会再监控几天,然后让你回来@MrBeanBremen。感谢所有的帮助。
标签: python visual-studio-code pytest