在unittest测试中设置环境变量

2024-06-16 11:31:24 发布

您现在位置:Python中文网/ 问答频道 /正文

我希望能够在Django应用程序中设置环境变量,以便测试能够运行。例如,我的视图依赖于几个API键。

有一些方法可以override settings during testing,但我不希望在settings.py中定义它们,因为这是一个安全问题。

我在setup函数中尝试设置这些环境变量,但这无法为Django应用程序提供值。

class MyTests(TestCase):
    def setUp(self):
        os.environ['TEST'] = '123'  # doesn't propogate to app

当我在本地测试时,我只需要使用一个.env文件

foreman start -e .env web

它为os.environ提供值。但在Django的unittest.TestCase中,它没有一种(我知道的)设置方法。

我怎么能避开这个?


Tags: django方法pyenv视图api应用程序settings
3条回答

正如@schillingt在评论中指出的,EnvironmentVarGuard是正确的方式。

from test.test_support import EnvironmentVarGuard # Python(2.7 < 3)
from test.support import EnvironmentVarGuard # Python >=3
from django.test import TestCase

class MyTestCase(TestCase):
    def setUp(self):
        self.env = EnvironmentVarGuard()
        self.env.set('VAR', 'value')

    def test_something(self):
        with self.env:
            # ... perform tests here ... #
            pass

这将在上下文对象with语句的持续时间内正确设置环境变量。

test.support.EnvironmentVarGuard是一个内部API,可以通过中断(向后不兼容)更改从一个版本更改到另一个版本。事实上,整个test包只供内部使用。在测试包文档页上明确声明,它用于核心库的内部测试,而不是公共API。(见下面的链接)

您应该在python的标准库中使用^{}。它可以用作上下文管理器、装饰器或类装饰器。请参阅下面从正式Python文档复制的示例代码。

import os
from unittest.mock import patch
with patch.dict('os.environ', {'newkey': 'newvalue'}):
    print(os.environ['newkey'])  # should print out 'newvalue'
    assert 'newkey' in os.environ  # should be True
assert 'newkey' not in os.environ  # should be True

更新:对于那些没有完全阅读文档并且可能错过了注释的人,请阅读更多的test包注释

https://docs.python.org/2/library/test.html

https://docs.python.org/3/library/test.html

使用EnvironmentVarGuard不是一个好的解决方案,因为它在某些环境中失败,在另一些环境中工作。请参见下面的示例。

Python3.6 environment on gitlab ci

一个更好的解决方案是erewok所建议的,它需要利用python3中的unittest.mock

假设使用unittest

from unittest.mock import patch
class TestCase(unittest.TestCase):

    def setUp(self):
        self.env = patch.dict('os.environ', {'hello':'world'})

    def test_scenario_1(self):
        with self.env:
            self.assertEqual(os.environ.get('hello'), 'world')

```

相关问题 更多 >