目前我正在编写一些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 demo
和untested
。伟大的。(注意,我在导入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在设置环境变量之后完全重新导入每个测试函数?
我被困在那里两天了-慢慢地我怀疑测试是否值得麻烦-请证明我错了:)
感谢您的提示,Evert(conf模块中的变量设置在全局名称空间中,它们在附近)我想我现在已经知道了。
为了测试我的代码,我必须在设置环境变量后显式地重新导入
conf
。将./tests/test_demo.py
中的代码更改为这样做的诀窍是:谢谢你。
相关问题 更多 >
编程相关推荐