You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.06 02:46:18