我的主文件中有一个全局对象
# 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')
然而,当我在我的测试文件中import reporter
时,我得到了一个KeyError
,在env中缺少INFLUXCLOUD_HOST。
为什么pytest不执行setup_env
和monkeypatch我的环境?有办法吗?
答案 0 :(得分:3)
这里的问题在于误解会话范围的夹具是什么。
知道哪些测试& autoused fixtures确实存在,pytest需要导入测试文件& conftest插件。然后它扫描导入的模块,并寻找灯具和放大器。测试功能&测试课程&这在pytest术语中称为“集合”。
只有在收集完所有测试后,pytest才会决定执行它们,并安排执行计划,特别是在准备好灯具时。会话范围的装置首先准备好并在最后进行拆解 - 在任何测试开始之前,并且在所有测试完成之后。
然而,导入测试文件& conftest假定执行这些模块 - 作为导入任何其他Python模块,与pytest无关。
因此,当您从测试文件中执行import reporter
时,或者即使将该全局变量直接放入测试文件中,也会执行此模块,并尝试使用env变量。但是灯具还没有被执行(并且pytest还不知道它们的存在)。因此,它失败了。
即使您将从测试函数内部import reporter
,这也无济于事,因为pytest可能会在收集阶段之前尝试导入reporter.py
模块。由于缺少测试函数/类,Pytest会将其过滤掉,但导入尝试将完成并将失败。
这里最好的解决方案是将客户端“打包”到一个夹具中并使用该夹具而不是全局变量。