【问题标题】:Python unittest cannot access local environment variables in PyCharmPython unittest 无法访问 PyCharm 中的本地环境变量
【发布时间】: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


【解决方案1】:

我还没有用unittest discover 解开这个谜团,但如果你是一个谨慎的来自谷歌的未来旅行者,并且穿着闪亮盔甲的骑士似乎没有挽救这一天,这个笨拙的解决方法可以解决问题:

python -m unittest tests.file_1
python -m unittest tests.file_2
python -m unittest tests.file_n

如果使用工作服来监控您的测试覆盖率,您可以像这样执行测试,它们将正确执行并显示您的组合代码覆盖率:

  coverage run --parallel-mode --source=sourcedir -m unittest tests.file_1
  coverage run --parallel-mode --source=sourcedir -m unittest tests.file_2
  coverage run --parallel-mode --source=sourcedir -m unittest tests.file_n
  coverage combine

这不是很好,所以我已经祈祷了,我们将从对 python-unittest 有更多经验的人那里获得解决方案。

【讨论】:

    猜你喜欢
    • 2023-03-15
    • 2010-11-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-09-08
    • 2014-02-11
    • 2018-03-17
    相关资源
    最近更新 更多