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

如何使用Mock Patch对Python特征提取计时代码进行单元测试?

问题场景

需要为以下Python代码编写单元测试:

def extract_features_from_bytes(self, binary: bytes) -> str:
    with TimingMetric("fx_time") as fx_timing_metric:
        fv = self.feature_extractor.extract_features_from_bytes(binary)
    if self.metrics_reporter:
        self.metrics_reporter.report_metric(fx_timing_metric)
    return fv

核心需求:

  • 用Mock模拟self.feature_extractor.extract_features_from_bytes方法,通过time.sleep模拟固定耗时
  • 验证上报的计时指标与模拟时长匹配
  • Mock MetricsReporter类,验证其上报行为
正确单元测试实现
import pytest
from unittest.mock import MagicMock
import time
# 替换为你的实际模块路径
from your_module import ClassifierBase, TimingMetric, MetricsReporter

@pytest.mark.classification
class TestClassifierBase:

    @pytest.fixture
    def test_classifier(self):
        # 初始化被测类实例
        classifier = ClassifierBase()
        
        # Mock特征提取器,模拟耗时1秒的特征提取过程
        mock_feature_extractor = MagicMock()
        def mock_extract(binary):
            time.sleep(1)
            return "mock_feature_vector"
        mock_feature_extractor.extract_features_from_bytes = mock_extract
        classifier.feature_extractor = mock_feature_extractor
        
        # Mock指标上报器
        mock_reporter = MagicMock(spec=MetricsReporter)
        classifier.metrics_reporter = mock_reporter
        
        return classifier, mock_reporter

    def test_extract_features_from_bytes(self, test_classifier):
        classifier, mock_reporter = test_classifier
        test_binary = b"test_sample_binary"

        # 执行被测方法
        feature_vector = classifier.extract_features_from_bytes(test_binary)

        # 验证特征提取结果正确
        assert feature_vector == "mock_feature_vector"
        # 验证特征提取方法被正确调用
        classifier.feature_extractor.extract_features_from_bytes.assert_called_once_with(test_binary)
        
        # 验证计时指标上报逻辑
        reported_timing_metric = mock_reporter.report_metric.call_args[0][0]
        # 确认指标名称正确
        assert reported_timing_metric.metric_name == "fx_time"
        # 由于sleep存在微小误差,用范围断言替代精确值
        assert abs(reported_timing_metric.get_metric_value() - 1000) < 50
关键优化点
  • 直接Mock依赖属性:不需要复杂的路径patch,直接给被测类实例的feature_extractor和metrics_reporter赋值Mock对象,逻辑更清晰
  • 模拟真实耗时:在Mock的特征提取方法中加入time.sleep,还原真实的计时场景
  • 容错式断言:考虑到系统调度的微小误差,用±50ms的范围判断计时值,避免测试不稳定
  • 全链路验证:覆盖返回值正确性、依赖方法调用、指标上报三个核心验证点

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.14 04:52:47