Pytest单测试用例通过但批量运行时模块导入测试失败求助
基于环境变量的模块导入逻辑测试问题
单独运行pytest test/test_module.py时测试通过,但运行pytest test/时测试失败,提示instance_class是DummyClass实例。
相关代码
test/conftest.py
import os from typing import Generator import pytest @pytest.fixture(scope="function") -> Generator[None, None, None]: some_env_var = os.getenv("ENV_VAR") os.environ["ENV_VAR"] = "True" yield None if some_env_var is not None: os.environ["ENV_VAR"] = some_env_var
src/my_package/module.py
import os # 假设RealClass和DummyClass已在该模块定义或导入 if os.getenv("ENV_VAR") == "True": instance_class = RealClass() else: instance_class = DummyClass()
test/test_module.py
import pytest import sys from my_package.module import RealClass def test_import_module(change_var_env): # 清除模块缓存并重新导入 if 'my_package.module' in sys.modules: del sys.modules['my_package.module'] from my_package.module import instance_class assert isinstance(instance_class, RealClass)
test/test_module_bis.py
import sys from my_package.module import DummyClass def test_import_module_bis(): # 清除模块缓存并重新导入 if 'my_package.module' in sys.modules: del sys.modules['my_package.module'] from my_package.module import instance_class assert isinstance(instance_class, DummyClass)
问题根源
Python模块导入后会被缓存到sys.modules字典中。当运行pytest test/时,测试用例执行顺序可能是test_module_bis.py先运行:此时环境变量未修改,模块被导入并创建DummyClass实例;后续test_module.py运行时,即便fixture修改了环境变量,模块已在缓存中,不会重新执行顶层if-else逻辑,导致instance_class还是之前的DummyClass实例。
解决方案
在每个测试用例导入目标模块前,从sys.modules中删除模块缓存,确保每次导入都重新执行模块顶层代码:
- 清除缓存时必须使用完整模块名(
my_package.module而非module),否则无法准确定位目标模块 - 避免使用
importlib.reload,因为它不会重新初始化模块顶层直接赋值的变量(比如instance_class),仅重新执行代码但已存在的变量不会被覆盖
内容的提问来源于stack exchange,提问作者VndC
相关产品推荐
相关产品推荐

