test_context.py 3.91 KB
"""
测试RequestContext功能的简单脚本
"""

import sys
import os

# 添加项目根目录到Python路径
sys.path.insert(0, os.path.dirname(os.path.abspath(__file__)))

from context import RequestContext, RequestContextStage, create_request_context


def test_basic_context_functionality():
    """测试基本的context功能"""
    print("=== 测试基本RequestContext功能 ===")

    # 创建context
    context = create_request_context("test123", "user456")

    print(f"Request ID: {context.reqid}")
    print(f"User ID: {context.uid}")

    # 测试阶段计时
    context.start_stage(RequestContextStage.QUERY_PARSING)
    import time
    time.sleep(0.1)  # 模拟工作
    duration = context.end_stage(RequestContextStage.QUERY_PARSING)

    print(f"查询解析阶段耗时: {duration:.2f}ms")

    # 测试存储查询分析结果
    context.store_query_analysis(
        original_query="iphone 13",
        normalized_query="iphone 13",
        rewritten_query="apple iphone 13",
        detected_language="en"
    )

    # 测试存储中间结果
    context.store_intermediate_result('test_key', {'test': 'value'})

    # 获取摘要
    summary = context.get_summary()
    print("Context摘要:")
    print(f"  - 原始查询: {summary['query_analysis']['original_query']}")
    print(f"  - 检测语言: {summary['query_analysis']['detected_language']}")
    print(f"  - 阶段耗时: {summary['performance']['stage_timings_ms']}")

    print("✅ 基本功能测试通过\n")


def test_context_as_context_manager():
    """测试context作为上下文管理器的功能"""
    print("=== 测试上下文管理器功能 ===")

    # 使用上下文管理器
    with create_request_context("cm123", "user789") as context:
        context.start_stage(RequestContextStage.QUERY_PARSING)
        import time
        time.sleep(0.05)
        context.end_stage(RequestContextStage.QUERY_PARSING)

        context.start_stage(RequestContextStage.QUERY_BUILDING)
        time.sleep(0.03)
        context.end_stage(RequestContextStage.QUERY_BUILDING)

        print(f"Context ID: {context.reqid}")

    # 退出时会自动记录性能摘要
    print("✅ 上下文管理器测试通过\n")


def test_error_handling():
    """测试错误处理功能"""
    print("=== 测试错误处理功能 ===")

    context = create_request_context("error123")

    # 设置错误
    try:
        raise ValueError("这是一个测试错误")
    except Exception as e:
        context.set_error(e)

    print(f"有错误: {context.has_error()}")
    print(f"错误信息: {context.metadata['error_info']}")

    print("✅ 错误处理测试通过\n")


def test_performance_summary():
    """测试性能摘要功能"""
    print("=== 测试性能摘要功能 ===")

    context = create_request_context("perf123")

    # 模拟多个阶段
    stages = [
        RequestContextStage.QUERY_PARSING,
        RequestContextStage.BOOLEAN_PARSING,
        RequestContextStage.QUERY_BUILDING,
        RequestContextStage.ELASTICSEARCH_SEARCH,
        RequestContextStage.RESULT_PROCESSING
    ]

    import time
    durations = [50, 20, 80, 150, 30]  # 模拟各阶段耗时(ms)

    for stage, expected_duration in zip(stages, durations):
        context.start_stage(stage)
        time.sleep(expected_duration / 1000.0)  # 转换为秒
        context.end_stage(stage)

    # 设置总耗时
    context.performance_metrics.total_duration = sum(durations)

    # 计算百分比
    percentages = context.calculate_stage_percentages()

    print("各阶段耗时占比:")
    for stage, percentage in percentages.items():
        print(f"  - {stage}: {percentage}%")

    print("✅ 性能摘要测试通过\n")


if __name__ == "__main__":
    print("开始测试RequestContext功能...\n")

    test_basic_context_functionality()
    test_context_as_context_manager()
    test_error_handling()
    test_performance_summary()

    print("🎉 所有测试通过!RequestContext功能正常。")