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

Python跨模块全局变量修改问题:测试中无法变更变量值

问题:无法在测试中修改Python全局变量使被测代码生效

项目结构

main.py
src/
  __init__.py
  foo.py
  variables.py
tests/
  __init__.py
  unit_test.py

注:__init__.py和main.py文件为空。

被测文件代码

src/foo.py

from src.variables import GLOBAL_VARIABLE


class Foo:
    def bar(self):
        print(f"foo :{id(GLOBAL_VARIABLE)}")
        if GLOBAL_VARIABLE:
            return 1
        return 2

src/variables.py

GLOBAL_VARIABLE = False
print(f"\norig:{id(GLOBAL_VARIABLE)}")

原测试代码(tests/unit_test.py)

import src.variables
from src.foo import Foo


def testFoo():
    src.variables.GLOBAL_VARIABLE = True
    print(f"\ntest:{id(src.variables.GLOBAL_VARIABLE)}")
    foo = Foo()
    assert foo.bar() == 1

运行pytest输出

orig:140734094465928
collected 1 item

tests\unit_test.py
test:140734094465896
foo :140734094465928

测试中修改src.variables.GLOBAL_VARIABLE的值后,被测代码Foo.bar()仍读取初始的False值,断言失败。因无法修改被测代码,需调整测试代码实现变量值的有效修改。


解决方案

问题根源:src/foo.py用from src.variables import GLOBAL_VARIABLE导入时,会在foo模块命名空间创建一个指向原变量的独立引用。测试中修改src.variables.GLOBAL_VARIABLE只是改变了variables模块内变量名的指向,但foo模块里的GLOBAL_VARIABLE仍指向最初的False对象。

只需直接修改foo模块中已导入的GLOBAL_VARIABLE引用,让它指向新的True对象即可。修改后的测试代码如下:

修改后的tests/unit_test.py

from src import foo
from src.foo import Foo


def testFoo():
    # 直接修改foo模块内的GLOBAL_VARIABLE引用
    foo.GLOBAL_VARIABLE = True
    foo_instance = Foo()
    assert foo_instance.bar() == 1

也可同时修改两个模块的变量(确保一致性):

import src.variables
from src import foo
from src.foo import Foo


def testFoo():
    src.variables.GLOBAL_VARIABLE = True
    foo.GLOBAL_VARIABLE = True
    foo_instance = Foo()
    assert foo_instance.bar() == 1

修改后,Foo.bar()访问的GLOBAL_VARIABLE会是更新后的True,断言可通过。

内容的提问来源于stack exchange,提问作者Matthieu Raynaud de Fitte

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.24 11:40:17