Python单元测试无法访问PyCharm中的局部环境变量

时间:2020-06-28 01:41:45

标签: python pycharm python-unittest

这真的让我很沮丧。当我将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对这篇文章的评论有关?

1 个答案:

答案 0 :(得分:0)

我还没有用unittest discover解决这个奥秘,但是如果您是一位来自Google的未来旅行者,并且穿着闪亮盔甲的骑士似乎并没有节省一天的时间,那么这种变通的解决方法将可以解决问题:

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经验的人那里获得解决方案。