使用mock.patch为不同模块的random.random设置不同返回值失败排查
问题:按模块Mock random.random()时返回值不符合预期
场景与代码
我在给依赖random.random()的类写单元测试,想给不同模块的random.random()设置不同固定返回值,保证测试结果稳定,但实际测试中两个模块的返回值完全一致,触发了断言错误。
模块代码
modul1.py:
import random def function(): return random.random()
modul2.py:
import random def function(): return random.random()
测试代码
def test_function(): with mock.patch('modul1.random.random', return_value=1), \ mock.patch('modul2.random.random', return_value=0): val1 = modul1.function() val2 = modul2.function() assert not val1 == val2
预期与实际结果
- 预期:
val1=1、val2=0,测试通过 - 实际:触发断言错误
assert not 0 == 0
原因与解决方法
问题根源
Python里模块是单实例的,modul1.random和modul2.random指向的是同一个全局random模块对象。你patch的modul1.random.random和modul2.random.random其实是同一个函数,最后一次patch的返回值(0)会覆盖之前的设置,所以两个模块调用的都是被最后修改后的函数。
解决步骤
修改模块的导入方式:把
random.random直接导入到模块的命名空间,而不是导入整个random模块
修改modul1.py:from random import random def function(): return random()修改
modul2.py:from random import random def function(): return random()修改测试代码的patch目标:现在直接patch模块内导入的
random对象即可def test_function(): with mock.patch('modul1.random', return_value=1), \ mock.patch('modul2.random', return_value=0): val1 = modul1.function() val2 = modul2.function() assert not val1 == val2
这样每个模块的random是各自命名空间里的独立引用,patch时不会互相覆盖,就能得到预期的不同返回值。
内容的提问来源于stack exchange,提问作者chochf
相关产品推荐
相关产品推荐

