如何使用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
相关产品推荐
相关产品推荐

