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

2024-04-29 03:13:41 发布

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

目前我正在编写一些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)

它按预期打印出not a demountested。伟大的。(注意,我在导入conf之前设置了环境变量)。

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

./tests/test_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_conf_changed失败,因为'demo' == 'tested demo'->;monkeypatch函数没有修补环境。

如果我交换两个测试函数(因此test_conf_changed首先运行),则test_conf_defaults将失败,并返回'tested demo' == 'demo'

我对它的解释是-第一次导入conf时,它与初始设置保持一致。。

如何让pytest在设置环境变量之后完全重新导入每个测试函数?

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


Tags: frompytestimportapppytestdemoconf
1条回答
网友
1楼 · 发布于 2024-04-29 03:13:41

感谢您的提示,Evert(conf模块中的变量设置在全局名称空间中,它们在附近)我想我现在已经知道了。

为了测试我的代码,我必须在设置环境变量后显式地重新导入conf。将./tests/test_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'

谢谢你。

相关问题 更多 >