【发布时间】:2020-10-18 09:18:34
【问题描述】:
这个真的难倒我。当我将 API 密钥设置为环境变量,然后尝试使用使用此 API 密钥的 unittest 运行测试时,测试无法访问 API 密钥。我不想在测试本身中设置环境变量,因为该值是秘密的,我不希望它被我的 VCS 意外跟踪。
$ export API_KEY=hunter2
$ python -m unittest discover tests
ERROR: setUpClass (tests_system.TestInit)
----------------------------------------------------------------------
Traceback (most recent call last):
File "/home/travis/build/jamesbrunet/callhub-python-wrapper/callhub/auth.py", line 23, in __init__
self.api_key = os.environ["API_KEY"]
File "/home/travis/virtualenv/python3.5.6/lib/python3.5/os.py", line 725, in __getitem__
raise KeyError(key) from None
KeyError: 'API_KEY'
有趣的是,如果我只使用python test-file.py 运行单个测试文件,它会成功执行并且可以访问 API 密钥。如果我使用python -m unittest discover <directory of test file>,我只会遇到这个问题。不幸的是,我需要使用后一个命令来发现目录中的所有测试文件。
unittest 的文档没有引用环境变量,所以我对这里发生的事情有点茫然。
编辑:我在本地机器上做了一些额外的测试,这个问题的范围似乎仅限于在 PyCharm 和 Travis 中运行这些命令。两者都使用虚拟环境。也许这与@AndrewAllaire 对此帖子的评论有关?
【问题讨论】:
-
好吧,我明白为什么它不起作用了,当发现测试时,它们是在一个不在您的 bash 环境中的子进程中启动的。如何解决它是另一回事。也许在主目录之外有一个隐藏文件来存储它,并有一个从该文件中读取值的函数。
-
我尝试重现您的问题,但对我来说效果很好(在 WSL 上使用 Python 3.6.9)。 @AndrewAllaire 的评论在您的情况下可能是正确的,但看起来测试并不是在看不到环境的子进程中产生的。此外,我认为分叉的进程总是继承环境变量。
-
@joelhoro 很惊讶它对你有用。也许我的解释是错误的——但不确定他的情况还有什么。
-
感谢@joelhoro。我尝试在一堆不同的情况下重现这个问题,这个问题似乎只发生在 PyCharm 和 Travis CI 中,它们都使用虚拟环境。在 PyCharm 和 Travis 中, unittest discover
导致了这个问题,而 unittest 工作正常。多么有趣,它几乎就像 unittest 发现在搞乱虚拟环境一样? -
刚刚尝试使用虚拟环境,仍然可以正常工作。
标签: python pycharm python-unittest