【问题标题】:why can't read environment variables during unittest?为什么在单元测试期间无法读取环境变量?
【发布时间】: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 变量。但是,这肯定会在某些文件/设置中暴露帐户/密码。由于 accountpassword 是机密,我不想在任何文件中公开它们。

我想这是一个非常普遍的要求,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


【解决方案1】:

最简单的方法是使用https://github.com/MobileDynasty/pytest-env。但我认为您不应该在单元测试中测试环境变量。

【讨论】:

  • 请注意,内置 monkeypatch 夹具中有 setenv 来实现此目的。无论如何,这并不能回答最初的问题。
  • 我检查了 pytest-env,我不明白为什么它回答了我的问题。我在我的 shell 环境中设置了“帐户/密码”,我只是希望它们可以在单元测试期间被读取,而不是被 pytest 隐藏。
  • why 开头的问题会引发辩论。您可能指的是许多级别。一个简单的答案是 pytest 在干净的环境中启动一个新进程,但我怀疑这对你有什么帮助。关于为什么 pytest 以这种方式设计的更深层次的答案(这只是我的观点,我不知道作者的意图)是因为读取环境变量是一个 IO 操作(或应该被视为)值得与生产隔离以及测试代码。但是,在集成测试中,您可能需要设置测试环境,这里是文档的链接: