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

多线程环境下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()

关键说明

  1. 私有成员访问:Python会对类的私有成员(以双下划线开头)做名称修饰,所以需要通过_类名__成员名的形式访问,比如_A__lock、_A__atomic_method_1。
  2. Mock的side_effect:通过自定义函数作为side_effect,既可以记录调用顺序,也能选择是否保留原方法的执行逻辑。
  3. 顺序验证:通过收集调用日志列表,直接对比预期顺序即可完成验证,测试全程单线程执行,不会受多线程干扰。

内容的提问来源于stack exchange,提问作者User051209

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.12 17:30:12