微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

如何在conftest.py中使用pytest对环境进行monkeypatch?

我的主文件中有一个全局对象

# reporter.py

from os import environ
from influxdb import InfluxDBClient

influxdb_client = InfluxDBClient(host=environ['INFLUXCLOUD_HOST'],
                                 username=environ['INFLUXCLOUD_USERNAME'],
                                 password=environ['INFLUXCLOUD_PASSWORD'],
                                 ssl=True,
                                 timeout=4*60)

def foo():
    pass

我正在使用pytest,我想为这些环境变量设置虚假值.我的conftest.py中有以下内容

# conftest.py

import pytest

@pytest.fixture(scope='session', autouse=True)
def setup_env(monkeypatch):
    monkeypatch.setenv('INFLUXCLOUD_HOST', 'host')
    monkeypatch.setenv('INFLUXCLOUD_USERNAME', 'username')
    monkeypatch.setenv('INFLUXCLOUD_PASSWORD', 'password')

但是,当我在我的测试文件中导入记者时,我得到一个KeyError,即env中缺少INFLUXCLOUD_HOST.

为什么pytest不执行setup_env和monkeypatch我的环境?有办法吗?

解决方法:

这里的问题在于误解会话范围的夹具是什么.

要知道哪些测试& autoused fixtures确实存在,pytest需要导入测试文件& conftest插件.然后它扫描导入的模块,并寻找灯具和放大器.测试功能&测试课程&这在pytest术语中称为“集合”.

只有在收集完所有测试之后,pytest才会决定执行它们,并安排执行计划,特别是在准备好灯具时.会话范围的装置首先准备好并在最后进行拆解 – 在任何测试开始之前,并且在所有测试完成之后.

但是,导入测试文件& conftest假定执行这些模块 – 作为导入任何其他python模块,与pytest无关.

因此,当您从测试文件中导入记者时,或者即使将该全局变量直接放入测试文件中,也会执行此模块,并尝试使用env变量.但是灯具还没有被执行(并且pytest还不知道它们的存在).因此,它失败了.

即使您将从测试函数内部导入记者,这也无济于事,因为pytest可能会在收集阶段之前尝试导入该reporter.py模块.由于缺少测试函数/类,Pytest会将其过滤掉,但导入尝试将完成并将失败.

这里最好的解决方案是将客户端“打包”到一个夹具中并使用该夹具而不是全局变量.

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。

相关推荐