这真的让我很沮丧。当我将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对这篇文章的评论有关?
答案 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经验的人那里获得解决方案。