{ "total_score": 95, "max_score": 100, "passed": true, "target": 95, "dimensions": { "functionality": { "score": 30, "max": 30, "details": [ { "test": "get_trending", "score": 8, "max": 8 }, { "test": "get_multi_region_trending", "score": 7, "max": 7 }, { "test": "extract_video_info", "score": 5, "max": 5 }, { "test": "save_to_json", "score": 5, "max": 5 }, { "test": "save_to_csv", "score": 5, "max": 5 } ] }, "code_quality": { "score": 23, "max": 25, "details": [ { "test": "class_structure", "score": 5, "max": 5 }, { "test": "exception_handling", "score": 8, "max": 8 }, { "test": "logging", "score": 5, "max": 5 }, { "test": "comments", "score": 2, "max": 4 }, { "test": "type_annotations", "score": 3, "max": 3 } ] }, "api_usage": { "score": 18, "max": 20, "details": [ { "test": "environment_variables", "score": 5, "max": 5 }, { "test": "quota_awareness", "score": 5, "max": 5 }, { "test": "pagination", "score": 3, "max": 5 }, { "test": "error_code_handling", "score": 5, "max": 5 } ] }, "data_completeness": { "score": 15, "max": 15, "details": [ { "test": "required_fields", "score": 8, "max": 8 }, { "test": "data_format", "score": 4, "max": 4 }, { "test": "data_cleaning", "score": 3, "max": 3 } ] }, "extensibility": { "score": 9, "max": 10, "details": [ { "test": "multi_region_support", "score": 3, "max": 4 }, { "test": "category_filter", "score": 3, "max": 3 }, { "test": "configurability", "score": 3, "max": 3 } ] } }, "timestamp": "2026-04-09T10:45:18.778Z", "logs": [ { "time": "2026-04-09T10:45:18.466Z", "level": "info", "message": "========================================" }, { "time": "2026-04-09T10:45:18.467Z", "level": "info", "message": "YouTube Crawler Benchmark Test" }, { "time": "2026-04-09T10:45:18.467Z", "level": "info", "message": "基于 benchmark.md 评分标准" }, { "time": "2026-04-09T10:45:18.467Z", "level": "info", "message": "========================================" }, { "time": "2026-04-09T10:45:18.467Z", "level": "info", "message": "开始时间: 2026-04-09T10:45:18.467Z" }, { "time": "2026-04-09T10:45:18.467Z", "level": "info", "message": "强制 Mock 模式: true" }, { "time": "2026-04-09T10:45:18.467Z", "level": "info", "message": "" }, { "time": "2026-04-09T10:45:18.468Z", "level": "info", "message": "╔══════════════════════════════════════╗" }, { "time": "2026-04-09T10:45:18.468Z", "level": "info", "message": "║ 维度1: 功能完整性 (30分) ║" }, { "time": "2026-04-09T10:45:18.468Z", "level": "info", "message": "╚══════════════════════════════════════╝" }, { "time": "2026-04-09T10:45:18.468Z", "level": "info", "message": "\n--- 测试: get_trending() 方法 (8分) ---" }, { "time": "2026-04-09T10:45:18.468Z", "level": "info", "message": "✅ 成功返回视频数组" }, { "time": "2026-04-09T10:45:18.468Z", "level": "info", "message": "✅ maxResults 参数生效" }, { "time": "2026-04-09T10:45:18.468Z", "level": "info", "message": "✅ 视频包含 videoId" }, { "time": "2026-04-09T10:45:18.468Z", "level": "info", "message": "得分: 8/8" }, { "time": "2026-04-09T10:45:18.468Z", "level": "info", "message": "\n--- 测试: get_multi_region_trending() 方法 (7分) ---" }, { "time": "2026-04-09T10:45:18.774Z", "level": "info", "message": "✅ 返回对象结构" }, { "time": "2026-04-09T10:45:18.774Z", "level": "info", "message": "✅ US 地区数据正确" }, { "time": "2026-04-09T10:45:18.774Z", "level": "info", "message": "✅ 多地区支持正常" }, { "time": "2026-04-09T10:45:18.774Z", "level": "info", "message": "✅ 所有请求的地区都有结果" }, { "time": "2026-04-09T10:45:18.774Z", "level": "info", "message": "得分: 7/7" }, { "time": "2026-04-09T10:45:18.775Z", "level": "info", "message": "\n--- 测试: extract_video_info() 方法 (5分) ---" }, { "time": "2026-04-09T10:45:18.775Z", "level": "info", "message": "✅ 所有必需字段存在" }, { "time": "2026-04-09T10:45:18.775Z", "level": "info", "message": "✅ videoId 正确提取" }, { "time": "2026-04-09T10:45:18.775Z", "level": "info", "message": "✅ URL 正确构建" }, { "time": "2026-04-09T10:45:18.775Z", "level": "info", "message": "✅ viewCount 正确解析为数字" }, { "time": "2026-04-09T10:45:18.775Z", "level": "info", "message": "得分: 5/5" }, { "time": "2026-04-09T10:45:18.775Z", "level": "info", "message": "\n--- 测试: save_to_json() 方法 (5分) ---" }, { "time": "2026-04-09T10:45:18.775Z", "level": "info", "message": "✅ 文件成功创建" }, { "time": "2026-04-09T10:45:18.775Z", "level": "info", "message": "✅ JSON 格式正确" }, { "time": "2026-04-09T10:45:18.775Z", "level": "info", "message": "✅ 文件写入完整" }, { "time": "2026-04-09T10:45:18.775Z", "level": "info", "message": "得分: 5/5" }, { "time": "2026-04-09T10:45:18.775Z", "level": "info", "message": "\n--- 测试: save_to_csv() 方法 (5分) ---" }, { "time": "2026-04-09T10:45:18.776Z", "level": "info", "message": "✅ CSV 文件成功创建" }, { "time": "2026-04-09T10:45:18.776Z", "level": "info", "message": "✅ CSV 包含表头和数据行" }, { "time": "2026-04-09T10:45:18.776Z", "level": "info", "message": "✅ CSV 表头正确" }, { "time": "2026-04-09T10:45:18.776Z", "level": "info", "message": "得分: 5/5" }, { "time": "2026-04-09T10:45:18.776Z", "level": "info", "message": "\n╔══════════════════════════════════════╗" }, { "time": "2026-04-09T10:45:18.776Z", "level": "info", "message": "║ 维度2: 代码质量 (25分) ║" }, { "time": "2026-04-09T10:45:18.776Z", "level": "info", "message": "╚══════════════════════════════════════╝" }, { "time": "2026-04-09T10:45:18.776Z", "level": "info", "message": "\n--- 测试: 类结构清晰 (5分) ---" }, { "time": "2026-04-09T10:45:18.776Z", "level": "info", "message": "✅ YouTubeTrendingCrawler 类已定义" }, { "time": "2026-04-09T10:45:18.776Z", "level": "info", "message": "✅ 构造函数存在" }, { "time": "2026-04-09T10:45:18.776Z", "level": "info", "message": "✅ 所有必需方法存在" }, { "time": "2026-04-09T10:45:18.776Z", "level": "info", "message": "得分: 5/5" }, { "time": "2026-04-09T10:45:18.776Z", "level": "info", "message": "\n--- 测试: 异常处理 (8分) ---" }, { "time": "2026-04-09T10:45:18.776Z", "level": "info", "message": "✅ 包含 5 个 try-catch 块" }, { "time": "2026-04-09T10:45:18.776Z", "level": "info", "message": "✅ 输入验证方法存在" }, { "time": "2026-04-09T10:45:18.776Z", "level": "info", "message": "✅ 网络响应检查" }, { "time": "2026-04-09T10:45:18.776Z", "level": "info", "message": "✅ API 错误码处理" }, { "time": "2026-04-09T10:45:18.776Z", "level": "info", "message": "得分: 8/8" }, { "time": "2026-04-09T10:45:18.776Z", "level": "info", "message": "\n--- 测试: 日志记录 (5分) ---" }, { "time": "2026-04-09T10:45:18.776Z", "level": "info", "message": "✅ 日志方法存在" }, { "time": "2026-04-09T10:45:18.776Z", "level": "info", "message": "✅ 日志记录工作正常" }, { "time": "2026-04-09T10:45:18.776Z", "level": "info", "message": "✅ 日志包含必要字段" }, { "time": "2026-04-09T10:45:18.776Z", "level": "info", "message": "得分: 5/5" }, { "time": "2026-04-09T10:45:18.776Z", "level": "info", "message": "\n--- 测试: 代码注释 (4分) ---" }, { "time": "2026-04-09T10:45:18.776Z", "level": "info", "message": "✅ 包含 20 个 JSDoc 注释" }, { "time": "2026-04-09T10:45:18.776Z", "level": "info", "message": "得分: 2/4" }, { "time": "2026-04-09T10:45:18.776Z", "level": "info", "message": "\n--- 测试: 类型提示 (3分) ---" }, { "time": "2026-04-09T10:45:18.776Z", "level": "info", "message": "✅ 包含 JSDoc 类型注解" }, { "time": "2026-04-09T10:45:18.776Z", "level": "info", "message": "✅ 参数类型有说明" }, { "time": "2026-04-09T10:45:18.776Z", "level": "info", "message": "得分: 3/3" }, { "time": "2026-04-09T10:45:18.776Z", "level": "info", "message": "\n╔══════════════════════════════════════╗" }, { "time": "2026-04-09T10:45:18.776Z", "level": "info", "message": "║ 维度3: API 使用规范 (20分) ║" }, { "time": "2026-04-09T10:45:18.776Z", "level": "info", "message": "╚══════════════════════════════════════╝" }, { "time": "2026-04-09T10:45:18.777Z", "level": "info", "message": "\n--- 测试: 环境变量读取 (5分) ---" }, { "time": "2026-04-09T10:45:18.777Z", "level": "info", "message": "✅ 从环境变量读取 API Key" }, { "time": "2026-04-09T10:45:18.777Z", "level": "info", "message": "✅ 支持 Mock 环境变量" }, { "time": "2026-04-09T10:45:18.777Z", "level": "info", "message": "得分: 5/5" }, { "time": "2026-04-09T10:45:18.777Z", "level": "info", "message": "\n--- 测试: 配额意识 (5分) ---" }, { "time": "2026-04-09T10:45:18.777Z", "level": "info", "message": "✅ 配额追踪属性存在" }, { "time": "2026-04-09T10:45:18.777Z", "level": "info", "message": "✅ 配额检查方法存在" }, { "time": "2026-04-09T10:45:18.777Z", "level": "info", "message": "✅ 配额限制说明" }, { "time": "2026-04-09T10:45:18.777Z", "level": "info", "message": "得分: 5/5" }, { "time": "2026-04-09T10:45:18.777Z", "level": "info", "message": "\n--- 测试: 分页处理 (5分) ---" }, { "time": "2026-04-09T10:45:18.777Z", "level": "info", "message": "✅ 分页参数支持" }, { "time": "2026-04-09T10:45:18.777Z", "level": "info", "message": "得分: 3/5" }, { "time": "2026-04-09T10:45:18.777Z", "level": "info", "message": "\n--- 测试: 错误码处理 (5分) ---" }, { "time": "2026-04-09T10:45:18.777Z", "level": "info", "message": "✅ 403 错误处理" }, { "time": "2026-04-09T10:45:18.777Z", "level": "info", "message": "✅ 429 错误处理" }, { "time": "2026-04-09T10:45:18.777Z", "level": "info", "message": "✅ 400 错误处理" }, { "time": "2026-04-09T10:45:18.777Z", "level": "info", "message": "得分: 5/5" }, { "time": "2026-04-09T10:45:18.777Z", "level": "info", "message": "\n╔══════════════════════════════════════╗" }, { "time": "2026-04-09T10:45:18.777Z", "level": "info", "message": "║ 维度4: 数据完整性 (15分) ║" }, { "time": "2026-04-09T10:45:18.777Z", "level": "info", "message": "╚══════════════════════════════════════╝" }, { "time": "2026-04-09T10:45:18.777Z", "level": "info", "message": "\n--- 测试: 必需字段 (8分) ---" }, { "time": "2026-04-09T10:45:18.777Z", "level": "info", "message": "✅ 视频包含所有必需字段" }, { "time": "2026-04-09T10:45:18.777Z", "level": "info", "message": "✅ videoId 格式正确" }, { "time": "2026-04-09T10:45:18.777Z", "level": "info", "message": "✅ viewCount 是数字类型" }, { "time": "2026-04-09T10:45:18.777Z", "level": "info", "message": "✅ thumbnails 结构正确" }, { "time": "2026-04-09T10:45:18.777Z", "level": "info", "message": "得分: 8/8" }, { "time": "2026-04-09T10:45:18.777Z", "level": "info", "message": "\n--- 测试: 数据格式 (4分) ---" }, { "time": "2026-04-09T10:45:18.777Z", "level": "info", "message": "✅ JSON 结构可序列化" }, { "time": "2026-04-09T10:45:18.777Z", "level": "info", "message": "✅ URL 格式正确" }, { "time": "2026-04-09T10:45:18.777Z", "level": "info", "message": "得分: 4/4" }, { "time": "2026-04-09T10:45:18.777Z", "level": "info", "message": "\n--- 测试: 数据清洗 (3分) ---" }, { "time": "2026-04-09T10:45:18.778Z", "level": "info", "message": "✅ 空值处理逻辑" }, { "time": "2026-04-09T10:45:18.778Z", "level": "info", "message": "✅ 字符串清理" }, { "time": "2026-04-09T10:45:18.778Z", "level": "info", "message": "✅ 数字解析容错" }, { "time": "2026-04-09T10:45:18.778Z", "level": "info", "message": "得分: 3/3" }, { "time": "2026-04-09T10:45:18.778Z", "level": "info", "message": "\n╔══════════════════════════════════════╗" }, { "time": "2026-04-09T10:45:18.778Z", "level": "info", "message": "║ 维度5: 扩展性 (10分) ║" }, { "time": "2026-04-09T10:45:18.778Z", "level": "info", "message": "╚══════════════════════════════════════╝" }, { "time": "2026-04-09T10:45:18.778Z", "level": "info", "message": "\n--- 测试: 多地区支持 (4分) ---" }, { "time": "2026-04-09T10:45:18.778Z", "level": "info", "message": "✅ 支持地区: US" }, { "time": "2026-04-09T10:45:18.778Z", "level": "info", "message": "✅ 支持地区: JP" }, { "time": "2026-04-09T10:45:18.778Z", "level": "info", "message": "✅ 支持地区: KR" }, { "time": "2026-04-09T10:45:18.778Z", "level": "info", "message": "得分: 3/4" }, { "time": "2026-04-09T10:45:18.778Z", "level": "info", "message": "\n--- 测试: 分类过滤 (3分) ---" }, { "time": "2026-04-09T10:45:18.778Z", "level": "info", "message": "✅ videoCategoryId 参数支持" }, { "time": "2026-04-09T10:45:18.778Z", "level": "info", "message": "✅ 分类过滤功能可用" }, { "time": "2026-04-09T10:45:18.778Z", "level": "info", "message": "得分: 3/3" }, { "time": "2026-04-09T10:45:18.778Z", "level": "info", "message": "\n--- 测试: 可配置性 (3分) ---" }, { "time": "2026-04-09T10:45:18.778Z", "level": "info", "message": "✅ 构造函数接受配置选项" }, { "time": "2026-04-09T10:45:18.778Z", "level": "info", "message": "✅ 丰富的配置参数" }, { "time": "2026-04-09T10:45:18.778Z", "level": "info", "message": "✅ 方法参数可配置" }, { "time": "2026-04-09T10:45:18.778Z", "level": "info", "message": "得分: 3/3" }, { "time": "2026-04-09T10:45:18.778Z", "level": "info", "message": "\n========================================" }, { "time": "2026-04-09T10:45:18.778Z", "level": "info", "message": "负例测试 (错误处理)" }, { "time": "2026-04-09T10:45:18.778Z", "level": "info", "message": "========================================" }, { "time": "2026-04-09T10:45:18.778Z", "level": "info", "message": "✅ 正确处理无效地区代码" }, { "time": "2026-04-09T10:45:18.778Z", "level": "info", "message": "✅ 正确处理无效 maxResults" }, { "time": "2026-04-09T10:45:18.778Z", "level": "info", "message": "✅ 正确处理无效视频数据" }, { "time": "2026-04-09T10:45:18.778Z", "level": "info", "message": "\n========================================" }, { "time": "2026-04-09T10:45:18.778Z", "level": "info", "message": "评分汇总" }, { "time": "2026-04-09T10:45:18.778Z", "level": "info", "message": "========================================" }, { "time": "2026-04-09T10:45:18.778Z", "level": "info", "message": "功能完整性: 30/30" }, { "time": "2026-04-09T10:45:18.778Z", "level": "info", "message": "代码质量: 23/25" }, { "time": "2026-04-09T10:45:18.778Z", "level": "info", "message": "API 使用规范: 18/20" }, { "time": "2026-04-09T10:45:18.778Z", "level": "info", "message": "数据完整性: 15/15" }, { "time": "2026-04-09T10:45:18.778Z", "level": "info", "message": "扩展性: 9/10" }, { "time": "2026-04-09T10:45:18.778Z", "level": "info", "message": "----------------------------------------" }, { "time": "2026-04-09T10:45:18.778Z", "level": "info", "message": "总分: 95/100" }, { "time": "2026-04-09T10:45:18.778Z", "level": "info", "message": "目标: ≥ 95" }, { "time": "2026-04-09T10:45:18.778Z", "level": "info", "message": "结果: ✅ 通过" }, { "time": "2026-04-09T10:45:18.778Z", "level": "info", "message": "========================================" } ], "weak_dimensions": [] }