多线程环境下Python类方法调用顺序的单元测试实现
验证类方法中函数调用顺序的测试方案
针对类A的method_1()方法,要验证__lock.acquire() → __atomic_method_1() → __lock.release()的调用顺序,可通过unittest.mock工具实现,无需修改原类代码。以下是完整的测试实现:
测试代码实现
import unittest from unittest.mock import Mock from class_a import A class TestClassAMethodOrder(unittest.TestCase): def test_method_1_call_order(self): # 初始化类A实例 a_instance = A() # 初始化调用顺序日志 call_sequence = [] # 替换私有锁的acquire方法:记录调用并返回默认True def mock_acquire(): call_sequence.append("lock.acquire") return True a_instance._A__lock.acquire = Mock(side_effect=mock_acquire) # 替换私有锁的release方法:记录调用 def mock_release(): call_sequence.append("lock.release") a_instance._A__lock.release = Mock(side_effect=mock_release) # 替换原子方法:记录调用并保留原逻辑(可选,若无需原逻辑可删除原调用) original_atomic = a_instance._A__atomic_method_1 def mock_atomic(): call_sequence.append("__atomic_method_1") original_atomic() # 保留原方法执行,若测试仅关注顺序可注释此行 a_instance._A__atomic_method_1 = Mock(side_effect=mock_atomic) # 执行待测试方法 a_instance.method_1() # 验证调用顺序是否符合预期 self.assertEqual(call_sequence, ["lock.acquire", "__atomic_method_1", "lock.release"]) if __name__ == "__main__": unittest.main()
关键说明
- 私有成员访问:Python会对类的私有成员(以双下划线开头)做名称修饰,所以需要通过
_类名__成员名的形式访问,比如_A__lock、_A__atomic_method_1。 - Mock的side_effect:通过自定义函数作为
side_effect,既可以记录调用顺序,也能选择是否保留原方法的执行逻辑。 - 顺序验证:通过收集调用日志列表,直接对比预期顺序即可完成验证,测试全程单线程执行,不会受多线程干扰。
内容的提问来源于stack exchange,提问作者User051209
相关产品推荐
相关产品推荐

