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
相关产品推荐
相关产品推荐

