Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/293.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python pytest模块使用os.environ-我如何正确测试它?_Python_Environment Variables_Pytest_Monkeypatching - Fatal编程技术网

Python pytest模块使用os.environ-我如何正确测试它?

Python pytest模块使用os.environ-我如何正确测试它?,python,environment-variables,pytest,monkeypatching,Python,Environment Variables,Pytest,Monkeypatching,目前我正在编写一些Webapp,但这次我想学习如何为它编写适当的测试(使用pytest):) 我经常看到的一种非常常见的模式是使用环境变量改变默认配置。 目前,我正在努力如何正确地测试这个 我准备了一些演示: ./app ./app/conf.py ./conftest.py ./run.py ./tests ./tests/test_demo.py 我的/app/conf.py如下所示: from os import environ DEMO = environ.get('DEMO', '

目前我正在编写一些Webapp,但这次我想学习如何为它编写适当的测试(使用pytest):)

我经常看到的一种非常常见的模式是使用环境变量改变默认配置。 目前,我正在努力如何正确地测试这个

我准备了一些演示:

./app
./app/conf.py
./conftest.py
./run.py
./tests
./tests/test_demo.py
我的
/app/conf.py
如下所示:

from os import environ

DEMO = environ.get('DEMO', 'demo')
TEST = environ.get('TEST', 'test')
启动
/run.py
显示设置确实是可更改的:

from os import environ

environ['DEMO'] = 'not a demo'
environ['TEST'] = 'untested'

from app import conf

if __name__ == '__main__':

    print(conf.DEMO)
    print(conf.TEST)
它按预期打印出
而不是演示
未测试
。伟大的(注意,我在导入
conf
之前设置了环境变量)

现在来看测试:
/conftest.py
当前为空,它只是帮助pytest在app文件夹中定位模块

/tests/test\u demo.py
包含以下内容:

def test_conf_defaults():
    from app import conf

    assert conf.DEMO == 'demo'
    assert conf.TEST == 'test'


def test_conf_changed(monkeypatch):
    monkeypatch.setenv('DEMO', 'tested demo')
    monkeypatch.setenv('TEST', 'demo test')

    from app import conf

    assert conf.DEMO == 'tested demo'
    assert conf.TEST == 'demo test'

    monkeypatch.undo()
如果我现在运行pytest,
test\u conf\u changed
会失败,原因是
'demo'='tested demo'
->monkeypatch函数没有修补环境

如果我交换两个测试函数(因此
test\u conf\u changed
首先运行),
test\u conf\u默认值
将因
“tested demo”==“demo”
而失败

我对它的解释是——第一次导入
conf
时,它会将初始设置粘贴在那里

设置环境变量后,我如何告诉pytest完全重新导入
conf
每个测试函数


我现在被困在那里两天了——慢慢地,我怀疑测试是否值得这么麻烦——请证明我错了:)

谢谢你的提示,Evert(conf模块中的变量设置在全局名称空间中,它们会粘住)——我想我现在明白了

要测试代码,我必须在设置环境变量后显式重新导入
conf
。将
/tests/test\u demo.py
中的代码更改为以下代码:

from importlib import reload

from app import conf


def test_conf_changed(monkeypatch):
    monkeypatch.setenv('DEMO', 'tested demo')
    monkeypatch.setenv('TEST', 'demo test')

    reload(conf)

    assert conf.DEMO == 'tested demo'
    assert conf.TEST == 'demo test'


def test_conf_defaults():

    reload(conf)

    assert conf.DEMO == 'demo'
    assert conf.TEST == 'test'

谢谢。

我不确定您想要实现什么:如果您想要运行测试,您可以运行
py.test
,它将获取所有
test.*.py
文件并运行其中的测试。如果你想要一个演示,你可以创建一个像
/demos/demo.py
这样的文件,然后作为演示运行。我不认为它们中的任何一个(当然不是pytest)都应该依赖于环境变量。是的,当您导入
conf
,并且conf模块中的变量设置在全局名称空间中时,它们会一直存在:在整个运行期间(python会话)只导入一个。如果您想继续阅读或设置env。变量,在conf.py中创建一个函数,如
updateenv()
,并在每次需要时从其他函数中运行该函数来更新env变量。我想要实现的是:config.py保留默认设置,但我想使它们可以更改。e、 g.存储临时文件的路径,等等。现在我想测试一下,如果赋值正确-我编写的演示只是为了stackoverflow-它与我的实际应用程序无关-它只是显示了基本原理。当然,pytest应该独立于环境变量。我希望pytest(本地)设置一些变量,然后(在conf.py中)测试我的代码,如果它使用这些变量的行为正确。。。