diff --git a/docs/UI自动化测试计划.docx b/docs/UI自动化测试计划.docx index 62ad745..6aaa311 100644 Binary files a/docs/UI自动化测试计划.docx and b/docs/UI自动化测试计划.docx differ diff --git a/docs/generate_test_plan.py b/docs/generate_test_plan.py index fb0c44f..e56861e 100644 --- a/docs/generate_test_plan.py +++ b/docs/generate_test_plan.py @@ -79,7 +79,8 @@ doc.add_heading('1. 项目概述', level=1) doc.add_heading('1.1 背景', level=2) doc.add_paragraph( 'SwitchBot App 涵盖 100+ 款 IoT 设备,需要对每款设备的 App 功能进行自动化回归测试。' - '本计划基于已验证的 Vitest + Appium 技术框架,按品类批量推进覆盖所有设备。' + '本计划基于已验证的 Vitest + Appium 技术框架,按优先级分层推进:' + '必测项 → 单品探索 → 全功能 → 平台,高优先级层先达标再投入下一层。' ) doc.add_heading('1.2 技术栈', level=2) @@ -104,10 +105,11 @@ rows = [ add_table_with_header(doc, ['设备', '脚本文件数', '覆盖模块', '通过率'], rows) doc.add_heading('1.4 目标', level=2) -doc.add_paragraph('• 覆盖 82 款未自动化设备的核心功能测试') -doc.add_paragraph('• 实现设备添加流程自动化(需串口配合)') -doc.add_paragraph('• 覆盖通用自动化/场景联动测试') -doc.add_paragraph('• 总工期 16 周,覆盖率目标 100%') +doc.add_paragraph('• P0 必测项:各单品添加 + 核心控制(双协议)准入闸门,来源 ONES 必测项-AI自动化') +doc.add_paragraph('• P1 单品探索:82 款单品主流程冒烟,覆盖广度') +doc.add_paragraph('• P2 全功能:全维度回归(card/control/setting/scene/logs),覆盖深度') +doc.add_paragraph('• P3 平台:账号/房间/消息/家庭分享/场景等平台功能') +doc.add_paragraph('• 按优先级 backlog 依次交付,各层有独立退出标准(不绑定固定周次)') doc.add_page_break() @@ -238,240 +240,240 @@ doc.add_page_break() # ======================== 3. 测试维度说明 ======================== doc.add_heading('3. 测试维度说明', level=1) -doc.add_paragraph('每款设备根据功能复杂度,覆盖以下测试维度:') +doc.add_paragraph('每款设备根据功能复杂度,覆盖以下测试维度。人力预估基于 AI 辅助(Claude Code 边跑边写):首台需建模分析,同品类复用台仅改配置,工时约减半或更低。') rows = [ - ('card', '{device}_card.test.ts', '首页卡片展示与交互', '3-5', '所有设备'), - ('control', '{device}_control.test.ts', '功能页核心操作(开关/模式/参数调节)', '8-20', '所有设备'), - ('setting', '{device}_setting.test.ts', '设备设置页(名称/房间/固件/信息)', '5-8', '所有设备'), - ('connect', '{device}_connect.test.ts', '设备添加/配对流程', '3-5', 'Phase 4'), - ('scene', '{device}_scene.test.ts', '自动化/场景联动', '3-8', 'Phase 4'), - ('logs', '{device}_logs.test.ts', '操作日志查看', '2-4', '可选'), + ('card', '{device}_card.test.ts', '首页卡片展示与交互', '3-5', 'P1 / P2', '0.3 / 0.1'), + ('control', '{device}_control.test.ts', '功能页核心操作(开关/模式/参数调节)', '8-20', 'P0 / P1 / P2', '1.0 / 0.3'), + ('setting', '{device}_setting.test.ts', '设备设置页(名称/房间/固件/信息)', '5-8', 'P2', '0.5 / 0.2'), + ('connect', '{device}_connect.test.ts', '设备添加/配对流程', '3-5', 'P0 / P2', '0.5 / 0.2'), + ('scene', '{device}_scene.test.ts', '自动化/场景联动', '3-8', 'P3', '0.5 / 0.2'), + ('logs', '{device}_logs.test.ts', '操作日志查看', '2-4', 'P2(可选)', '0.2 / 0.1'), ] add_table_with_header(doc, - ['维度', '文件命名', '内容', '用例数', '适用阶段'], - rows + ['维度', '文件命名', '内容', '用例数', '优先级层', 'AI预估(人日:首台/复用)'], + rows, + col_widths=[1.3, 3.8, 4.2, 1.2, 2, 3] ) doc.add_paragraph() doc.add_paragraph('用例数量估算:每设备平均 25-40 条,82款设备总计约 2000-3000 条自动化用例。') +doc.add_paragraph('AI 提效口径:单维度脚本首台 0.2-1 人日、复用台 0.1-0.3 人日;串口添加框架为一次性投入(见 §5.2)。下列各层人力预估均按此口径,单位为人日(1 人)。') doc.add_page_break() -# ======================== 4. Phase 1 ======================== -doc.add_heading('4. Phase 1: 高复用品类调试(W1-W4)', level=1) +# ======================== 4. 测试优先级分层 ======================== +doc.add_heading('4. 测试优先级分层', level=1) doc.add_paragraph( - '策略:同品类 UI 高度相似,已有脚本模板。每周选定一个品类,' - '调通首台设备后,通过修改设备名称配置快速扩展到同品类其他型号。' + '本计划按优先级分四层推进,依次为:必测项 → 单品探索 → 全功能 → 平台。' + '高优先级层先达标再投入下一层;不绑定固定周次,按相对工作量排 backlog。' ) rows = [ - ('W1', '窗帘系列', '9', '用例脚本×9、通用curtain_helper', '~225', '1人'), - ('W2', '锁系列', '12', '用例脚本×12、通用lock_helper', '~360', '1人'), - ('W3', '插座+开关', '6', '用例脚本×6、通用relay_helper', '~150', '1人'), - ('W4', '灯光系列', '10', '用例脚本×10、通用light_helper', '~250', '1人'), + ('P0 必测项', '各单品添加 + 核心控制(双协议)', 'ONES 必测项-AI自动化 (CQz9YCNX)', '187', '每次提测/版本必跑', '通过率≥95%'), + ('P1 单品探索', '每单品主流程冒烟(card+核心control)', '按单品模板', '82款各1遍', '每迭代', '全单品冒烟通过'), + ('P2 全功能', '全维度回归(card/control/setting/scene/logs)', '各品类用例库', '~2366', '版本回归', '通过率≥85%'), + ('P3 平台', '账号/房间/消息/家庭分享/场景等平台功能', 'App平台用例库', '平台模块', '版本回归', '平台用例通过'), ] add_table_with_header(doc, - ['周次', '品类', '设备数', '输出内容', '用例数', '人力'], - rows + ['优先级', '范围', '来源', '用例量', '运行频率', '退出标准'], + rows, + col_widths=[2.2, 4, 3.5, 1.3, 2.5, 2.5] ) -doc.add_paragraph() -p = doc.add_paragraph() -p.add_run('里程碑:').bold = True -p.add_run(' 第4周末交付 37 款设备自动化脚本,覆盖率提升至 45%') - -doc.add_heading('W1 窗帘系列详细计划', level=2) -doc.add_paragraph('• Day 1-2: 调通 Curtain Rod 全套脚本(card/control/setting)') -doc.add_paragraph('• Day 3: 验证 Curtain U Rail / Curtain 3 复用性,修复差异') -doc.add_paragraph('• Day 4-5: 批量扩展到9款,整理通用 curtain_helper.ts') -doc.add_paragraph('• 通用 helper 内容: 窗帘位置控制、校准流程、定时器操作、群组控制') - -doc.add_heading('W2 锁系列详细计划', level=2) -doc.add_paragraph('• Day 1-3: 调通 Lock (JP) 全套脚本(含密码管理、开锁记录)') -doc.add_paragraph('• Day 4: Lock Pro 系列扩展(指纹/NFC额外功能)') -doc.add_paragraph('• Day 5: Lock Ultra / Vision Deadbolt 新UI适配') -doc.add_paragraph('• 通用 helper 内容: 密码管理、开锁方式切换、自动锁定设置、电量监控') - -doc.add_heading('W3 插座+开关详细计划', level=2) -doc.add_paragraph('• Day 1-2: 调通 Plug Mini 脚本(开关/定时/功率监控)') -doc.add_paragraph('• Day 3-4: Relay Switch 系列适配') -doc.add_paragraph('• Day 5: 通用 relay_helper 整理') -doc.add_paragraph('• 通用 helper 内容: 开关操作、定时器、功率/电量统计、过载保护') - -doc.add_heading('W4 灯光系列详细计划', level=2) -doc.add_paragraph('• Day 1-2: Strip Light 系列调通(亮度/色温/颜色/模式)') -doc.add_paragraph('• Day 3: Ceiling Light 调通') -doc.add_paragraph('• Day 4-5: Floor Lamp / Candle Lamp / Outdoor Lights 扩展') -doc.add_paragraph('• 通用 helper 内容: RGB颜色控制、亮度调节、模式切换、渐变设置') - doc.add_page_break() -# ======================== 5. Phase 2 ======================== -doc.add_heading('5. Phase 2: 中等复杂度(W5-W8)', level=1) +# ======================== 5. P0 必测项 ======================== +doc.add_heading('5. P0 必测项(最高优先)', level=1) doc.add_paragraph( - '策略:这些品类功能较复杂或有较大UI差异,每周处理一个品类。' - '扫地机需要处理地图和清扫模式,传感器需要读取数据图表。' + '必测项是提测/版本更新的准入闸门,来源 ONES 测试计划「必测项-AI自动化」(plan CQz9YCNX / lib EPfZfC9Y),' + '映射清单见 test-plan/must-test.manifest.ts,转换规则见 prompts/must_test_conversion.md。' ) +doc.add_heading('5.1 必测项构成', level=2) rows = [ - ('W5', '扫地机系列', '9', '用例脚本×9、robot_helper增强', '~270', '1-2人'), - ('W6', '传感器+温控', '7', '用例脚本×7、sensor_helper', '~175', '1人'), - ('W7', '风扇+空净+加湿', '6', '用例脚本×6、climate_helper', '~150', '1人'), - ('W8', '摄像头+门铃+OSC', '3', '用例脚本×3、复用camera框架', '~90', '1人'), + ('添加 (connect)', '每单品型号一条「添加X验证」', '73', 'connect 维度,需串口配合'), + ('单品功能 (feature)', '绑定手持/学习遥控器/keypad密码指纹/温湿度单位等', '9', 'control/setting 维度'), + ('控制 (control)', '2条协议超级用例逐 step:BLE 49 + WiFi 56', '105', 'control 维度,双协议各跑一遍'), ] -add_table_with_header(doc, - ['周次', '品类', '设备数', '输出内容', '用例数', '人力'], - rows -) - +add_table_with_header(doc, ['类型', '说明', '条数', '落点/备注'], rows) doc.add_paragraph() p = doc.add_paragraph() -p.add_run('里程碑:').bold = True -p.add_run(' 第8周末交付 25 款设备,累计覆盖率提升至 76%') +p.add_run('合计:').bold = True +p.add_run('187 条(另 2 条 na:safety alarm 无目录、强绑定解绑归平台)。控制粒度在 step,按 (用例号#step)+协议精确回写 ONES。') -doc.add_heading('W5 扫地机系列重点', level=2) -doc.add_paragraph('• S1/S1P: 基础吸力模式、边刷/滚刷状态') -doc.add_paragraph('• K10+Pro/K11+: 地图管理、禁区设置、多楼层') -doc.add_paragraph('• K20+/S20: 新一代UI - 自清洁基站控制、拖布清洗') -doc.add_paragraph('• 难点: 地图加载需等待、清扫区域选择涉及画布操作') - -doc.add_heading('W6 传感器+温控重点', level=2) -doc.add_paragraph('• Meter Pro: 温湿度数据展示、历史图表、告警设置') -doc.add_paragraph('• Presence Sensor: 人体存在检测、灵敏度调节') -doc.add_paragraph('• Weather Station: 多传感器数据聚合展示') -doc.add_paragraph('• 难点: 数据图表验证需截图比对或文本提取') - -doc.add_heading('W7 风扇+空净+加湿重点', level=2) -doc.add_paragraph('• Fan: 风速/模式/摇头/定时') -doc.add_paragraph('• Air Purifier: 空气质量指标、滤网寿命、自动模式') -doc.add_paragraph('• Humidifier: 湿度目标、加湿模式、水箱状态') - -doc.add_heading('W8 摄像头+门铃重点', level=2) -doc.add_paragraph('• 猫狗定制款: 复用Camera脚本,验证宠物检测功能') -doc.add_paragraph('• Video Doorbell: 门铃呼叫、访客记录、对讲(新UI)') -doc.add_paragraph('• OSC KVS: 复用OSC脚本基础') - -doc.add_page_break() - -# ======================== 6. Phase 3 ======================== -doc.add_heading('6. Phase 3: 新品+特殊设备(W9-W12)', level=1) +doc.add_heading('5.2 前置:设备添加自动化(关键路径,最先启动)', level=2) doc.add_paragraph( - '策略:这些设备UI独特或为全新品类,需要从头编写测试脚本。' - '依赖设备到位和UI稳定。' + '必测含 73 条添加,添加流程需硬件配合(串口控制设备进入配对模式),分 BLE 直连与 Wi-Fi 配网两种模式。' + '此为 P0 第一阻塞项,须最先启动;控制部分(无需串口)可并行先行。' ) - rows = [ - ('W9', 'Hub系列 + 门控安防', '5', '用例脚本×5', '~125', '1人'), - ('W10', 'AI产品 + Art Frame', '5', '用例脚本×5(新UI框架)', '~150', '1-2人'), - ('W11', '机器人+联名款', '5', '用例脚本×5', '~125', '1-2人'), - ('W12', '收尾+回归', '3+全量', '剩余设备+全量回归报告', '—', '1人'), -] -add_table_with_header(doc, - ['周次', '品类', '设备数', '输出内容', '用例数', '人力'], - rows -) - -doc.add_paragraph() -p = doc.add_paragraph() -p.add_run('里程碑:').bold = True -p.add_run(' 第12周末交付全部 82 款设备,单品功能覆盖率 100%') - -doc.add_heading('W9 Hub + 门控安防', level=2) -doc.add_paragraph('• Hub 3: 设备管理列表、红外学习、Matter配对') -doc.add_paragraph('• AI Hub Show (带屏): 全新UI - 屏幕展示、语音交互') -doc.add_paragraph('• Garage Door Opener: 开关门状态、传感器绑定') -doc.add_paragraph('• Safety Alarm: 报警状态、音量设置') -doc.add_paragraph('• Radiator Thermostat: 温度设置、时间表') - -doc.add_heading('W10 AI产品', level=2) -doc.add_paragraph('• Art Frame: 画框显示模式、图片管理、AI生图') -doc.add_paragraph('• AI Pet: 宠物互动、投食、AI识别') -doc.add_paragraph('• AI PinNote: 便签管理、AI助手') -doc.add_paragraph('• 难点: 全新UI框架,无法复用已有模板,需要从Figma/UX重新分析') - -doc.add_heading('W11 机器人+联名', level=2) -doc.add_paragraph('• OBBOTO: 全新品类,需确认UI') -doc.add_paragraph('• Robotic Actuator/Arm/Picker: 机械臂控制UI') -doc.add_paragraph('• KATA Friends: Bot复用 + 定制UI皮肤验证') - -doc.add_heading('W12 收尾', level=2) -doc.add_paragraph('• 补充 FindCard、Outdoor PTC 等遗留设备') -doc.add_paragraph('• 全量回归执行,生成覆盖率报告') -doc.add_paragraph('• 修复回归中发现的失败用例') - -doc.add_page_break() - -# ======================== 7. Phase 4 - 添加+自动化 ======================== -doc.add_heading('7. Phase 4: 设备添加 + 自动化场景(W13-W16)', level=1) - -doc.add_heading('7.1 设备添加自动化', level=2) -doc.add_paragraph( - '设备添加流程需要硬件配合(串口控制设备进入配对模式),' - '分为 BLE 直连和 Wi-Fi 配网两种主要模式。' -) - -doc.add_heading('前置条件', level=3) -rows = [ - ('串口命令协议文档', '统一所有设备"进入配对模式"的串口指令', '嵌入式+测试'), + ('串口命令协议文档', '统一所有设备“进入配对模式”的串口指令', '嵌入式+测试'), ('串口控制模块', 'serial_controller.ts (基于 serialport库)', '测试'), ('添加流程通用框架', 'connect_base_helper.ts', '测试'), ('Wi-Fi 配网模块', 'wifi_connect_helper.ts', '测试'), - ('硬件环境', 'USB Hub + USB转TTL × N', '测试'), + ('硬件环境', 'USB Hub + USB转TTL × 5-10', '测试'), ] add_table_with_header(doc, ['任务', '输出', '负责'], rows) +doc.add_paragraph() +p = doc.add_paragraph() +p.add_run('框架一次性投入:').bold = True +p.add_run('serial_controller + connect_base_helper + wifi_connect_helper ≈ 1-1.5 人日纯代码(serial 基于现成桌面 serialport 工具薄封装、add 流程复用现有 addDeviceViaBLE,仅 wifi 配网 helper 需新写)。硬件联调(USB-TTL 接线/端口/时序)由嵌入式主导,为 wall-clock 不确定项,不计入纯人日。') +doc.add_paragraph( + '关键:添加流程 app 侧通用,逐设备差异仅为“开发版上进入配对模式的按键/串口指令”,由嵌入式提供的「设备→串口键」配置表驱动,逐设备近乎零编码。' + 'app 侧只需按类别区分设置步骤(BLE 直连 / Wi-Fi 配网 / 带屏 / 锁含校准),约 4-5 类,而非 73 份脚本。' +) + +doc.add_heading('5.3 添加 backlog(通用流程 + 配置表驱动)', level=2) +rows = [ + ('首验', 'BLE直连(Bot/Meter/Sensor) + Wi-Fi配网框架打通', '端到端 demo', '0.5'), + ('BLE 直连类', '窗帘/传感器/风扇/遥控器/插座开关/灯 等', '设备→串口键配置 + 验证', '1'), + ('Wi-Fi 配网类', 'Hub/摄像头/扫地机 等(额外配网步骤)', '配网流程 + 配置', '1.5'), + ('带屏 / 锁类', 'AI Hub Show / Lock 系列(含校准)', '类别专属设置步骤', '1.5'), +] +add_table_with_header(doc, ['批次', '范围', '交付物', 'AI预估(人日)'], rows) +doc.add_paragraph('添加小计:约 4-6 人日(流程通用、按 4-5 类区分;逐设备仅配置串口键,成本主要在逐台硬件验证的 wall-clock,非人日)。') + +doc.add_heading('5.4 控制 backlog(双协议,105 step)', level=2) +doc.add_paragraph('• 协议为运行模式:PROTO=ble(关WiFi/热点、开蓝牙)/ PROTO=wifi(开WiFi/热点、关蓝牙),各跑一遍。') +doc.add_paragraph('• camera/robot/osc 仅 WiFi;Bot/Lock/Curtain/Meter 等两协议都覆盖。') +doc.add_paragraph('• 控制内容含开关/开锁/百分比/meter温湿度校正/camera出流3min/robot清扫暂停回充/Humidifier2绑温湿度计。') +doc.add_paragraph('• 结果按 [ONES:号#step][协议] 锚点 step 级回写 plan CQz9YCNX。') +doc.add_paragraph('控制小计:约 3-4 人日(大部分品类已有 _control 用例 → P0 主要是给既有断言打 [P0][#step][协议] 锚点 + 双协议切换 harness ~1 人日 + 补少量缺口;双协议第二遍仅切前置、增量低)。') +doc.add_paragraph() +p = doc.add_paragraph() +p.add_run('P0 合计:').bold = True +p.add_run('约 11-15 人日(串口框架~1-1.5 + 添加 4-6 + 控制 3-4 + 功能9条~3 + step回写工具~0.5)。控制大部分品类已有 _control 用例可复用,主要是打锚点 + 双协议 harness;功能 9 条为 keypad 密码指纹/学习遥控/绑定手持等较复杂项;硬件联调由嵌入式主导,单列不计入。') + +doc.add_page_break() + +# ======================== 6. P1 单品探索 ======================== +doc.add_heading('6. P1 单品探索(覆盖广度)', level=1) +doc.add_paragraph( + '必测项达标后,为全部 82 款单品各跑通一遍主流程冒烟,确保每款设备最低限度可用。' + '范围 = card(首页卡片)+ 核心 control(开关/主模式),不含设置/场景/日志等深度回归。' +) +doc.add_paragraph('• 目标:82 款单品各 1 套冒烟,广度优先、深度浅。') +doc.add_paragraph('• 复用必测项已建的 control helper,单品只补 card 与主流程断言。') +doc.add_paragraph('• 退出标准:每款单品冒烟用例通过(card 可见 + 核心控制响应)。') +doc.add_paragraph('• 运行频率:每迭代跑一遍,作为单品级回归基线。') +doc.add_paragraph('• 人力预估(AI 辅助):约 12-16 人日(建立在 P0 已建 control helper 之上,82 款多为同品类复用,首台 ~0.3、复用台 ~0.1 人日/款)。') + +doc.add_page_break() + +# ======================== 7. P2 全功能 ======================== +doc.add_heading('7. P2 全功能(深度回归)', level=1) +doc.add_paragraph( + '对每款单品做全维度回归(card/control/setting/scene/logs)。按品类批量推进:' + '同品类 UI 高度相似,调通首台后改设备名配置快速扩展,并沉淀通用 helper。' + '不绑定周次,按复用度从高到低排批次。' +) + +rows = [ + ('批1·高复用', '窗帘9 / 锁12 / 插座开关6 / 灯光10', '37', '脚本×37 + curtain/lock/relay/light helper', '~25'), + ('批2·中复杂', '扫地机9 / 传感器温控7 / 风扇空净加湿6 / 摄像头门铃3', '25', '脚本×25 + robot/sensor/climate helper', '~27'), + ('批3·新品特殊', 'Hub门控安防5 / AI产品5 / 机器人联名5', '15+', '脚本×15 + 全新UI框架', '~28'), +] +add_table_with_header(doc, + ['批次', '品类', '设备数', '交付物', 'AI预估(人日)'], + rows, + col_widths=[2.3, 5, 1.3, 5, 2.2] +) doc.add_paragraph() +p = doc.add_paragraph() +p.add_run('覆盖目标:').bold = True +p.add_run('全部 82 款单品全维度回归,~2366 条用例,单品功能覆盖率 100%。') +p = doc.add_paragraph() +p.add_run('P2 合计:').bold = True +p.add_run('约 75-90 人日(仅 card/control/setting 约 60-70,含 scene/logs 约 75-90)。约 50 款为“已有/复用”可低成本适配;真正“需新写”的新品 UI 约 30 款(扫地机新机/Lock Ultra·Vision/AI产品/机器人)需 Figma/UX 重新分析,AI 辅助有限、为主要成本;add/control 已被 P0/P1 覆盖可复用。') -doc.add_heading('添加设备排期', level=3) +doc.add_heading('7.1 高复用品类要点', level=2) +doc.add_paragraph('• 窗帘: 位置控制、校准流程、定时器、群组控制 → curtain_helper') +doc.add_paragraph('• 锁: 密码管理、开锁方式切换、自动锁定、电量监控 → lock_helper') +doc.add_paragraph('• 插座开关: 开关、定时器、功率/电量统计、过载保护 → relay_helper') +doc.add_paragraph('• 灯光: RGB颜色、亮度、模式切换、渐变 → light_helper') + +doc.add_heading('7.2 中复杂品类要点', level=2) +doc.add_paragraph('• 扫地机: 地图管理/禁区/多楼层、清扫模式、自清洁基站(地图画布操作为难点)') +doc.add_paragraph('• 传感器+温控: 温湿度展示、历史图表、告警、灵敏度(图表验证需截图/文本提取)') +doc.add_paragraph('• 风扇+空净+加湿: 风速/模式/摇头/定时、空气质量/滤网、湿度目标/水箱') +doc.add_paragraph('• 摄像头+门铃: 出流/录像/事件、门铃呼叫/访客/对讲、OSC 复用') + +doc.add_heading('7.3 新品+特殊要点', level=2) +doc.add_paragraph('• Hub 3 / AI Hub Show: 设备管理、红外学习、Matter、带屏交互') +doc.add_paragraph('• 门控安防: Garage Door、Safety Alarm、Radiator Thermostat') +doc.add_paragraph('• AI产品: Art Frame、AI Pet、AI PinNote(全新UI,需从Figma/UX重新分析)') +doc.add_paragraph('• 机器人+联名: OBBOTO、Robotic Actuator/Arm/Picker、KATA Friends(Bot复用+定制皮肤)') + +doc.add_page_break() + +# ======================== 8. P3 平台 ======================== +doc.add_heading('8. P3 平台功能', level=1) +doc.add_paragraph( + '单品三层达标后,覆盖跨单品的平台级功能(必测项中约 12 条平台项 + 平台用例库)。' +) + +doc.add_heading('8.1 平台功能范围', level=2) rows = [ - ('W13', 'BLE直连类(Bot/Meter/Sensor)验证\n+ Wi-Fi配网框架', '3', '端到端demo验证'), - ('W14', '窗帘/锁/灯光批量铺开', '31', 'connect脚本×31'), - ('W15', '扫地机/传感器/风扇等', '22', 'connect脚本×22'), - ('W16', 'AI产品/新品收尾 + 全量回归', '29', 'connect脚本×29 + 回归报告'), + ('账号', '注册/登录/登出/忘记密码/第三方登录/欧区账号', '账号2.0'), + ('家庭与房间', '创建房间、家庭分享3.0、家庭分组', '分享/分组用例库'), + ('消息与商城', '消息中心3.0、商城、我的、小组件', '对应平台库'), + ('其他', '覆盖安装、插件热更、第三方服务接入', 'App必测项平台模块'), ] -add_table_with_header(doc, ['周次', '任务', '设备数', '输出'], rows) +add_table_with_header(doc, ['模块', '内容', '来源'], rows) -doc.add_heading('7.2 自动化/场景联动测试', level=2) -doc.add_paragraph('自动化场景测试验证设备间联动的可靠性,覆盖以下维度:') +doc.add_heading('8.2 自动化/场景联动', level=2) +doc.add_paragraph('验证设备间联动可靠性(复用已有 automation 脚本基础):') doc.add_paragraph('• 创建自动化:手动/条件触发/定时触发') doc.add_paragraph('• 执行验证:触发条件满足后动作执行') doc.add_paragraph('• 编辑/删除:修改条件或动作、删除自动化') doc.add_paragraph('• 多设备联动:A设备触发 → B设备执行') doc.add_paragraph('• 异常处理:设备离线时的自动化表现') -rows = [ - ('W15', '通用自动化创建/编辑/删除', '已有automation脚本基础', '~20'), - ('W15', '条件触发(传感器→设备)', '温湿度/人体感应触发', '~15'), - ('W16', '定时触发 + 多设备联动', '场景组合执行', '~15'), - ('W16', '异常场景', '离线/超时/冲突', '~10'), -] -add_table_with_header(doc, ['周次', '测试内容', '说明', '用例数'], rows) - doc.add_page_break() # ======================== 8. 资源需求 ======================== -doc.add_heading('8. 资源需求汇总', level=1) +doc.add_heading('9. 资源需求汇总', level=1) -doc.add_heading('8.1 人力', level=2) +doc.add_heading('9.1 人力与分工', level=2) rows = [ - ('自动化测试工程师', '1-2人', '全职,全程'), - ('嵌入式工程师(配合)', '0.5人', '前2周提供串口协议,后续按需'), - ('AI辅助 (Claude Code)', '—', '脚本生成+调试,贯穿全程'), + ('自动化测试工程师', '1人', '全职、全程,承担全部脚本编写与调试'), + ('嵌入式工程师(配合)', '按需', '提供串口协议与配对框架支持(P0 添加阻塞项),最优先'), + ('AI辅助 (Claude Code)', '—', '边跑边写生成+调试脚本,贯穿全程提效'), ] add_table_with_header(doc, ['角色', '人数', '说明'], rows) -doc.add_heading('8.2 硬件设备', level=2) +doc.add_paragraph() +doc.add_paragraph( + '人力安排:仅 1 名自动化工程师,四层按优先级串行推进,AI 辅助提效。' + 'P0 内部拆两条轨——「控制轨」不依赖串口可先行,「添加轨」待嵌入式串口框架就绪后插入,两轨由同一人分时推进。' +) +rows = [ + ('P0 · 控制轨', '自动化(1人)', '—', '先行:双协议控制 105 step,不待串口'), + ('P0 · 添加轨', '自动化(1人)', '嵌入式(串口协议+框架)', '串口就绪后插入:73 添加 + 9 功能'), + ('P1 单品探索', '自动化(1人)', '—', 'P0 达标后:82 款冒烟'), + ('P2 全功能', '自动化(1人)', '—', '按品类批量,复用 helper'), + ('P3 平台', '自动化(1人)', '—', '最后:平台功能 + 场景联动'), +] +add_table_with_header(doc, + ['优先级层', '主负责', '配合', '安排说明'], + rows, + col_widths=[2.5, 2.5, 3.5, 6] +) + +doc.add_heading('9.2 硬件设备', level=2) doc.add_paragraph('每品类至少需要1台实体设备用于调试和验证:') rows = [ - ('Phase 1', '窗帘×1, 锁×2, 插座×1, 开关×1, 灯×3', 'W1前到位'), - ('Phase 2', '扫地机×2, 传感器×3, 风扇×1, 空净×1, 加湿器×1, 门铃×1', 'W5前到位'), - ('Phase 3', 'Hub 3, AI Hub Show, Art Frame, AI Pet等', 'W9前到位'), - ('Phase 4', 'USB Hub, USB转TTL×5-10, 开发版设备', 'W13前到位'), + ('P0 串口硬件', 'USB Hub + USB转TTL×5-10、开发版设备', '最先到位(添加为关键路径)'), + ('P0/P1 必测+冒烟', '必测涉及的各品类代表设备各1台', '随 P0 启动'), + ('P2 高复用', '窗帘×1, 锁×2, 插座×1, 开关×1, 灯×3', '全功能批1前到位'), + ('P2 中复杂', '扫地机×2, 传感器×3, 风扇×1, 空净×1, 加湿器×1, 门铃×1', '全功能批2前到位'), + ('P2 新品特殊', 'Hub 3, AI Hub Show, Art Frame, AI Pet等', '全功能批3前到位'), ] -add_table_with_header(doc, ['阶段', '设备需求', '到位时间'], rows) +add_table_with_header(doc, ['用途', '设备需求', '到位时间'], rows) -doc.add_heading('8.3 环境', level=2) +doc.add_heading('9.3 环境', level=2) rows = [ ('测试手机', 'Samsung (Android) + iPhone (iOS)', '已有'), ('Appium Server', 'v2.x + UIAutomator2', '已有'), @@ -482,84 +484,86 @@ add_table_with_header(doc, ['项目', '说明', '状态'], rows) doc.add_page_break() -# ======================== 9. 总体排期表 ======================== -doc.add_heading('9. 总体排期一览', level=1) +# ======================== 10. 优先级 backlog 一览 ======================== +doc.add_heading('10. 优先级 backlog 一览', level=1) rows = [ - ('W1', 'Phase 1', '窗帘系列', '9', '~225', '脚本×9 + curtain_helper'), - ('W2', 'Phase 1', '锁系列', '12', '~360', '脚本×12 + lock_helper'), - ('W3', 'Phase 1', '插座+开关', '6', '~150', '脚本×6 + relay_helper'), - ('W4', 'Phase 1', '灯光系列', '10', '~250', '脚本×10 + light_helper'), - ('W5', 'Phase 2', '扫地机', '9', '~270', '脚本×9 + robot_helper增强'), - ('W6', 'Phase 2', '传感器+温控', '7', '~175', '脚本×7 + sensor_helper'), - ('W7', 'Phase 2', '风扇+空净+加湿', '6', '~150', '脚本×6 + climate_helper'), - ('W8', 'Phase 2', '摄像头+门铃', '3', '~90', '脚本×3'), - ('W9', 'Phase 3', 'Hub+门控安防', '5', '~125', '脚本×5'), - ('W10', 'Phase 3', 'AI产品', '5', '~150', '脚本×5 (全新)'), - ('W11', 'Phase 3', '机器人+联名', '5', '~125', '脚本×5'), - ('W12', 'Phase 3', '收尾+回归', '3+', '—', '全量回归报告'), - ('W13', 'Phase 4', '添加框架+首批验证', '3', '~15', 'serial_controller + demo'), - ('W14', 'Phase 4', '批量添加(窗帘/锁/灯)', '31', '~93', 'connect脚本×31'), - ('W15', 'Phase 4', '续批添加+自动化场景', '22', '~101', 'connect×22 + scene×35'), - ('W16', 'Phase 4', '收尾+全量回归', '29+', '~87', 'connect×29 + 最终报告'), + ('P0 必测项', '添加73 + 功能9 + 控制105step(双协议)', '187条', '~11-15', 'serial框架 + connect + 控制断言 + step回写', '通过率≥95%'), + ('P1 单品探索', '82款单品主流程冒烟(card+核心control)', '82款×1', '~12-16', '每单品冒烟用例', '全单品冒烟通过'), + ('P2 全功能', '全维度回归,按品类批量(高复用→新品)', '~2366条', '~75-90', '85+脚本 + 8个通用helper', '通过率≥85%、覆盖100%'), + ('P3 平台', '账号/房间/消息/家庭分享/场景等', '平台模块', '~12-15', '平台用例 + 场景联动', '平台用例通过'), ] add_table_with_header(doc, - ['周次', '阶段', '品类/任务', '设备数', '用例数', '交付物'], + ['优先级', '范围', '用例量', 'AI预估(人日)', '交付物', '退出标准'], rows, - col_widths=[1.5, 2, 4, 1.5, 1.5, 5] + col_widths=[2, 4.3, 1.5, 2, 4.2, 2.5] ) doc.add_paragraph() p = doc.add_paragraph() -p.add_run('总计:').bold = True -p.add_run('16周 | 82款设备 | ~2366条用例 | 85+脚本文件 + 8个通用helper') +p.add_run('人力总计(AI 辅助口径):').bold = True +p.add_run('约 105-135 人日 ≈ 5-7 人月(1 人,按 20 人日/月)。P0 大幅复用既有 control、串口硬件联调由嵌入式主导不计入;P2 “需新写”新品 UI 占比最高、最不可压缩。') + +doc.add_paragraph( + '人力构成说明:以上为 AI 辅助口径(较手工已下调约 2-3 倍)。其中“脚本编写”仅占约 1/3——AI 提效主要在此;' + '其余约 2/3 是真机调试(元素核对、加载等待、flaky 复跑)、设备/硬件配置与新品 UI 分析,受真机往返与 UI 稳定性约束,AI 难以进一步压缩。' + '项目使用 Midscene(AI 元素定位)已减少传统选择器维护成本,故未再按“零调试”乐观值估算。' + '若需再压缩周期,杠杆在于:多台真机并行、收窄 P2 范围(只保高频设备)、放宽 flaky 容忍度,而非提高编写速度。' +) + +doc.add_paragraph() +p = doc.add_paragraph() +p.add_run('说明:').bold = True +p.add_run('按优先级依次交付,高层达标后投入下一层;不绑定固定周次。P0 控制部分可不待串口先行,添加随串口框架就绪推进。') doc.add_page_break() # ======================== 10. 质量标准 ======================== -doc.add_heading('10. 质量标准与验收', level=1) +doc.add_heading('11. 质量标准与验收', level=1) -doc.add_heading('10.1 单设备验收标准', level=2) +doc.add_heading('11.1 单设备验收标准', level=2) doc.add_paragraph('• 核心用例通过率 ≥ 85%(首轮调试)') doc.add_paragraph('• 单次全量执行时间 < 10分钟/设备') doc.add_paragraph('• 用例覆盖:card + control + setting 三个维度必须覆盖') doc.add_paragraph('• 脚本可在 Android/iOS 双平台运行(通过平台适配层)') -doc.add_heading('10.2 阶段验收标准', level=2) +doc.add_heading('11.2 优先级层验收标准', level=2) rows = [ - ('Phase 1 (W4末)', '37款设备调通,通过率≥85%', '覆盖率45%'), - ('Phase 2 (W8末)', '累计62款设备,通过率≥80%', '覆盖率76%'), - ('Phase 3 (W12末)', '全部82款单品覆盖', '覆盖率100%'), - ('Phase 4 (W16末)', '添加流程+自动化场景', '全流程覆盖'), + ('P0 必测项', '187条全部实现并跑通(添加+控制双协议)', '通过率≥95%,作为提测门禁'), + ('P1 单品探索', '82款单品冒烟全部通过', '广度100%覆盖'), + ('P2 全功能', '全维度回归,通过率≥85%', '单品功能覆盖率100%'), + ('P3 平台', '平台功能 + 场景联动通过', '全流程覆盖'), ] -add_table_with_header(doc, ['阶段', '验收标准', '覆盖目标'], rows) +add_table_with_header(doc, ['优先级', '验收标准', '覆盖目标'], rows) -doc.add_heading('10.3 回归策略', level=2) -doc.add_paragraph('• 每周五执行当周完成设备的全量回归') -doc.add_paragraph('• 每Phase末执行累计设备的全量回归') -doc.add_paragraph('• App版本更新后执行 smoke test(所有设备card验证)') +doc.add_heading('11.3 回归策略', level=2) +doc.add_paragraph('• P0 必测项:每次提测/版本更新必跑(双协议),作为准入门禁') +doc.add_paragraph('• P1 单品探索:每迭代执行一遍全单品冒烟') +doc.add_paragraph('• P2 全功能:版本回归执行累计设备全量') +doc.add_paragraph('• P3 平台:版本回归执行平台功能与场景联动') doc.add_page_break() # ======================== 11. 风险与依赖 ======================== -doc.add_heading('11. 风险与依赖', level=1) +doc.add_heading('12. 风险与依赖', level=1) -doc.add_heading('11.1 关键依赖', level=2) +doc.add_heading('12.1 关键依赖', level=2) rows = [ - ('实体设备到位', '高', '无设备无法调试', '提前一个Phase准备'), + ('串口/添加为关键路径(前移)', '高', '硬件或协议不就绪将阻塞 P0 整体', '控制部分(无需串口)先行,串口框架并行启动'), + ('实体设备到位', '高', '无设备无法调试', 'P0 涉及的代表设备最先准备'), + ('嵌入式串口协议', '高', '直接影响 P0 添加', '最优先启动协议定义'), ('同品类UI一致性', '中', 'UI差异大则无法复用', '差异设备单独排期'), - ('新品UI稳定', '高', 'UI仍在迭代会导致返工', '等UI冻结后再开始'), - ('嵌入式串口协议', '高', '影响添加设备Phase', '提前2周启动协议定义'), + ('新品UI稳定', '高', 'UI仍在迭代会导致返工', '等UI冻结后再开始(主要影响P2新品)'), ('App版本稳定', '中', '频繁改版影响脚本维护', '锁定测试版本'), ] add_table_with_header(doc, ['依赖项', '风险等级', '影响', '缓解措施'], rows) -doc.add_heading('11.2 待讨论问题', level=2) -doc.add_paragraph('1. 已下市产品(Hub Plus、老灯带、加湿器1等)是否需要覆盖?') -doc.add_paragraph('2. 同一设备的不同区域版本(JP/US/EU)UI差异程度如何?是否需要逐个调试?') -doc.add_paragraph('3. AI Hub Show 的UI是否已稳定,是否可以W9开始?') -doc.add_paragraph('4. 设备添加流程的串口开发版是否可用?时间线?') -doc.add_paragraph('5. CI/CD 持续集成环境是否需要在Phase 1之前搭建?') +doc.add_heading('12.2 待讨论问题', level=2) +doc.add_paragraph('1. 设备添加的串口开发版/协议时间线?(决定 P0 添加何时能启动)') +doc.add_paragraph('2. 必测项控制双协议环境切换(开关WiFi/蓝牙)能否用 adb/串口自动化,还是需人工配合?') +doc.add_paragraph('3. 已下市产品(Hub Plus、老灯带、加湿器1等)是否纳入 P2 全功能?') +doc.add_paragraph('4. 同一设备的不同区域版本(JP/US/EU)UI差异程度?是否需逐个调试?') +doc.add_paragraph('5. CI/CD 持续集成环境是否需要在 P0 之前搭建?') # ======================== 保存 ======================== output_path = '/Users/woan/Desktop/AI_UIAutomation/docs/UI自动化测试计划.docx' diff --git a/package.json b/package.json index b1e4c3d..4f08e45 100644 --- a/package.json +++ b/package.json @@ -10,7 +10,8 @@ "test:setting": "vitest run tests/bot/bot_setting.test.ts", "test:card": "vitest run tests/bot/bot_card.test.ts", "test:logs": "vitest run tests/bot/bot_logs.test.ts", - "test:scene": "vitest run tests/bot/bot_scene.test.ts" + "test:scene": "vitest run tests/bot/bot_scene.test.ts", + "gen:must-test": "ts-node scripts/gen-must-test-manifest.ts" }, "keywords": [ "ui-automation", diff --git a/prompts/ones_to_automation.md b/prompts/ones_to_automation.md index 8eccd98..611d31b 100644 --- a/prompts/ones_to_automation.md +++ b/prompts/ones_to_automation.md @@ -16,6 +16,10 @@ 触发条件:任务涉及 ONES 测试计划 `必测项-AI自动化`(plan `CQz9YCNX`) / 用例库 `App 必测项`(lib `EPfZfC9Y`),或用户提到「必测项 / 添加+控制必测 / 双协议控制」。 该子提示词覆盖:必测项的两种结构(添加按单品、控制为 2 条协议超级用例的 step 级)、品类→目录映射、`must-test.manifest.ts`、`[P0][ONES:号#step]` 标记、双协议运行模式、step 级回写。 +- **按测试计划转换(优先级驱动)** → 同时加载 `prompts/test_plan_conversion.md`。 + 触发条件:任务涉及整体测试计划推进、按优先级(必测项→单品探索→全功能→平台)排期转换,或用户提到「测试计划 / 按计划转换 / P0-P3 优先级」。 + 该总纲规定四层优先级的顺序、各层来源/落点/退出标准/AI人力预估,并在 P0 处委托给 `must_test_conversion.md`。计划全文见 `docs/UI自动化测试计划.docx`。 + --- ## 项目技术栈 diff --git a/prompts/test_plan_conversion.md b/prompts/test_plan_conversion.md new file mode 100644 index 0000000..945a264 --- /dev/null +++ b/prompts/test_plan_conversion.md @@ -0,0 +1,72 @@ +# 测试计划 → 自动化 转换提示词(执行总纲) + +> **配合主提示词使用**。本文件是「按测试计划驱动转换」的执行总纲:规定**做什么、按什么优先级做、每层做到什么程度**。 +> 通用机制(技术栈/DeviceDriver/脚本模板/元素发现/边跑边写/截图/报告)遵循 `prompts/ones_to_automation.md`; +> 必测项(P0)的专项细节遵循 `prompts/must_test_conversion.md`。三者叠加使用。 +> 计划全文见 `docs/UI自动化测试计划.docx`(由 `docs/generate_test_plan.py` 生成)。 + +--- + +## 0. 核心原则 + +- **优先级驱动,不绑定周次**:严格按 P0 → P1 → P2 → P3 顺序推进,**高优先级层达到退出标准后再投入下一层**。 +- **必测是闸门**:P0 是提测/版本准入门禁,任何版本变更优先保 P0 绿。 +- **AI 边跑边写**:首台建模、同品类复用台仅改配置;人力预估按 AI 辅助口径(单维度首台 0.2-1 人日、复用台 0.1-0.3 人日)。 +- **实际人力 1 人**:四层串行;P0 内「控制轨(不依赖串口)」可先行,「添加轨」待嵌入式串口框架就绪后插入。 + +--- + +## 1. 四层优先级总览 + +| 层 | 范围 | 来源 | 落点(目录/维度) | 退出标准 | AI预估 | +|---|---|---|---|---|---| +| **P0 必测项** | 各单品添加 + 核心控制(双协议) | ONES plan `CQz9YCNX` / `must-test.manifest.ts` | `{device}_connect` / `{device}_control` | 通过率≥95%(门禁) | ~40-48 人日 | +| **P1 单品探索** | 82 款主流程冒烟(card+核心control) | 单品模板 | `{device}_card` + 核心 control | 全单品冒烟通过 | ~25 人日 | +| **P2 全功能** | 全维度回归(card/control/setting/scene/logs) | 各品类 ONES 用例库 | 全维度文件,按品类批量 | 通过率≥85%、覆盖100% | ~100 人日 | +| **P3 平台** | 账号/房间/消息/家庭分享/场景等 | App 平台用例库 | `tests/automation/` 等平台 | 平台用例通过 | ~12 人日 | + +--- + +## 2. 逐层执行指引 + +### P0 必测项(最高优先,先做) +- **完全遵循 `prompts/must_test_conversion.md`**:用 `test-plan/must-test.manifest.ts` 作为清单(187 条 = 添加73 + 功能9 + 控制105step)。 +- **先控制轨**(不依赖串口):双协议 105 step,落到各 `{device}_control.test.ts`,打 `[P0][ONES:号#step][协议]` 标记。 +- **后添加轨**(待串口框架):serial_controller / connect_base_helper / wifi_connect_helper 就绪后,73 条添加落到 `{device}_connect.test.ts`。 +- 结果按锚点 step 级回写 ONES plan `CQz9YCNX`。**P0 不达 95% 不进入 P1。** + +### P1 单品探索 +- 为全部 82 款单品各写一套**主流程冒烟**:`card`(首页卡片可见)+ 核心 `control`(开关/主模式响应)。 +- **复用 P0 已建的 control helper**,单品只补 card 与主流程断言。广度优先、深度浅。 +- 退出:每款单品冒烟通过。 + +### P2 全功能 +- 全维度回归。**按品类批量**(高复用→中复杂→新品):同品类调通首台后改设备名配置扩展,沉淀 `*_helper`。 +- 来源 = 对应品类 ONES 用例库(非必测项库);按主提示词「读取用例来源」流程拉取转换。 +- 维度:card/control/setting/scene/logs(logs 可选)。新品 UI 需从 Figma/UX 重新分析(见 [[reference-figma-designs]]、[[feedback-ux-coordinate-workflow]])。 + +### P3 平台 +- 跨单品平台功能:账号(注册/登录/登出/忘记密码/第三方)、房间/家庭分享3.0/分组、消息中心3.0、商城、我的、小组件、场景3.0联动。 +- 含必测项里 ~12 条平台项 + App 平台用例库。落到 `tests/automation/` 等平台测试。 + +--- + +## 3. 每层通用工作流 + +1. **选层**:确认当前应做的最高未完成层(P0→P3)。 +2. **拉用例**:P0 用 manifest;P2/P3 用 ONES CLI 从对应品类/平台用例库读取(主提示词「读取用例来源」)。 +3. **边跑边写**:首轮生成→运行→按真实页面源码修元素/坐标,直到通过(主提示词「迭代调试流程」)。 +4. **回写 ONES**:P0 按 step 锚点(must_test_conversion §9);其余按用例名匹配(主提示词「ONES 测试计划集成」/ `utils/ones-sync.ts`)。 +5. **核对退出标准**:达标才进入下一层;记录 AI 实际工时,校准预估。 + +--- + +## 4. 调整计划 + +计划是生成产物。如需改优先级/范围/人力预估,改 `docs/generate_test_plan.py` 后 `python3 docs/generate_test_plan.py` 重新生成 docx,不手改 docx。 + +--- + +## 相关 +主提示词 `prompts/ones_to_automation.md` · 必测项 `prompts/must_test_conversion.md` · +[[project-must-test-ones-source]] · [[project-maestro-conversion]] · [[feedback-test-case-reuse]] · [[feedback-manual-navigation]] diff --git a/scripts/gen-must-test-manifest.ts b/scripts/gen-must-test-manifest.ts new file mode 100644 index 0000000..b16761e --- /dev/null +++ b/scripts/gen-must-test-manifest.ts @@ -0,0 +1,269 @@ +/** + * 必测项 manifest 生成器 + * + * 从 ONES 拉取「必测项-AI自动化」计划(plan CQz9YCNX / lib EPfZfC9Y), + * 生成 test-plan/must-test.manifest.ts —— 作为「ONES ↔ 测试文件 ↔ step 级回写 ↔ 覆盖率」的中间层。 + * + * 三类条目: + * - add : 每单品一条「添加X验证」case (主键 ones 用例号) + * - feature : 品类模块内、非添加的单品功能必测 (绑定手持/学习遥控器/keypad密码等) + * - ctrl : 两条协议超级用例的每个 step (主键 ones#step_uuid,带 proto) + * + * 用法: + * npx ts-node scripts/gen-must-test-manifest.ts [--plan CQz9YCNX] [--out test-plan/must-test.manifest.ts] [--dry-run] + * + * 详见 prompts/must_test_conversion.md + */ +import { execSync } from 'child_process'; +import * as fs from 'fs'; +import * as path from 'path'; +import { DEVICE_CONFIG } from '../config/device.config'; +import { fetchPlanCases } from '../utils/ones-sync'; + +const ONES_CLI = '/Users/woan/local/bin/ones'; +const LIB_UUID = 'EPfZfC9Y'; // App 必测项 +const DEFAULT_PLAN = 'CQz9YCNX'; // 必测项-AI自动化 + +// 控制超级用例: 用例号 -> 协议 +const CTRL_CASES: { number: number; proto: 'ble' | 'wifi' }[] = [ + { number: 15975, proto: 'ble' }, // 蓝牙控制设备 (关WiFi/热点、开蓝牙) + { number: 15974, proto: 'wifi' }, // WiFi控制设备 (开WiFi/热点、关蓝牙) +]; + +// 单品 add/feature 所在的品类模块 (module_uuid) +const CATEGORY_MODULES = new Set([ + 'Q77TzNjH', // 摄像头类 + 'JdPYj5r7', // 灯类&WiFi + 'HqxErR84', // 蓝牙类 + 'TPe3ZhZG', // 开关类 + 'BDBbZz8f', // URC HUB + 'Qmd8bwnW', // 温湿度&hub类 + 'BpA3ATUg', // Lock类 + 'Yb6hgZ9T', // 扫地机类 +]); + +// 关键字 -> 品类(= 测试目录名, snake_case)。按最长命中优先匹配。 +const KEYWORD_TO_CATEGORY: [string, string][] = [ + ['relay switch', 'plug'], ['garage', 'plug'], ['plug mini', 'plug'], ['plugmini', 'plug'], ['eu plug', 'plug'], ['plug', 'plug'], + ['smart radiator', 'meter'], ['暖气阀', 'meter'], ['climate panel', 'meter'], ['温湿度', 'meter'], ['meter', 'meter'], + ['iosensor', 'sensor'], ['io sensor', 'sensor'], ['motion sensor', 'sensor'], ['contact sensor', 'sensor'], ['人体存在', 'sensor'], ['presence', 'sensor'], + ['lock pro', 'lock'], ['lock lite', 'lock'], ['lock ultra', 'lock'], ['lock', 'lock'], ['keypad', 'keypad'], + ['blindtil', 'curtain'], ['blind tilt', 'curtain'], ['roller shade', 'curtain'], ['curtain', 'curtain'], + ['humidifier', 'humidifier'], ['加湿', 'humidifier'], ['空气净化', 'air_condition'], + ['吸顶灯', 'ceiling_light'], ['ceiling', 'ceiling_light'], ['floor lamp', 'ceiling_light'], ['落地灯', 'ceiling_light'], ['candle', 'ceiling_light'], ['融蜡', 'ceiling_light'], + ['strip light', 'strip_light'], ['灯带', 'strip_light'], ['霓虹', 'strip_light'], ['neon', 'strip_light'], ['color bulb', 'color_bulb'], ['bulb', 'color_bulb'], + ['circulator fan', 'fan'], ['standing circulator', 'fan'], ['落地扇', 'fan'], ['循环扇', 'fan'], ['fan', 'fan'], + ['indoor cam', 'camera'], ['pan/tilt', 'camera'], ['ptc', 'camera'], ['doorbell', 'camera'], ['osc', 'osc'], ['cam', 'camera'], + ['robot vacuum', 'robot'], ['k10', 'robot'], ['k11', 'robot'], ['s10', 'robot'], ['s20', 'robot'], ['s1', 'robot'], ['扫地机', 'robot'], + ['hub mini matter', 'hub'], ['hub mini', 'hub'], ['hub2', 'hub'], ['hub plus', 'hub'], ['hub', 'hub'], + ['urc', 'urc'], ['遥控器', 'remote'], ['remote', 'remote'], ['bot', 'bot'], + ['safety alarm', 'safety_alarm'], +]; + +// 品类目录(snake) -> device.config 的 key(camelCase)。未列出者两者相同。 +const CAT_TO_CONFIG_KEY: Record = { + ceiling_light: 'ceilingLight', + strip_light: 'stripLight', + color_bulb: 'colorBulb', + air_condition: 'airCondition', +}; + +function classify(text: string): string | null { + const t = text.toLowerCase(); + let best: string | null = null; + let bestLen = -1; + for (const [kw, cat] of KEYWORD_TO_CATEGORY) { + if (t.includes(kw) && kw.length > bestLen) { + best = cat; + bestLen = kw.length; + } + } + return best; +} + +function deviceFor(cat: string): string { + const key = CAT_TO_CONFIG_KEY[cat] || cat; + return DEVICE_CONFIG[key]?.defaultDevice || ''; +} + +function folderExists(cat: string): boolean { + return fs.existsSync(path.resolve(__dirname, '..', 'tests', cat)); +} + +function runOnes(args: string): any { + const output = execSync(`${ONES_CLI} ${args}`, { encoding: 'utf-8', timeout: 30000 }); + return JSON.parse(output); +} + +// 短描述: 去前缀符号、压空白、截断,用于 testName +function shortDesc(s: string): string { + return s.replace(/\s+/g, ' ').replace(/^[-—\s]+/, '').trim().slice(0, 24); +} + +interface AddRow { + kind: 'add' | 'feature'; + ones: number; + name: string; + cat: string; + device: string; + file: string; + testName: string; + status: 'todo' | 'na'; +} +interface CtrlRow { + kind: 'ctrl'; + ones: number; + step: string; + proto: 'ble' | 'wifi'; + name: string; + result: string; + cat: string; + device: string; + action: string; + file: string; + testName: string; + status: 'todo' | 'na'; +} +type Row = AddRow | CtrlRow; + +function main() { + const argv = process.argv.slice(2); + const plan = argVal(argv, '--plan') || DEFAULT_PLAN; + const out = argVal(argv, '--out') || 'test-plan/must-test.manifest.ts'; + const dryRun = argv.includes('--dry-run'); + + console.log(`[gen] 计划成员校验 plan=${plan} ...`); + const planNums = new Set(fetchPlanCases(plan).map((c) => c.caseNumber)); + + console.log(`[gen] 读取用例库 ${LIB_UUID} ...`); + const libCases: any[] = runOnes(`testcase case list ${LIB_UUID}`).cases || []; + + const rows: Row[] = []; + const na: string[] = []; + + // 1) add / feature: 品类模块内、在计划内的 case + for (const c of libCases) { + if (!CATEGORY_MODULES.has(c.module_uuid)) continue; + if (!planNums.has(c.number)) continue; + const kind: 'add' | 'feature' = c.name.startsWith('添加') ? 'add' : 'feature'; + const cat = classify(c.name); + if (!cat || !folderExists(cat)) { + na.push(`${kind} ONES:${c.number} ${c.name} [${cat || '未识别品类'}${cat && !folderExists(cat) ? '无测试目录' : ''}]`); + rows.push({ kind, ones: c.number, name: c.name, cat: cat || '', device: cat ? deviceFor(cat) : '', file: '', testName: '', status: 'na' }); + continue; + } + const suffix = kind === 'add' ? 'connect' : 'control'; + const device = deviceFor(cat); + rows.push({ + kind, + ones: c.number, + name: c.name, + cat, + device, + file: `tests/${cat}/${cat}_${suffix}.test.ts`, + testName: `[P0][ONES:${c.number}] ${c.name}`, + status: 'todo', + }); + } + + // 2) ctrl: 两条协议超级用例的每个 step + for (const { number, proto } of CTRL_CASES) { + const found = runOnes(`testcase case search --key ${number}`).cases || []; + const steps: any[] = found[0]?.steps || []; + for (const s of steps) { + const cat = classify(s.desc || ''); + if (!cat || !folderExists(cat)) { + na.push(`ctrl[${proto}] ONES:${number}#${s.uuid} ${shortDesc(s.desc || '')} [${cat || '未识别品类'}${cat && !folderExists(cat) ? '无测试目录' : ''}]`); + rows.push({ kind: 'ctrl', ones: number, step: s.uuid, proto, name: s.desc || '', result: s.result || '', cat: cat || '', device: cat ? deviceFor(cat) : '', action: '', file: '', testName: '', status: 'na' }); + continue; + } + const device = deviceFor(cat); + rows.push({ + kind: 'ctrl', + ones: number, + step: s.uuid, + proto, + name: s.desc || '', + result: s.result || '', + cat, + device, + action: shortDesc(s.desc || ''), + file: `tests/${cat}/${cat}_control.test.ts`, + testName: `[P0][ONES:${number}#${s.uuid}][${proto}] ${shortDesc(s.desc || '')} ${device}`.trim(), + status: 'todo', + }); + } + } + + printSummary(rows, na, plan); + + if (dryRun) { + console.log('\n[gen] --dry-run: 未写文件'); + return; + } + + const outPath = path.resolve(__dirname, '..', out); + fs.mkdirSync(path.dirname(outPath), { recursive: true }); + fs.writeFileSync(outPath, renderManifest(rows, plan), 'utf-8'); + console.log(`\n[gen] 已生成 ${out} (${rows.length} 条)`); +} + +function argVal(argv: string[], flag: string): string | undefined { + const i = argv.indexOf(flag); + return i >= 0 ? argv[i + 1] : undefined; +} + +function printSummary(rows: Row[], na: string[], plan: string) { + const by = (k: string) => rows.filter((r) => r.kind === k); + const add = by('add'), feat = by('feature'), ctrl = by('ctrl') as CtrlRow[]; + console.log(`\n=== 必测项覆盖摘要 (plan ${plan}) ===`); + console.log(`add(添加) : ${add.length}`); + console.log(`feature(功能): ${feat.length}`); + console.log(`ctrl(控制step): ${ctrl.length} (ble ${ctrl.filter((r) => r.proto === 'ble').length} / wifi ${ctrl.filter((r) => r.proto === 'wifi').length})`); + const catCount: Record = {}; + for (const r of rows) catCount[r.cat || '∅'] = (catCount[r.cat || '∅'] || 0) + 1; + console.log('按品类:', JSON.stringify(catCount)); + console.log(`\n=== 未落地 (na, ${na.length}) —— 需人工补关键字/目录或归平台 ===`); + na.forEach((n) => console.log(' ! ' + n)); +} + +function renderManifest(rows: Row[], plan: string): string { + const header = `// AUTO-GENERATED by scripts/gen-must-test-manifest.ts — do not edit by hand. +// 源: ONES plan ${plan} / lib ${LIB_UUID} (必测项-AI自动化)。重新生成: npm run gen:must-test +// 详见 prompts/must_test_conversion.md + +export type MustTestItem = + | { + kind: 'add' | 'feature'; + ones: number; + name: string; + cat: string; + device: string; + file: string; + testName: string; + status: 'todo' | 'na' | 'done'; + } + | { + kind: 'ctrl'; + ones: number; + step: string; + proto: 'ble' | 'wifi'; + name: string; + result: string; + cat: string; + device: string; + action: string; + file: string; + testName: string; + status: 'todo' | 'na' | 'done'; + }; + +export const MUST_TEST: MustTestItem[] = [ +`; + const body = rows + .map((r) => ' ' + JSON.stringify(r) + ',') + .join('\n'); + return header + body + '\n];\n'; +} + +main(); diff --git a/test-plan/must-test.manifest.ts b/test-plan/must-test.manifest.ts new file mode 100644 index 0000000..a40c15f --- /dev/null +++ b/test-plan/must-test.manifest.ts @@ -0,0 +1,219 @@ +// AUTO-GENERATED by scripts/gen-must-test-manifest.ts — do not edit by hand. +// 源: ONES plan CQz9YCNX / lib EPfZfC9Y (必测项-AI自动化)。重新生成: npm run gen:must-test +// 详见 prompts/must_test_conversion.md + +export type MustTestItem = + | { + kind: 'add' | 'feature'; + ones: number; + name: string; + cat: string; + device: string; + file: string; + testName: string; + status: 'todo' | 'na' | 'done'; + } + | { + kind: 'ctrl'; + ones: number; + step: string; + proto: 'ble' | 'wifi'; + name: string; + result: string; + cat: string; + device: string; + action: string; + file: string; + testName: string; + status: 'todo' | 'na' | 'done'; + }; + +export const MUST_TEST: MustTestItem[] = [ + {"kind":"add","ones":393236,"name":"添加Candle lamp(融蜡灯)验证(融蜡灯需要插110V电压)","cat":"ceiling_light","device":"CeilingLight 7Q","file":"tests/ceiling_light/ceiling_light_connect.test.ts","testName":"[P0][ONES:393236] 添加Candle lamp(融蜡灯)验证(融蜡灯需要插110V电压)","status":"todo"}, + {"kind":"add","ones":393235,"name":"添加RGBIC Neon Rope Light(炫彩霓虹灯)验证","cat":"strip_light","device":"StripLight 9S","file":"tests/strip_light/strip_light_connect.test.ts","testName":"[P0][ONES:393235] 添加RGBIC Neon Rope Light(炫彩霓虹灯)验证","status":"todo"}, + {"kind":"add","ones":393234,"name":"添加Standing Circulator fan验证","cat":"fan","device":"Fan 0T","file":"tests/fan/fan_connect.test.ts","testName":"[P0][ONES:393234] 添加Standing Circulator fan验证","status":"todo"}, + {"kind":"add","ones":332919,"name":"添加safety alarm","cat":"safety_alarm","device":"","file":"","testName":"","status":"na"}, + {"kind":"add","ones":332918,"name":"添加eu plug","cat":"plug","device":"Plug 4D","file":"tests/plug/plug_connect.test.ts","testName":"[P0][ONES:332918] 添加eu plug","status":"todo"}, + {"kind":"add","ones":332917,"name":"添加人体存在传感器","cat":"sensor","device":"Contact Sensor 5O","file":"tests/sensor/sensor_connect.test.ts","testName":"[P0][ONES:332917] 添加人体存在传感器","status":"todo"}, + {"kind":"add","ones":319305,"name":"添加Hub Mini S3验证","cat":"hub","device":"Hub2 8H","file":"tests/hub/hub_connect.test.ts","testName":"[P0][ONES:319305] 添加Hub Mini S3验证","status":"todo"}, + {"kind":"add","ones":319304,"name":"添加Hub2 S3验证","cat":"hub","device":"Hub2 8H","file":"tests/hub/hub_connect.test.ts","testName":"[P0][ONES:319304] 添加Hub2 S3验证","status":"todo"}, + {"kind":"add","ones":319303,"name":"添加Hub Mini Matter S3验证","cat":"hub","device":"Hub2 8H","file":"tests/hub/hub_connect.test.ts","testName":"[P0][ONES:319303] 添加Hub Mini Matter S3验证","status":"todo"}, + {"kind":"add","ones":311020,"name":"添加RGBIC Neon Wire Rope Light(炫彩钢丝霓虹灯)验证","cat":"strip_light","device":"StripLight 9S","file":"tests/strip_light/strip_light_connect.test.ts","testName":"[P0][ONES:311020] 添加RGBIC Neon Wire Rope Light(炫彩钢丝霓虹灯)验证","status":"todo"}, + {"kind":"add","ones":311019,"name":"添加RGBICWW Floor Lamp(炫彩落地灯)验证","cat":"ceiling_light","device":"CeilingLight 7Q","file":"tests/ceiling_light/ceiling_light_connect.test.ts","testName":"[P0][ONES:311019] 添加RGBICWW Floor Lamp(炫彩落地灯)验证","status":"todo"}, + {"kind":"add","ones":311018,"name":"添加RGBICWW Strip Light(炫彩灯带) 验证","cat":"strip_light","device":"StripLight 9S","file":"tests/strip_light/strip_light_connect.test.ts","testName":"[P0][ONES:311018] 添加RGBICWW Strip Light(炫彩灯带) 验证","status":"todo"}, + {"kind":"add","ones":310704,"name":"添加暖气阀Smart Radiator Thermostat验证","cat":"meter","device":"Meter 3M","file":"tests/meter/meter_connect.test.ts","testName":"[P0][ONES:310704] 添加暖气阀Smart Radiator Thermostat验证","status":"todo"}, + {"kind":"add","ones":310703,"name":"添加Climate Panel验证","cat":"meter","device":"Meter 3M","file":"tests/meter/meter_connect.test.ts","testName":"[P0][ONES:310703] 添加Climate Panel验证","status":"todo"}, + {"kind":"add","ones":304133,"name":"添加Lock Pro WiFi验证","cat":"lock","device":"Lock 6F","file":"tests/lock/lock_connect.test.ts","testName":"[P0][ONES:304133] 添加Lock Pro WiFi验证","status":"todo"}, + {"kind":"add","ones":304132,"name":"添加Lock Lite验证","cat":"lock","device":"Lock 6F","file":"tests/lock/lock_connect.test.ts","testName":"[P0][ONES:304132] 添加Lock Lite验证","status":"todo"}, + {"kind":"add","ones":304131,"name":"添加Keypad Vision验证","cat":"keypad","device":"Keypad 2V","file":"tests/keypad/keypad_connect.test.ts","testName":"[P0][ONES:304131] 添加Keypad Vision验证","status":"todo"}, + {"kind":"add","ones":304130,"name":"添加Lock Ultra验证","cat":"lock","device":"Lock 6F","file":"tests/lock/lock_connect.test.ts","testName":"[P0][ONES:304130] 添加Lock Ultra验证","status":"todo"}, + {"kind":"add","ones":302289,"name":"添加Garage Door Opener验证","cat":"plug","device":"Plug 4D","file":"tests/plug/plug_connect.test.ts","testName":"[P0][ONES:302289] 添加Garage Door Opener验证","status":"todo"}, + {"kind":"add","ones":302288,"name":"添加Relay Switch验证","cat":"plug","device":"Plug 4D","file":"tests/plug/plug_connect.test.ts","testName":"[P0][ONES:302288] 添加Relay Switch验证","status":"todo"}, + {"kind":"add","ones":301586,"name":"添加RGBWW Floor Lamp (落地灯)验证","cat":"ceiling_light","device":"CeilingLight 7Q","file":"tests/ceiling_light/ceiling_light_connect.test.ts","testName":"[P0][ONES:301586] 添加RGBWW Floor Lamp (落地灯)验证","status":"todo"}, + {"kind":"add","ones":301585,"name":"添加RGBWW Strip light3(彩色灯带3) 验证 ","cat":"strip_light","device":"StripLight 9S","file":"tests/strip_light/strip_light_connect.test.ts","testName":"[P0][ONES:301585] 添加RGBWW Strip light3(彩色灯带3) 验证 ","status":"todo"}, + {"kind":"add","ones":273787,"name":"添加K11+扫地机","cat":"robot","device":"Robot S1","file":"tests/robot/robot_connect.test.ts","testName":"[P0][ONES:273787] 添加K11+扫地机","status":"todo"}, + {"kind":"add","ones":267367,"name":"添加Meter pro验证","cat":"meter","device":"Meter 3M","file":"tests/meter/meter_connect.test.ts","testName":"[P0][ONES:267367] 添加Meter pro验证","status":"todo"}, + {"kind":"add","ones":267366,"name":"添加Meter pro co2验证","cat":"meter","device":"Meter 3M","file":"tests/meter/meter_connect.test.ts","testName":"[P0][ONES:267366] 添加Meter pro co2验证","status":"todo"}, + {"kind":"add","ones":265933,"name":"添加curtain 3 2025验证","cat":"curtain","device":"Curtain 1A","file":"tests/curtain/curtain_connect.test.ts","testName":"[P0][ONES:265933] 添加curtain 3 2025验证","status":"todo"}, + {"kind":"add","ones":205248,"name":"添加S20扫地机","cat":"robot","device":"Robot S1","file":"tests/robot/robot_connect.test.ts","testName":"[P0][ONES:205248] 添加S20扫地机","status":"todo"}, + {"kind":"add","ones":197389,"name":"添加Doorbell","cat":"camera","device":"摄像机Plus 3K","file":"tests/camera/camera_connect.test.ts","testName":"[P0][ONES:197389] 添加Doorbell","status":"todo"}, + {"kind":"add","ones":196802,"name":"添加空气净化器验证(基础款和table款)","cat":"air_condition","device":"AirCondition IR","file":"tests/air_condition/air_condition_connect.test.ts","testName":"[P0][ONES:196802] 添加空气净化器验证(基础款和table款)","status":"todo"}, + {"kind":"add","ones":191100,"name":"添加Roller Shade验证","cat":"curtain","device":"Curtain 1A","file":"tests/curtain/curtain_connect.test.ts","testName":"[P0][ONES:191100] 添加Roller Shade验证","status":"todo"}, + {"kind":"feature","ones":190802,"name":"同步URC设备、控制","cat":"urc","device":"URC 5Y","file":"tests/urc/urc_control.test.ts","testName":"[P0][ONES:190802] 同步URC设备、控制","status":"todo"}, + {"kind":"add","ones":190801,"name":"添加URC验证","cat":"urc","device":"URC 5Y","file":"tests/urc/urc_connect.test.ts","testName":"[P0][ONES:190801] 添加URC验证","status":"todo"}, + {"kind":"feature","ones":162264,"name":"K10+ Pro Combo解除绑定手持","cat":"robot","device":"Robot S1","file":"tests/robot/robot_control.test.ts","testName":"[P0][ONES:162264] K10+ Pro Combo解除绑定手持","status":"todo"}, + {"kind":"feature","ones":162263,"name":"K10+ Pro Combo绑定手持吸尘器","cat":"robot","device":"Robot S1","file":"tests/robot/robot_control.test.ts","testName":"[P0][ONES:162263] K10+ Pro Combo绑定手持吸尘器","status":"todo"}, + {"kind":"add","ones":162261,"name":"添加K10+ Pro Combo","cat":"robot","device":"Robot S1","file":"tests/robot/robot_connect.test.ts","testName":"[P0][ONES:162261] 添加K10+ Pro Combo","status":"todo"}, + {"kind":"add","ones":122775,"name":"添加 Circulator Fan验证(无电池款)","cat":"fan","device":"Fan 0T","file":"tests/fan/fan_connect.test.ts","testName":"[P0][ONES:122775] 添加 Circulator Fan验证(无电池款)","status":"todo"}, + {"kind":"add","ones":122737,"name":"添加K10+Pro扫地机","cat":"robot","device":"Robot S1","file":"tests/robot/robot_connect.test.ts","testName":"[P0][ONES:122737] 添加K10+Pro扫地机","status":"todo"}, + {"kind":"add","ones":113943,"name":"添加PTC Plus 5MP","cat":"camera","device":"摄像机Plus 3K","file":"tests/camera/camera_connect.test.ts","testName":"[P0][ONES:113943] 添加PTC Plus 5MP","status":"todo"}, + {"kind":"add","ones":113942,"name":"添加OSC 2K验证","cat":"osc","device":"OSC 2K","file":"tests/osc/osc_connect.test.ts","testName":"[P0][ONES:113942] 添加OSC 2K验证","status":"todo"}, + {"kind":"add","ones":113941,"name":"添加OSC验证","cat":"osc","device":"OSC 2K","file":"tests/osc/osc_connect.test.ts","testName":"[P0][ONES:113941] 添加OSC验证","status":"todo"}, + {"kind":"add","ones":105436,"name":"添加lock Pro&kit验证","cat":"lock","device":"Lock 6F","file":"tests/lock/lock_connect.test.ts","testName":"[P0][ONES:105436] 添加lock Pro&kit验证","status":"todo"}, + {"kind":"add","ones":78369,"name":"添加S10扫地机","cat":"robot","device":"Robot S1","file":"tests/robot/robot_connect.test.ts","testName":"[P0][ONES:78369] 添加S10扫地机","status":"todo"}, + {"kind":"feature","ones":74105,"name":"强绑定设备的自动解绑申请","cat":"","device":"","file":"","testName":"","status":"na"}, + {"kind":"add","ones":74104,"name":"添加Humidifier2验证","cat":"humidifier","device":"Humidifier 1K","file":"tests/humidifier/humidifier_connect.test.ts","testName":"[P0][ONES:74104] 添加Humidifier2验证","status":"todo"}, + {"kind":"feature","ones":74078,"name":"APP切换温湿度单位显示","cat":"meter","device":"Meter 3M","file":"tests/meter/meter_control.test.ts","testName":"[P0][ONES:74078] APP切换温湿度单位显示","status":"todo"}, + {"kind":"add","ones":66694,"name":"添加Lock Pro验证","cat":"lock","device":"Lock 6F","file":"tests/lock/lock_connect.test.ts","testName":"[P0][ONES:66694] 添加Lock Pro验证","status":"todo"}, + {"kind":"add","ones":65336,"name":"添加Hub Mini Matter验证","cat":"hub","device":"Hub2 8H","file":"tests/hub/hub_connect.test.ts","testName":"[P0][ONES:65336] 添加Hub Mini Matter验证","status":"todo"}, + {"kind":"add","ones":51440,"name":"添加lock&kit验证","cat":"lock","device":"Lock 6F","file":"tests/lock/lock_connect.test.ts","testName":"[P0][ONES:51440] 添加lock&kit验证","status":"todo"}, + {"kind":"add","ones":48159,"name":"添加Battery Circulator Fan验证","cat":"fan","device":"Fan 0T","file":"tests/fan/fan_connect.test.ts","testName":"[P0][ONES:48159] 添加Battery Circulator Fan验证","status":"todo"}, + {"kind":"add","ones":47214,"name":"添加PTC Plus 3MP","cat":"camera","device":"摄像机Plus 3K","file":"tests/camera/camera_connect.test.ts","testName":"[P0][ONES:47214] 添加PTC Plus 3MP","status":"todo"}, + {"kind":"add","ones":40955,"name":"添加curtain 3验证","cat":"curtain","device":"Curtain 1A","file":"tests/curtain/curtain_connect.test.ts","testName":"[P0][ONES:40955] 添加curtain 3验证","status":"todo"}, + {"kind":"add","ones":40954,"name":"添加K10+扫地机","cat":"robot","device":"Robot S1","file":"tests/robot/robot_connect.test.ts","testName":"[P0][ONES:40954] 添加K10+扫地机","status":"todo"}, + {"kind":"add","ones":35871,"name":"添加IOSensor验证","cat":"sensor","device":"Contact Sensor 5O","file":"tests/sensor/sensor_connect.test.ts","testName":"[P0][ONES:35871] 添加IOSensor验证","status":"todo"}, + {"kind":"add","ones":21787,"name":"添加Hub2 验证","cat":"hub","device":"Hub2 8H","file":"tests/hub/hub_connect.test.ts","testName":"[P0][ONES:21787] 添加Hub2 验证","status":"todo"}, + {"kind":"feature","ones":15973,"name":"keypad、keypad touch添加密码、指纹、卡片验证","cat":"keypad","device":"Keypad 2V","file":"tests/keypad/keypad_control.test.ts","testName":"[P0][ONES:15973] keypad、keypad touch添加密码、指纹、卡片验证","status":"todo"}, + {"kind":"add","ones":15972,"name":"添加Hub Mini验证","cat":"hub","device":"Hub2 8H","file":"tests/hub/hub_connect.test.ts","testName":"[P0][ONES:15972] 添加Hub Mini验证","status":"todo"}, + {"kind":"add","ones":15971,"name":"添加Hub Plus验证","cat":"hub","device":"Hub2 8H","file":"tests/hub/hub_connect.test.ts","testName":"[P0][ONES:15971] 添加Hub Plus验证","status":"todo"}, + {"kind":"add","ones":15970,"name":"添加Lock验证","cat":"lock","device":"Lock 6F","file":"tests/lock/lock_connect.test.ts","testName":"[P0][ONES:15970] 添加Lock验证","status":"todo"}, + {"kind":"add","ones":15969,"name":"添加Curtain验证","cat":"curtain","device":"Curtain 1A","file":"tests/curtain/curtain_connect.test.ts","testName":"[P0][ONES:15969] 添加Curtain验证","status":"todo"}, + {"kind":"add","ones":15968,"name":"添加Bot验证","cat":"bot","device":"Bot 0F","file":"tests/bot/bot_connect.test.ts","testName":"[P0][ONES:15968] 添加Bot验证","status":"todo"}, + {"kind":"add","ones":15967,"name":"添加Remote验证","cat":"remote","device":"Remote 3W","file":"tests/remote/remote_connect.test.ts","testName":"[P0][ONES:15967] 添加Remote验证","status":"todo"}, + {"kind":"add","ones":15966,"name":"添加Plug验证","cat":"plug","device":"Plug 4D","file":"tests/plug/plug_connect.test.ts","testName":"[P0][ONES:15966] 添加Plug验证","status":"todo"}, + {"kind":"add","ones":15965,"name":"添加Meter验证","cat":"meter","device":"Meter 3M","file":"tests/meter/meter_connect.test.ts","testName":"[P0][ONES:15965] 添加Meter验证","status":"todo"}, + {"kind":"add","ones":15964,"name":"添加Humidifier验证","cat":"humidifier","device":"Humidifier 1K","file":"tests/humidifier/humidifier_connect.test.ts","testName":"[P0][ONES:15964] 添加Humidifier验证","status":"todo"}, + {"kind":"add","ones":15963,"name":"添加Motion Sensor验证","cat":"sensor","device":"Contact Sensor 5O","file":"tests/sensor/sensor_connect.test.ts","testName":"[P0][ONES:15963] 添加Motion Sensor验证","status":"todo"}, + {"kind":"add","ones":15962,"name":"添加Contact Sensor验证","cat":"sensor","device":"Contact Sensor 5O","file":"tests/sensor/sensor_connect.test.ts","testName":"[P0][ONES:15962] 添加Contact Sensor验证","status":"todo"}, + {"kind":"add","ones":15961,"name":"添加Indoor Cam验证","cat":"camera","device":"摄像机Plus 3K","file":"tests/camera/camera_connect.test.ts","testName":"[P0][ONES:15961] 添加Indoor Cam验证","status":"todo"}, + {"kind":"add","ones":15960,"name":"添加Color Bulb验证","cat":"color_bulb","device":"ColorBulb 8R","file":"tests/color_bulb/color_bulb_connect.test.ts","testName":"[P0][ONES:15960] 添加Color Bulb验证","status":"todo"}, + {"kind":"add","ones":15959,"name":"添加Strip Light验证","cat":"strip_light","device":"StripLight 9S","file":"tests/strip_light/strip_light_connect.test.ts","testName":"[P0][ONES:15959] 添加Strip Light验证","status":"todo"}, + {"kind":"add","ones":15958,"name":"添加Plug Mini验证(JP和US)","cat":"plug","device":"Plug 4D","file":"tests/plug/plug_connect.test.ts","testName":"[P0][ONES:15958] 添加Plug Mini验证(JP和US)","status":"todo"}, + {"kind":"add","ones":15957,"name":"添加Pan/Tilt Cam验证","cat":"camera","device":"摄像机Plus 3K","file":"tests/camera/camera_connect.test.ts","testName":"[P0][ONES:15957] 添加Pan/Tilt Cam验证","status":"todo"}, + {"kind":"add","ones":15956,"name":"添加Meter Plus验证","cat":"meter","device":"Meter 3M","file":"tests/meter/meter_connect.test.ts","testName":"[P0][ONES:15956] 添加Meter Plus验证","status":"todo"}, + {"kind":"feature","ones":15955,"name":"智能匹配遥控器","cat":"remote","device":"Remote 3W","file":"tests/remote/remote_control.test.ts","testName":"[P0][ONES:15955] 智能匹配遥控器","status":"todo"}, + {"kind":"feature","ones":15954,"name":"学习自定义遥控器","cat":"remote","device":"Remote 3W","file":"tests/remote/remote_control.test.ts","testName":"[P0][ONES:15954] 学习自定义遥控器","status":"todo"}, + {"kind":"feature","ones":15953,"name":"学习others遥控器","cat":"remote","device":"Remote 3W","file":"tests/remote/remote_control.test.ts","testName":"[P0][ONES:15953] 学习others遥控器","status":"todo"}, + {"kind":"add","ones":15952,"name":"添加Robot Vacuum S1验证","cat":"robot","device":"Robot S1","file":"tests/robot/robot_connect.test.ts","testName":"[P0][ONES:15952] 添加Robot Vacuum S1验证","status":"todo"}, + {"kind":"add","ones":15951,"name":"添加Robot Vacuum S1 Plus验证","cat":"robot","device":"Robot S1","file":"tests/robot/robot_connect.test.ts","testName":"[P0][ONES:15951] 添加Robot Vacuum S1 Plus验证","status":"todo"}, + {"kind":"add","ones":15950,"name":"添加吸顶灯验证(Pro和lte)","cat":"ceiling_light","device":"CeilingLight 7Q","file":"tests/ceiling_light/ceiling_light_connect.test.ts","testName":"[P0][ONES:15950] 添加吸顶灯验证(Pro和lte)","status":"todo"}, + {"kind":"add","ones":15949,"name":"添加keypad验证","cat":"keypad","device":"Keypad 2V","file":"tests/keypad/keypad_connect.test.ts","testName":"[P0][ONES:15949] 添加keypad验证","status":"todo"}, + {"kind":"add","ones":15948,"name":"添加keypad touch验证","cat":"keypad","device":"Keypad 2V","file":"tests/keypad/keypad_connect.test.ts","testName":"[P0][ONES:15948] 添加keypad touch验证","status":"todo"}, + {"kind":"add","ones":15947,"name":"添加Pan/Tilt Cam 2K验证","cat":"camera","device":"摄像机Plus 3K","file":"tests/camera/camera_connect.test.ts","testName":"[P0][ONES:15947] 添加Pan/Tilt Cam 2K验证","status":"todo"}, + {"kind":"add","ones":15946,"name":"添加Blind Tilt验证","cat":"curtain","device":"Curtain 1A","file":"tests/curtain/curtain_connect.test.ts","testName":"[P0][ONES:15946] 添加Blind Tilt验证","status":"todo"}, + {"kind":"ctrl","ones":15975,"step":"6e4uZSVe","proto":"ble","name":"点击控制Bot 不加密开&不加密关&加密按压","result":"对应Bot固件响应动作","cat":"bot","device":"Bot 0F","action":"点击控制Bot 不加密开&不加密关&加密按压","file":"tests/bot/bot_control.test.ts","testName":"[P0][ONES:15975#6e4uZSVe][ble] 点击控制Bot 不加密开&不加密关&加密按压 Bot 0F","status":"todo"}, + {"kind":"ctrl","ones":15975,"step":"5YEfmpJz","proto":"ble","name":"点击控制Lock 开锁/解锁","result":"对应Lock固件响应动作开锁/解锁","cat":"lock","device":"Lock 6F","action":"点击控制Lock 开锁/解锁","file":"tests/lock/lock_control.test.ts","testName":"[P0][ONES:15975#5YEfmpJz][ble] 点击控制Lock 开锁/解锁 Lock 6F","status":"todo"}, + {"kind":"ctrl","ones":15975,"step":"774V8bND","proto":"ble","name":"Curtain---快捷弹窗---开/关","result":"对应Curtain固件响应动作开/关","cat":"curtain","device":"Curtain 1A","action":"Curtain---快捷弹窗---开/关","file":"tests/curtain/curtain_control.test.ts","testName":"[P0][ONES:15975#774V8bND][ble] Curtain---快捷弹窗---开/关 Curtain 1A","status":"todo"}, + {"kind":"ctrl","ones":15975,"step":"NvpUv9Tt","proto":"ble","name":"Meter---历史数据---右上角设置---报警条件,开启温度和湿度报警,拉动滑条使当前温湿度在报警范围内","result":"历史数据能够加载,不会有特别异常的数据图表,主页对应Meter温湿度字体变红色","cat":"meter","device":"Meter 3M","action":"Meter---历史数据---右上角设置---报","file":"tests/meter/meter_control.test.ts","testName":"[P0][ONES:15975#NvpUv9Tt][ble] Meter---历史数据---右上角设置---报 Meter 3M","status":"todo"}, + {"kind":"ctrl","ones":15975,"step":"3Jm5FAdW","proto":"ble","name":"Meter---历史数据---右上角设置---校正---校准温度---下一步,调整温度范围增加温度","result":"温度校正过程中对应Meter固件的温度值也相应变化","cat":"meter","device":"Meter 3M","action":"Meter---历史数据---右上角设置---校","file":"tests/meter/meter_control.test.ts","testName":"[P0][ONES:15975#3Jm5FAdW][ble] Meter---历史数据---右上角设置---校 Meter 3M","status":"todo"}, + {"kind":"ctrl","ones":15975,"step":"QfYLdj8s","proto":"ble","name":"执行步骤5至校正---校正湿度---下一步,调整湿度范围增加湿度","result":"湿度校正过程中对应Meter固件的湿度值也相应变化","cat":"humidifier","device":"Humidifier 1K","action":"执行步骤5至校正---校正湿度---下一步,调整","file":"tests/humidifier/humidifier_control.test.ts","testName":"[P0][ONES:15975#QfYLdj8s][ble] 执行步骤5至校正---校正湿度---下一步,调整 Humidifier 1K","status":"todo"}, + {"kind":"ctrl","ones":15975,"step":"GkkrZpaC","proto":"ble","name":"Humidifier---快捷弹窗---开启加湿器自动/低/中/高档/关闭","result":"对应Humidifier固件响应动作开启加湿器自动/低/中/高档/关闭","cat":"humidifier","device":"Humidifier 1K","action":"Humidifier---快捷弹窗---开启加湿","file":"tests/humidifier/humidifier_control.test.ts","testName":"[P0][ONES:15975#GkkrZpaC][ble] Humidifier---快捷弹窗---开启加湿 Humidifier 1K","status":"todo"}, + {"kind":"ctrl","ones":15975,"step":"TNhSAuUC","proto":"ble","name":"点击控制Bulb 开/关","result":"对应Bulb固件响应动作开/关","cat":"color_bulb","device":"ColorBulb 8R","action":"点击控制Bulb 开/关","file":"tests/color_bulb/color_bulb_control.test.ts","testName":"[P0][ONES:15975#TNhSAuUC][ble] 点击控制Bulb 开/关 ColorBulb 8R","status":"todo"}, + {"kind":"ctrl","ones":15975,"step":"4poyiVwD","proto":"ble","name":"点击控制Strip Light开/关","result":"对应Strip Light固件响应动作开/关","cat":"strip_light","device":"StripLight 9S","action":"点击控制Strip Light开/关","file":"tests/strip_light/strip_light_control.test.ts","testName":"[P0][ONES:15975#4poyiVwD][ble] 点击控制Strip Light开/关 StripLight 9S","status":"todo"}, + {"kind":"ctrl","ones":15975,"step":"2528azD6","proto":"ble","name":"点击控制吸顶灯pro开/关灯","result":"对应吸顶灯pro固件响应动作开/关灯","cat":"ceiling_light","device":"CeilingLight 7Q","action":"点击控制吸顶灯pro开/关灯","file":"tests/ceiling_light/ceiling_light_control.test.ts","testName":"[P0][ONES:15975#2528azD6][ble] 点击控制吸顶灯pro开/关灯 CeilingLight 7Q","status":"todo"}, + {"kind":"ctrl","ones":15975,"step":"V15M64cP","proto":"ble","name":"点击控制吸顶灯lte开/关灯","result":"对应吸顶灯lte固件响应动作开/关灯","cat":"ceiling_light","device":"CeilingLight 7Q","action":"点击控制吸顶灯lte开/关灯","file":"tests/ceiling_light/ceiling_light_control.test.ts","testName":"[P0][ONES:15975#V15M64cP][ble] 点击控制吸顶灯lte开/关灯 CeilingLight 7Q","status":"todo"}, + {"kind":"ctrl","ones":15975,"step":"2jSFfY4k","proto":"ble","name":"点击控制Plug Mini开/关","result":"对应Plug Mini固件响应动作开/关","cat":"plug","device":"Plug 4D","action":"点击控制Plug Mini开/关","file":"tests/plug/plug_control.test.ts","testName":"[P0][ONES:15975#2jSFfY4k][ble] 点击控制Plug Mini开/关 Plug 4D","status":"todo"}, + {"kind":"ctrl","ones":15975,"step":"UZCtZRPy","proto":"ble","name":"Meter Plus---历史数据---右上角设置---报警条件,开启温度和湿度报警,拉动滑条使当前温湿度在报警范围内","result":"历史数据能够加载,不会有特别异常的数据图表,主页对应Meter Plus温湿度字体变红色","cat":"meter","device":"Meter 3M","action":"Meter Plus---历史数据---右上角设","file":"tests/meter/meter_control.test.ts","testName":"[P0][ONES:15975#UZCtZRPy][ble] Meter Plus---历史数据---右上角设 Meter 3M","status":"todo"}, + {"kind":"ctrl","ones":15975,"step":"9mheLMDJ","proto":"ble","name":"Meter Plus---历史数据---右上角设置---校正---校准温度---下一步,调整温度范围增加温度","result":"温度校正过程中对应Meter Plus固件的温度值也相应变化","cat":"meter","device":"Meter 3M","action":"Meter Plus---历史数据---右上角设","file":"tests/meter/meter_control.test.ts","testName":"[P0][ONES:15975#9mheLMDJ][ble] Meter Plus---历史数据---右上角设 Meter 3M","status":"todo"}, + {"kind":"ctrl","ones":15975,"step":"GSZv8BYm","proto":"ble","name":"执行步骤14至校正---校正湿度---下一步,调整湿度范围增加湿度","result":"湿度校正过程中对应Meter Plus固件的湿度值也相应变化","cat":"humidifier","device":"Humidifier 1K","action":"执行步骤14至校正---校正湿度---下一步,调","file":"tests/humidifier/humidifier_control.test.ts","testName":"[P0][ONES:15975#GSZv8BYm][ble] 执行步骤14至校正---校正湿度---下一步,调 Humidifier 1K","status":"todo"}, + {"kind":"ctrl","ones":15975,"step":"HrigrD2X","proto":"ble","name":"Motion Sensor---功能页面,在Motion Sensor固件前移动","result":"功能页面正常显示有人移动","cat":"sensor","device":"Contact Sensor 5O","action":"Motion Sensor---功能页面,在Mo","file":"tests/sensor/sensor_control.test.ts","testName":"[P0][ONES:15975#HrigrD2X][ble] Motion Sensor---功能页面,在Mo Contact Sensor 5O","status":"todo"}, + {"kind":"ctrl","ones":15975,"step":"A8C4BsCm","proto":"ble","name":"Contact Sensor---功能页面,开关Contact Sensor固件","result":"功能页面正常显示Contact Sensor的开关状态","cat":"sensor","device":"Contact Sensor 5O","action":"Contact Sensor---功能页面,开关","file":"tests/sensor/sensor_control.test.ts","testName":"[P0][ONES:15975#A8C4BsCm][ble] Contact Sensor---功能页面,开关 Contact Sensor 5O","status":"todo"}, + {"kind":"ctrl","ones":15975,"step":"3frMRDZj","proto":"ble","name":"点击控制固件V20版本BlindTilt首页按钮","result":"响应到正确开合状态","cat":"curtain","device":"Curtain 1A","action":"点击控制固件V20版本BlindTilt首页按钮","file":"tests/curtain/curtain_control.test.ts","testName":"[P0][ONES:15975#3frMRDZj][ble] 点击控制固件V20版本BlindTilt首页按钮 Curtain 1A","status":"todo"}, + {"kind":"ctrl","ones":15975,"step":"Qbm9VB72","proto":"ble","name":"点击控制固件V12版本BlindTil功能页按钮(验证兼容旧版本)","result":"响应到正确开合状态","cat":"curtain","device":"Curtain 1A","action":"点击控制固件V12版本BlindTil功能页按钮","file":"tests/curtain/curtain_control.test.ts","testName":"[P0][ONES:15975#Qbm9VB72][ble] 点击控制固件V12版本BlindTil功能页按钮 Curtain 1A","status":"todo"}, + {"kind":"ctrl","ones":15975,"step":"QwnZJARA","proto":"ble","name":"IOSensor---历史数据---右上角设置---报警条件,开启温度和湿度报警,拉动滑条使当前温湿度在报警范围内","result":"历史数据能够加载,不会有特别异常的数据图表,主页对应IOSensor温湿度字体变红色","cat":"sensor","device":"Contact Sensor 5O","action":"IOSensor---历史数据---右上角设置-","file":"tests/sensor/sensor_control.test.ts","testName":"[P0][ONES:15975#QwnZJARA][ble] IOSensor---历史数据---右上角设置- Contact Sensor 5O","status":"todo"}, + {"kind":"ctrl","ones":15975,"step":"Ncg7BDeR","proto":"ble","name":"IOSensor---历史数据---右上角设置---校正---校准温度---下一步,调整温度范围增加温度","result":"温度校正过程中对应IOSensor固件的温度值也相应变化","cat":"sensor","device":"Contact Sensor 5O","action":"IOSensor---历史数据---右上角设置-","file":"tests/sensor/sensor_control.test.ts","testName":"[P0][ONES:15975#Ncg7BDeR][ble] IOSensor---历史数据---右上角设置- Contact Sensor 5O","status":"todo"}, + {"kind":"ctrl","ones":15975,"step":"k6cqKqtZ","proto":"ble","name":"执行步骤21至校正---校正湿度---下一步,调整湿度范围增加湿度","result":"湿度校正过程中对应IOSensor固件的湿度值也相应变化","cat":"humidifier","device":"Humidifier 1K","action":"执行步骤21至校正---校正湿度---下一步,调","file":"tests/humidifier/humidifier_control.test.ts","testName":"[P0][ONES:15975#k6cqKqtZ][ble] 执行步骤21至校正---校正湿度---下一步,调 Humidifier 1K","status":"todo"}, + {"kind":"ctrl","ones":15975,"step":"QqsnPMc3","proto":"ble","name":"Curtain 3---快捷弹窗---开/关","result":"对应Curtain 3固件响应动作开/关","cat":"curtain","device":"Curtain 1A","action":"Curtain 3---快捷弹窗---开/关","file":"tests/curtain/curtain_control.test.ts","testName":"[P0][ONES:15975#QqsnPMc3][ble] Curtain 3---快捷弹窗---开/关 Curtain 1A","status":"todo"}, + {"kind":"ctrl","ones":15975,"step":"CiFPEbNS","proto":"ble","name":"带电池款Battery Circulator Fan---首页控制开关","result":"对应循环扇开关","cat":"fan","device":"Fan 0T","action":"带电池款Battery Circulator F","file":"tests/fan/fan_control.test.ts","testName":"[P0][ONES:15975#CiFPEbNS][ble] 带电池款Battery Circulator F Fan 0T","status":"todo"}, + {"kind":"ctrl","ones":15975,"step":"LnPNEJmS","proto":"ble","name":"点击控制Lock Pro开锁/解锁","result":"对应Lock Pro固件响应动作开锁/解锁","cat":"lock","device":"Lock 6F","action":"点击控制Lock Pro开锁/解锁","file":"tests/lock/lock_control.test.ts","testName":"[P0][ONES:15975#LnPNEJmS][ble] 点击控制Lock Pro开锁/解锁 Lock 6F","status":"todo"}, + {"kind":"ctrl","ones":15975,"step":"3PmZMk1s","proto":"ble","name":"进入Humidifier2设置页,绑定温湿度计,点击切换档位、模式","result":"绑定成功,功能页显示对应湿度值;切换档位、模式、目标湿度正常。","cat":"humidifier","device":"Humidifier 1K","action":"进入Humidifier2设置页,绑定温湿度计,","file":"tests/humidifier/humidifier_control.test.ts","testName":"[P0][ONES:15975#3PmZMk1s][ble] 进入Humidifier2设置页,绑定温湿度计, Humidifier 1K","status":"todo"}, + {"kind":"ctrl","ones":15975,"step":"JBszgxRS","proto":"ble","name":"无电池款Circulator Fan---首页控制开关","result":"对应循环扇开关","cat":"fan","device":"Fan 0T","action":"无电池款Circulator Fan---首页控","file":"tests/fan/fan_control.test.ts","testName":"[P0][ONES:15975#JBszgxRS][ble] 无电池款Circulator Fan---首页控 Fan 0T","status":"todo"}, + {"kind":"ctrl","ones":15975,"step":"SmzuHtWi","proto":"ble","name":"Roller Shade功能页控制设备全开、暂停、全关、任意百分比控制","result":"Roller Shade正常响应所有控制指令","cat":"curtain","device":"Curtain 1A","action":"Roller Shade功能页控制设备全开、暂停","file":"tests/curtain/curtain_control.test.ts","testName":"[P0][ONES:15975#SmzuHtWi][ble] Roller Shade功能页控制设备全开、暂停 Curtain 1A","status":"todo"}, + {"kind":"ctrl","ones":15975,"step":"7qxA1ajE","proto":"ble","name":"点击控制美规基础款空气净化器--开/关","result":"对应美规基础款空气净化器开关","cat":"air_condition","device":"AirCondition IR","action":"点击控制美规基础款空气净化器--开/关","file":"tests/air_condition/air_condition_control.test.ts","testName":"[P0][ONES:15975#7qxA1ajE][ble] 点击控制美规基础款空气净化器--开/关 AirCondition IR","status":"todo"}, + {"kind":"ctrl","ones":15975,"step":"R5PDp8BR","proto":"ble","name":"点击控制日规Table空气净化器--开/关","result":"对应日规Table空气净化器开/关","cat":"air_condition","device":"AirCondition IR","action":"点击控制日规Table空气净化器--开/关","file":"tests/air_condition/air_condition_control.test.ts","testName":"[P0][ONES:15975#R5PDp8BR][ble] 点击控制日规Table空气净化器--开/关 AirCondition IR","status":"todo"}, + {"kind":"ctrl","ones":15975,"step":"3wM6fW8W","proto":"ble","name":"Curtain 3 2025---快捷弹窗---开/关","result":"对应Curtain 3 2025固件响应动作开/关","cat":"curtain","device":"Curtain 1A","action":"Curtain 3 2025---快捷弹窗---","file":"tests/curtain/curtain_control.test.ts","testName":"[P0][ONES:15975#3wM6fW8W][ble] Curtain 3 2025---快捷弹窗--- Curtain 1A","status":"todo"}, + {"kind":"ctrl","ones":15975,"step":"JggzNXDo","proto":"ble","name":"Meter pro---图表数据---右上角设置---报警条件,开启温度和湿度报警,拉动滑条使当前温湿度在报警范围内","result":"图表数据能够加载,不会有特别异常的数据图表,主页对应Meter Pro温湿度字体变红色","cat":"meter","device":"Meter 3M","action":"Meter pro---图表数据---右上角设置","file":"tests/meter/meter_control.test.ts","testName":"[P0][ONES:15975#JggzNXDo][ble] Meter pro---图表数据---右上角设置 Meter 3M","status":"todo"}, + {"kind":"ctrl","ones":15975,"step":"L967RGHa","proto":"ble","name":"Meter pro---设置页--校正---校准温度---下一步,调整温度范围增加温度","result":"温度校正过程中对应Meter Pro固件的温度值也相应变化","cat":"meter","device":"Meter 3M","action":"Meter pro---设置页--校正---校准","file":"tests/meter/meter_control.test.ts","testName":"[P0][ONES:15975#L967RGHa][ble] Meter pro---设置页--校正---校准 Meter 3M","status":"todo"}, + {"kind":"ctrl","ones":15975,"step":"8Wzaj5pB","proto":"ble","name":"校正---校正湿度---下一步,调整湿度范围增加湿度","result":"湿度校正过程中对应Meter Pro固件的湿度值也相应变化","cat":"humidifier","device":"Humidifier 1K","action":"校正---校正湿度---下一步,调整湿度范围增加","file":"tests/humidifier/humidifier_control.test.ts","testName":"[P0][ONES:15975#8Wzaj5pB][ble] 校正---校正湿度---下一步,调整湿度范围增加 Humidifier 1K","status":"todo"}, + {"kind":"ctrl","ones":15975,"step":"3bYsmiZG","proto":"ble","name":"Meter pro co2---图表数据---右上角设置---报警条件,开启温度和湿度报警,拉动滑条使当前温湿度在报警范围内","result":"图表数据能够加载,不会有特别异常的数据图表,主页对应Meter Pro co2温湿度字体变红色","cat":"meter","device":"Meter 3M","action":"Meter pro co2---图表数据---右","file":"tests/meter/meter_control.test.ts","testName":"[P0][ONES:15975#3bYsmiZG][ble] Meter pro co2---图表数据---右 Meter 3M","status":"todo"}, + {"kind":"ctrl","ones":15975,"step":"NDqRQxVx","proto":"ble","name":"Meter pro co2---设置页--校正---校准温度---下一步,调整温度范围增加温度","result":"温度校正过程中对应Meter Pro co2固件的温度值也相应变化","cat":"meter","device":"Meter 3M","action":"Meter pro co2---设置页--校正-","file":"tests/meter/meter_control.test.ts","testName":"[P0][ONES:15975#NDqRQxVx][ble] Meter pro co2---设置页--校正- Meter 3M","status":"todo"}, + {"kind":"ctrl","ones":15975,"step":"DxKG9Acs","proto":"ble","name":"校正---校正湿度---下一步,调整湿度范围增加湿度","result":"湿度校正过程中对应Meter Pro co2固件的湿度值也相应变化","cat":"humidifier","device":"Humidifier 1K","action":"校正---校正湿度---下一步,调整湿度范围增加","file":"tests/humidifier/humidifier_control.test.ts","testName":"[P0][ONES:15975#DxKG9Acs][ble] 校正---校正湿度---下一步,调整湿度范围增加 Humidifier 1K","status":"todo"}, + {"kind":"ctrl","ones":15975,"step":"3ob75cjf","proto":"ble","name":"点击控制RGBWW 彩色灯带3 --开/关","result":"对应RGBWW 彩色灯带3 --固件响应动作开/关","cat":"strip_light","device":"StripLight 9S","action":"点击控制RGBWW 彩色灯带3 --开/关","file":"tests/strip_light/strip_light_control.test.ts","testName":"[P0][ONES:15975#3ob75cjf][ble] 点击控制RGBWW 彩色灯带3 --开/关 StripLight 9S","status":"todo"}, + {"kind":"ctrl","ones":15975,"step":"JVnRz7xY","proto":"ble","name":"点击控制RGBWW 落地灯 --开/关","result":"对应RGBWW 落地灯 --固件响应动作开/关","cat":"ceiling_light","device":"CeilingLight 7Q","action":"点击控制RGBWW 落地灯 --开/关","file":"tests/ceiling_light/ceiling_light_control.test.ts","testName":"[P0][ONES:15975#JVnRz7xY][ble] 点击控制RGBWW 落地灯 --开/关 CeilingLight 7Q","status":"todo"}, + {"kind":"ctrl","ones":15975,"step":"MKgLq1oy","proto":"ble","name":"点击控制Relay switch 1pm","result":"对应Relay Switch 1pm -固件响应动作开/关","cat":"plug","device":"Plug 4D","action":"点击控制Relay switch 1pm","file":"tests/plug/plug_control.test.ts","testName":"[P0][ONES:15975#MKgLq1oy][ble] 点击控制Relay switch 1pm Plug 4D","status":"todo"}, + {"kind":"ctrl","ones":15975,"step":"A1TLxsFw","proto":"ble","name":"点击控制Relay switch 1","result":"对应Relay Switch 1-固件响应动作开/关","cat":"plug","device":"Plug 4D","action":"点击控制Relay switch 1","file":"tests/plug/plug_control.test.ts","testName":"[P0][ONES:15975#A1TLxsFw][ble] 点击控制Relay switch 1 Plug 4D","status":"todo"}, + {"kind":"ctrl","ones":15975,"step":"PG62s725","proto":"ble","name":"点击控制Relay switch 2pm-开关控制器","result":"对应Relay Switch 2pm开关控制器-固件响应动作开/关","cat":"plug","device":"Plug 4D","action":"点击控制Relay switch 2pm-开关控","file":"tests/plug/plug_control.test.ts","testName":"[P0][ONES:15975#PG62s725][ble] 点击控制Relay switch 2pm-开关控 Plug 4D","status":"todo"}, + {"kind":"ctrl","ones":15975,"step":"AafJ5tj5","proto":"ble","name":"点击控制Relay switch 2pm-覆盖控制器","result":"对应Relay Switch 2pm覆盖控制器-固件响应动作开/关","cat":"plug","device":"Plug 4D","action":"点击控制Relay switch 2pm-覆盖控","file":"tests/plug/plug_control.test.ts","testName":"[P0][ONES:15975#AafJ5tj5][ble] 点击控制Relay switch 2pm-覆盖控 Plug 4D","status":"todo"}, + {"kind":"ctrl","ones":15975,"step":"E5YRm4Pg","proto":"ble","name":"点击控制Garage Door Opener","result":"对应Garage Door Opener-固件响应动作开/关","cat":"plug","device":"Plug 4D","action":"点击控制Garage Door Opener","file":"tests/plug/plug_control.test.ts","testName":"[P0][ONES:15975#E5YRm4Pg][ble] 点击控制Garage Door Opener Plug 4D","status":"todo"}, + {"kind":"ctrl","ones":15975,"step":"QAHNrXrm","proto":"ble","name":"点击控制RGBICWW Strip Light (炫彩灯带)--开/关","result":"对应RGBICWW Strip Light (炫彩灯带)--固件响应动作开/关","cat":"strip_light","device":"StripLight 9S","action":"点击控制RGBICWW Strip Light ","file":"tests/strip_light/strip_light_control.test.ts","testName":"[P0][ONES:15975#QAHNrXrm][ble] 点击控制RGBICWW Strip Light StripLight 9S","status":"todo"}, + {"kind":"ctrl","ones":15975,"step":"AfxmoAEq","proto":"ble","name":"点击控制RGBICWW Floor Lamp(炫彩落地灯)--开/关","result":"对应RGBICWW Floor Lamp(炫彩落地灯)--固件响应动作开/关","cat":"ceiling_light","device":"CeilingLight 7Q","action":"点击控制RGBICWW Floor Lamp(炫","file":"tests/ceiling_light/ceiling_light_control.test.ts","testName":"[P0][ONES:15975#AfxmoAEq][ble] 点击控制RGBICWW Floor Lamp(炫 CeilingLight 7Q","status":"todo"}, + {"kind":"ctrl","ones":15975,"step":"E2QCS8xy","proto":"ble","name":"点击控制RGBIC Neon Wire Rope Light(炫彩钢丝霓虹灯)--开/关","result":"对应RGBIC Neon Wire Rope Light(炫彩钢丝霓虹灯)--固件响应动作开/关","cat":"strip_light","device":"StripLight 9S","action":"点击控制RGBIC Neon Wire Rope","file":"tests/strip_light/strip_light_control.test.ts","testName":"[P0][ONES:15975#E2QCS8xy][ble] 点击控制RGBIC Neon Wire Rope StripLight 9S","status":"todo"}, + {"kind":"ctrl","ones":15975,"step":"TSVKWcJ3","proto":"ble","name":"点击控制eu plug--开/关","result":"对应设备响应开/关","cat":"plug","device":"Plug 4D","action":"点击控制eu plug--开/关","file":"tests/plug/plug_control.test.ts","testName":"[P0][ONES:15975#TSVKWcJ3][ble] 点击控制eu plug--开/关 Plug 4D","status":"todo"}, + {"kind":"ctrl","ones":15975,"step":"XWmNA9UL","proto":"ble","name":"Standing Circulator fan--首页控制开关","result":"对应落地扇响应开/关","cat":"fan","device":"Fan 0T","action":"Standing Circulator fan-","file":"tests/fan/fan_control.test.ts","testName":"[P0][ONES:15975#XWmNA9UL][ble] Standing Circulator fan- Fan 0T","status":"todo"}, + {"kind":"ctrl","ones":15974,"step":"Qt4hcgB4","proto":"wifi","name":"点击控制Bot 不加密开&不加密关&加密按压","result":"对应Bot固件响应动作","cat":"bot","device":"Bot 0F","action":"点击控制Bot 不加密开&不加密关&加密按压","file":"tests/bot/bot_control.test.ts","testName":"[P0][ONES:15974#Qt4hcgB4][wifi] 点击控制Bot 不加密开&不加密关&加密按压 Bot 0F","status":"todo"}, + {"kind":"ctrl","ones":15974,"step":"7cEkbh4Y","proto":"wifi","name":"点击控制Lock 开锁/解锁","result":"对应Lock固件响应动作开锁/解锁","cat":"lock","device":"Lock 6F","action":"点击控制Lock 开锁/解锁","file":"tests/lock/lock_control.test.ts","testName":"[P0][ONES:15974#7cEkbh4Y][wifi] 点击控制Lock 开锁/解锁 Lock 6F","status":"todo"}, + {"kind":"ctrl","ones":15974,"step":"GPT3wJd9","proto":"wifi","name":"Curtain---快捷弹窗---开/关","result":"对应Curtain固件响应动作开/关","cat":"curtain","device":"Curtain 1A","action":"Curtain---快捷弹窗---开/关","file":"tests/curtain/curtain_control.test.ts","testName":"[P0][ONES:15974#GPT3wJd9][wifi] Curtain---快捷弹窗---开/关 Curtain 1A","status":"todo"}, + {"kind":"ctrl","ones":15974,"step":"63kDVNx1","proto":"wifi","name":"Meter---历史数据---右上角设置---报警条件,开启温度和湿度报警,拉动滑条使当前温湿度在报警范围内","result":"历史数据能够加载,不会有特别异常的数据图表,主页对应Meter温湿度字体变红色","cat":"meter","device":"Meter 3M","action":"Meter---历史数据---右上角设置---报","file":"tests/meter/meter_control.test.ts","testName":"[P0][ONES:15974#63kDVNx1][wifi] Meter---历史数据---右上角设置---报 Meter 3M","status":"todo"}, + {"kind":"ctrl","ones":15974,"step":"8yGTCPwY","proto":"wifi","name":"Meter Plus---历史数据---右上角设置---报警条件,开启温度和湿度报警,拉动滑条使当前温湿度在报警范围内","result":"历史数据能够加载,不会有特别异常的数据图表,主页对应Meter Plus温湿度字体变红色","cat":"meter","device":"Meter 3M","action":"Meter Plus---历史数据---右上角设","file":"tests/meter/meter_control.test.ts","testName":"[P0][ONES:15974#8yGTCPwY][wifi] Meter Plus---历史数据---右上角设 Meter 3M","status":"todo"}, + {"kind":"ctrl","ones":15974,"step":"Ay79Pj23","proto":"wifi","name":"点击控制Plug 开/关","result":"对应Plug固件响应动作开/关","cat":"plug","device":"Plug 4D","action":"点击控制Plug 开/关","file":"tests/plug/plug_control.test.ts","testName":"[P0][ONES:15974#Ay79Pj23][wifi] 点击控制Plug 开/关 Plug 4D","status":"todo"}, + {"kind":"ctrl","ones":15974,"step":"8tx3Rg76","proto":"wifi","name":"Humidifier---快捷弹窗---开启加湿器自动/低/中/高档/关闭","result":"对应Humidifier固件响应动作开启加湿器自动/低/中/高档/关闭","cat":"humidifier","device":"Humidifier 1K","action":"Humidifier---快捷弹窗---开启加湿","file":"tests/humidifier/humidifier_control.test.ts","testName":"[P0][ONES:15974#8tx3Rg76][wifi] Humidifier---快捷弹窗---开启加湿 Humidifier 1K","status":"todo"}, + {"kind":"ctrl","ones":15974,"step":"Kaj2UdKf","proto":"wifi","name":"点击控制Bulb 开/关","result":"对应Bulb固件响应动作开/关","cat":"color_bulb","device":"ColorBulb 8R","action":"点击控制Bulb 开/关","file":"tests/color_bulb/color_bulb_control.test.ts","testName":"[P0][ONES:15974#Kaj2UdKf][wifi] 点击控制Bulb 开/关 ColorBulb 8R","status":"todo"}, + {"kind":"ctrl","ones":15974,"step":"QgX4dX7X","proto":"wifi","name":"点击控制Strip Light开/关","result":"对应Strip Light固件响应动作开/关","cat":"strip_light","device":"StripLight 9S","action":"点击控制Strip Light开/关","file":"tests/strip_light/strip_light_control.test.ts","testName":"[P0][ONES:15974#QgX4dX7X][wifi] 点击控制Strip Light开/关 StripLight 9S","status":"todo"}, + {"kind":"ctrl","ones":15974,"step":"3nXsFW9n","proto":"wifi","name":"点击控制Plug Mini开/关","result":"对应Plug Mini固件响应动作开/关","cat":"plug","device":"Plug 4D","action":"点击控制Plug Mini开/关","file":"tests/plug/plug_control.test.ts","testName":"[P0][ONES:15974#3nXsFW9n][wifi] 点击控制Plug Mini开/关 Plug 4D","status":"todo"}, + {"kind":"ctrl","ones":15974,"step":"N7fSHmH3","proto":"wifi","name":"Motion Sensor---功能页面,在Motion Sensor固件前移动","result":"功能页面正常显示有人移动","cat":"sensor","device":"Contact Sensor 5O","action":"Motion Sensor---功能页面,在Mo","file":"tests/sensor/sensor_control.test.ts","testName":"[P0][ONES:15974#N7fSHmH3][wifi] Motion Sensor---功能页面,在Mo Contact Sensor 5O","status":"todo"}, + {"kind":"ctrl","ones":15974,"step":"JKSgHHbC","proto":"wifi","name":"Contact Sensor---功能页面,开关Contact Sensor固件","result":"功能页面正常显示Contact Sensor的开关状态","cat":"sensor","device":"Contact Sensor 5O","action":"Contact Sensor---功能页面,开关","file":"tests/sensor/sensor_control.test.ts","testName":"[P0][ONES:15974#JKSgHHbC][wifi] Contact Sensor---功能页面,开关 Contact Sensor 5O","status":"todo"}, + {"kind":"ctrl","ones":15974,"step":"4oeeJEV8","proto":"wifi","name":"点击Indoor Cam,出流成功后在页面停留3min","result":"跳转功能页面,能够正常加载视频流","cat":"camera","device":"摄像机Plus 3K","action":"点击Indoor Cam,出流成功后在页面停留3","file":"tests/camera/camera_control.test.ts","testName":"[P0][ONES:15974#4oeeJEV8][wifi] 点击Indoor Cam,出流成功后在页面停留3 摄像机Plus 3K","status":"todo"}, + {"kind":"ctrl","ones":15974,"step":"16szaUdD","proto":"wifi","name":"点击Pan/Tilt Cam,出流成功后在页面停留3min","result":"跳转功能页面,能够正常加载视频流,画面显示正常,时间水印正常跳动","cat":"camera","device":"摄像机Plus 3K","action":"点击Pan/Tilt Cam,出流成功后在页面停","file":"tests/camera/camera_control.test.ts","testName":"[P0][ONES:15974#16szaUdD][wifi] 点击Pan/Tilt Cam,出流成功后在页面停 摄像机Plus 3K","status":"todo"}, + {"kind":"ctrl","ones":15974,"step":"Hj5Z9jSf","proto":"wifi","name":"点击Pan/Tilt Cam 2K,出流成功后在页面停留3min","result":"跳转功能页面,能够正常加载视频流,画面显示正常,时间水印正常跳动","cat":"camera","device":"摄像机Plus 3K","action":"点击Pan/Tilt Cam 2K,出流成功后在","file":"tests/camera/camera_control.test.ts","testName":"[P0][ONES:15974#Hj5Z9jSf][wifi] 点击Pan/Tilt Cam 2K,出流成功后在 摄像机Plus 3K","status":"todo"}, + {"kind":"ctrl","ones":15974,"step":"SaKmFWLw","proto":"wifi","name":"点击Pan/Tilt Cam Plus 3MP,出流成功后在页面停留3min","result":"跳转功能页面,能够正常加载视频流,画面显示正常,时间水印正常跳动","cat":"camera","device":"摄像机Plus 3K","action":"点击Pan/Tilt Cam Plus 3MP,","file":"tests/camera/camera_control.test.ts","testName":"[P0][ONES:15974#SaKmFWLw][wifi] 点击Pan/Tilt Cam Plus 3MP, 摄像机Plus 3K","status":"todo"}, + {"kind":"ctrl","ones":15974,"step":"LDqSDPPT","proto":"wifi","name":"点击Pan/Tilt Cam Plus 5MP,出流成功后在页面停留3min","result":"跳转功能页面,能够正常加载视频流,画面显示正常,时间水印正常跳动","cat":"camera","device":"摄像机Plus 3K","action":"点击Pan/Tilt Cam Plus 5MP,","file":"tests/camera/camera_control.test.ts","testName":"[P0][ONES:15974#LDqSDPPT][wifi] 点击Pan/Tilt Cam Plus 5MP, 摄像机Plus 3K","status":"todo"}, + {"kind":"ctrl","ones":15974,"step":"HoDdVUm1","proto":"wifi","name":"点击OSC,出流成功后在页面停留3min","result":"跳转功能页面,能够正常加载视频流,画面显示正常,时间水印正常跳动","cat":"osc","device":"OSC 2K","action":"点击OSC,出流成功后在页面停留3min","file":"tests/osc/osc_control.test.ts","testName":"[P0][ONES:15974#HoDdVUm1][wifi] 点击OSC,出流成功后在页面停留3min OSC 2K","status":"todo"}, + {"kind":"ctrl","ones":15974,"step":"WH7kyypF","proto":"wifi","name":"点击OSC 2K,出流成功后在页面停留3min","result":"跳转功能页面,能够正常加载视频流,画面显示正常,时间水印正常跳动","cat":"osc","device":"OSC 2K","action":"点击OSC 2K,出流成功后在页面停留3min","file":"tests/osc/osc_control.test.ts","testName":"[P0][ONES:15974#WH7kyypF][wifi] 点击OSC 2K,出流成功后在页面停留3min OSC 2K","status":"todo"}, + {"kind":"ctrl","ones":15974,"step":"J8BQ1p9G","proto":"wifi","name":"点击Doorbell,出流成功后在页面停留3min","result":"跳转功能页面,能够正常加载视频流,画面显示正常,时间水印正常跳动","cat":"camera","device":"摄像机Plus 3K","action":"点击Doorbell,出流成功后在页面停留3mi","file":"tests/camera/camera_control.test.ts","testName":"[P0][ONES:15974#J8BQ1p9G][wifi] 点击Doorbell,出流成功后在页面停留3mi 摄像机Plus 3K","status":"todo"}, + {"kind":"ctrl","ones":15974,"step":"KNk1HaB2","proto":"wifi","name":"点击Outdoor PTC,出流成功后在页面停留3min","result":"跳转功能页面,能够正常加载视频流,画面显示正常,时间水印正常跳动","cat":"camera","device":"摄像机Plus 3K","action":"点击Outdoor PTC,出流成功后在页面停留","file":"tests/camera/camera_control.test.ts","testName":"[P0][ONES:15974#KNk1HaB2][wifi] 点击Outdoor PTC,出流成功后在页面停留 摄像机Plus 3K","status":"todo"}, + {"kind":"ctrl","ones":15974,"step":"67oRHoYJ","proto":"wifi","name":"点击Robot Vacuum S1控制清扫、暂停、回充","result":"对应Robot Vacuum S1固件执行清扫、暂停、回充","cat":"robot","device":"Robot S1","action":"点击Robot Vacuum S1控制清扫、暂停","file":"tests/robot/robot_control.test.ts","testName":"[P0][ONES:15974#67oRHoYJ][wifi] 点击Robot Vacuum S1控制清扫、暂停 Robot S1","status":"todo"}, + {"kind":"ctrl","ones":15974,"step":"YAeiQE6n","proto":"wifi","name":"点击Robot Vacuum S1 Plus控制清扫、暂停、回充","result":"对应Robot Vacuum S1 Plus固件执行清扫、暂停、回充","cat":"robot","device":"Robot S1","action":"点击Robot Vacuum S1 Plus控制","file":"tests/robot/robot_control.test.ts","testName":"[P0][ONES:15974#YAeiQE6n][wifi] 点击Robot Vacuum S1 Plus控制 Robot S1","status":"todo"}, + {"kind":"ctrl","ones":15974,"step":"TcnL3gFM","proto":"wifi","name":"点击控制吸顶灯pro开/关灯","result":"对应吸顶灯pro响应动作开/关灯","cat":"ceiling_light","device":"CeilingLight 7Q","action":"点击控制吸顶灯pro开/关灯","file":"tests/ceiling_light/ceiling_light_control.test.ts","testName":"[P0][ONES:15974#TcnL3gFM][wifi] 点击控制吸顶灯pro开/关灯 CeilingLight 7Q","status":"todo"}, + {"kind":"ctrl","ones":15974,"step":"WL8KSQLb","proto":"wifi","name":"点击控制吸顶灯lte开/关灯","result":"对应吸顶灯lte响应动作开/关灯","cat":"ceiling_light","device":"CeilingLight 7Q","action":"点击控制吸顶灯lte开/关灯","file":"tests/ceiling_light/ceiling_light_control.test.ts","testName":"[P0][ONES:15974#WL8KSQLb][wifi] 点击控制吸顶灯lte开/关灯 CeilingLight 7Q","status":"todo"}, + {"kind":"ctrl","ones":15974,"step":"6gv1WLKE","proto":"wifi","name":"首页点击控制固件V20版本BlindTilt","result":"对应BlindTilt固件响应","cat":"curtain","device":"Curtain 1A","action":"首页点击控制固件V20版本BlindTilt","file":"tests/curtain/curtain_control.test.ts","testName":"[P0][ONES:15974#6gv1WLKE][wifi] 首页点击控制固件V20版本BlindTilt Curtain 1A","status":"todo"}, + {"kind":"ctrl","ones":15974,"step":"B5N4u7Fj","proto":"wifi","name":"首页点击控制固件V12版本BlindTil功能页按钮(验证兼容旧版本)","result":"对应BlindTilt固件响应","cat":"curtain","device":"Curtain 1A","action":"首页点击控制固件V12版本BlindTil功能页","file":"tests/curtain/curtain_control.test.ts","testName":"[P0][ONES:15974#B5N4u7Fj][wifi] 首页点击控制固件V12版本BlindTil功能页 Curtain 1A","status":"todo"}, + {"kind":"ctrl","ones":15974,"step":"5yYJmwLL","proto":"wifi","name":"IOSensor---历史数据---右上角设置---报警条件,开启温度和湿度报警,拉动滑条使当前温湿度在报警范围内","result":"历史数据能够加载,不会有特别异常的数据图表,主页对应IOSensor温湿度字体变红色","cat":"sensor","device":"Contact Sensor 5O","action":"IOSensor---历史数据---右上角设置-","file":"tests/sensor/sensor_control.test.ts","testName":"[P0][ONES:15974#5yYJmwLL][wifi] IOSensor---历史数据---右上角设置- Contact Sensor 5O","status":"todo"}, + {"kind":"ctrl","ones":15974,"step":"GYtvdMTW","proto":"wifi","name":"Curtain 3---快捷弹窗---开/关","result":"对应Curtain 3固件响应动作开/关","cat":"curtain","device":"Curtain 1A","action":"Curtain 3---快捷弹窗---开/关","file":"tests/curtain/curtain_control.test.ts","testName":"[P0][ONES:15974#GYtvdMTW][wifi] Curtain 3---快捷弹窗---开/关 Curtain 1A","status":"todo"}, + {"kind":"ctrl","ones":15974,"step":"44FEY1z2","proto":"wifi","name":"点击K10+ 扫地机控制清扫、暂停、回充","result":"对应扫地机执行清扫、暂停、回充","cat":"robot","device":"Robot S1","action":"点击K10+ 扫地机控制清扫、暂停、回充","file":"tests/robot/robot_control.test.ts","testName":"[P0][ONES:15974#44FEY1z2][wifi] 点击K10+ 扫地机控制清扫、暂停、回充 Robot S1","status":"todo"}, + {"kind":"ctrl","ones":15974,"step":"6RC22BGo","proto":"wifi","name":"带电池款Battery Circulator Fan---首页控制开关","result":"对应循环扇开关","cat":"fan","device":"Fan 0T","action":"带电池款Battery Circulator F","file":"tests/fan/fan_control.test.ts","testName":"[P0][ONES:15974#6RC22BGo][wifi] 带电池款Battery Circulator F Fan 0T","status":"todo"}, + {"kind":"ctrl","ones":15974,"step":"Virku9zd","proto":"wifi","name":"点击控制Lock Pro开锁/解锁","result":"对应Lock Pro固件响应动作开锁/解锁","cat":"lock","device":"Lock 6F","action":"点击控制Lock Pro开锁/解锁","file":"tests/lock/lock_control.test.ts","testName":"[P0][ONES:15974#Virku9zd][wifi] 点击控制Lock Pro开锁/解锁 Lock 6F","status":"todo"}, + {"kind":"ctrl","ones":15974,"step":"BhNuXgg7","proto":"wifi","name":"进入Humidifier2设置页,远程绑定温湿度计,点击切换档位、模式","result":"绑定成功,功能页显示对应湿度值;切换档位、模式、目标湿度正常。","cat":"humidifier","device":"Humidifier 1K","action":"进入Humidifier2设置页,远程绑定温湿度","file":"tests/humidifier/humidifier_control.test.ts","testName":"[P0][ONES:15974#BhNuXgg7][wifi] 进入Humidifier2设置页,远程绑定温湿度 Humidifier 1K","status":"todo"}, + {"kind":"ctrl","ones":15974,"step":"9bcyjgJD","proto":"wifi","name":"点击S10控制清扫、暂停、回充","result":"对应S10固件执行清扫、暂停、回充","cat":"robot","device":"Robot S1","action":"点击S10控制清扫、暂停、回充","file":"tests/robot/robot_control.test.ts","testName":"[P0][ONES:15974#9bcyjgJD][wifi] 点击S10控制清扫、暂停、回充 Robot S1","status":"todo"}, + {"kind":"ctrl","ones":15974,"step":"KNyzKhn6","proto":"wifi","name":"无电池款 Circulator Fan---首页控制开关","result":"对应循环扇开关","cat":"fan","device":"Fan 0T","action":"无电池款 Circulator Fan---首页","file":"tests/fan/fan_control.test.ts","testName":"[P0][ONES:15974#KNyzKhn6][wifi] 无电池款 Circulator Fan---首页 Fan 0T","status":"todo"}, + {"kind":"ctrl","ones":15974,"step":"W7nK4VEB","proto":"wifi","name":"点击K10+Pro控制清扫、暂停、回充","result":"K10+ Pro正常响应清扫、暂停、回充","cat":"robot","device":"Robot S1","action":"点击K10+Pro控制清扫、暂停、回充","file":"tests/robot/robot_control.test.ts","testName":"[P0][ONES:15974#W7nK4VEB][wifi] 点击K10+Pro控制清扫、暂停、回充 Robot S1","status":"todo"}, + {"kind":"ctrl","ones":15974,"step":"GWAbic5S","proto":"wifi","name":"点击K10+ProCombo控制清扫、暂停、回充","result":"K10+ ProCombo正常响应清扫、暂停、回充","cat":"robot","device":"Robot S1","action":"点击K10+ProCombo控制清扫、暂停、回充","file":"tests/robot/robot_control.test.ts","testName":"[P0][ONES:15974#GWAbic5S][wifi] 点击K10+ProCombo控制清扫、暂停、回充 Robot S1","status":"todo"}, + {"kind":"ctrl","ones":15974,"step":"ScBpcSfJ","proto":"wifi","name":"Roller Shade功能页控制设备全开、暂停、全关、任意百分比控制","result":"Roller Shade正常响应所有控制指令","cat":"curtain","device":"Curtain 1A","action":"Roller Shade功能页控制设备全开、暂停","file":"tests/curtain/curtain_control.test.ts","testName":"[P0][ONES:15974#ScBpcSfJ][wifi] Roller Shade功能页控制设备全开、暂停 Curtain 1A","status":"todo"}, + {"kind":"ctrl","ones":15974,"step":"AWVhA6za","proto":"wifi","name":"点击控制美规基础款空气净化器--开/关","result":"对应美规基础款空气净化器--开关","cat":"air_condition","device":"AirCondition IR","action":"点击控制美规基础款空气净化器--开/关","file":"tests/air_condition/air_condition_control.test.ts","testName":"[P0][ONES:15974#AWVhA6za][wifi] 点击控制美规基础款空气净化器--开/关 AirCondition IR","status":"todo"}, + {"kind":"ctrl","ones":15974,"step":"MmodMTvh","proto":"wifi","name":"点击控制日规Table空气净化器--开/关","result":"对应日规Table空气净化器--开/关","cat":"air_condition","device":"AirCondition IR","action":"点击控制日规Table空气净化器--开/关","file":"tests/air_condition/air_condition_control.test.ts","testName":"[P0][ONES:15974#MmodMTvh][wifi] 点击控制日规Table空气净化器--开/关 AirCondition IR","status":"todo"}, + {"kind":"ctrl","ones":15974,"step":"VbqWg59G","proto":"wifi","name":"Curtain 3 2025---快捷弹窗---开/关","result":"对应Curtain 3 2025固件响应动作开/关","cat":"curtain","device":"Curtain 1A","action":"Curtain 3 2025---快捷弹窗---","file":"tests/curtain/curtain_control.test.ts","testName":"[P0][ONES:15974#VbqWg59G][wifi] Curtain 3 2025---快捷弹窗--- Curtain 1A","status":"todo"}, + {"kind":"ctrl","ones":15974,"step":"N5i3oQP2","proto":"wifi","name":"Meter Pro---图表数据---右上角设置---报警条件,开启温度和湿度报警,拉动滑条使当前温湿度在报警范围内","result":"图表数据能够加载,不会有特别异常的数据图表,主页对应Meter Pro温湿度字体变红色","cat":"meter","device":"Meter 3M","action":"Meter Pro---图表数据---右上角设置","file":"tests/meter/meter_control.test.ts","testName":"[P0][ONES:15974#N5i3oQP2][wifi] Meter Pro---图表数据---右上角设置 Meter 3M","status":"todo"}, + {"kind":"ctrl","ones":15974,"step":"LAtdvNBV","proto":"wifi","name":"Meter Pro co2\n---图表数据---右上角设置---报警条件,开启温度和湿度报警,拉动滑条使当前温湿度在报警范围内","result":"图表数据能够加载,不会有特别异常的数据图表,主页对应Meter Pro co2温湿度字体变红色","cat":"meter","device":"Meter 3M","action":"Meter Pro co2 ---图表数据---","file":"tests/meter/meter_control.test.ts","testName":"[P0][ONES:15974#LAtdvNBV][wifi] Meter Pro co2 ---图表数据--- Meter 3M","status":"todo"}, + {"kind":"ctrl","ones":15974,"step":"N1kzcb7S","proto":"wifi","name":"点击控制RGBWW 彩色灯带3 --开/关","result":"对应RGBWW 彩色灯带3 --固件响应动作开/关","cat":"strip_light","device":"StripLight 9S","action":"点击控制RGBWW 彩色灯带3 --开/关","file":"tests/strip_light/strip_light_control.test.ts","testName":"[P0][ONES:15974#N1kzcb7S][wifi] 点击控制RGBWW 彩色灯带3 --开/关 StripLight 9S","status":"todo"}, + {"kind":"ctrl","ones":15974,"step":"2hm6sXrk","proto":"wifi","name":"点击控制RGBWW 落地灯 --开/关","result":"对应RGBWW 落地灯 --固件响应动作开/关","cat":"ceiling_light","device":"CeilingLight 7Q","action":"点击控制RGBWW 落地灯 --开/关","file":"tests/ceiling_light/ceiling_light_control.test.ts","testName":"[P0][ONES:15974#2hm6sXrk][wifi] 点击控制RGBWW 落地灯 --开/关 CeilingLight 7Q","status":"todo"}, + {"kind":"ctrl","ones":15974,"step":"XvFF8AK7","proto":"wifi","name":"点击控制Relay Switch 1pm--开/关","result":"对应Relay Switch 1pm --固件响应动作开/关","cat":"plug","device":"Plug 4D","action":"点击控制Relay Switch 1pm--开/","file":"tests/plug/plug_control.test.ts","testName":"[P0][ONES:15974#XvFF8AK7][wifi] 点击控制Relay Switch 1pm--开/ Plug 4D","status":"todo"}, + {"kind":"ctrl","ones":15974,"step":"Y9gosqbQ","proto":"wifi","name":"点击控制Relay Switch 1--开/关","result":"对应Relay Switch 1 --固件响应动作开/关","cat":"plug","device":"Plug 4D","action":"点击控制Relay Switch 1--开/关","file":"tests/plug/plug_control.test.ts","testName":"[P0][ONES:15974#Y9gosqbQ][wifi] 点击控制Relay Switch 1--开/关 Plug 4D","status":"todo"}, + {"kind":"ctrl","ones":15974,"step":"Vro1QBrg","proto":"wifi","name":"点击控制Relay Switch 2pm开关控制器--开/关","result":"对应 --固件响应Relay Switch 2pm开关控制器响作开/关","cat":"plug","device":"Plug 4D","action":"点击控制Relay Switch 2pm开关控制","file":"tests/plug/plug_control.test.ts","testName":"[P0][ONES:15974#Vro1QBrg][wifi] 点击控制Relay Switch 2pm开关控制 Plug 4D","status":"todo"}, + {"kind":"ctrl","ones":15974,"step":"c34Tk92u","proto":"wifi","name":"点击控制Relay Switch 2pm覆盖控制器--开/关","result":"对应 --固件响应动Relay Switch 2pm覆盖控制器响作开/关","cat":"plug","device":"Plug 4D","action":"点击控制Relay Switch 2pm覆盖控制","file":"tests/plug/plug_control.test.ts","testName":"[P0][ONES:15974#c34Tk92u][wifi] 点击控制Relay Switch 2pm覆盖控制 Plug 4D","status":"todo"}, + {"kind":"ctrl","ones":15974,"step":"2nRaC87F","proto":"wifi","name":"点击控制Garage Door Opener--开/关","result":"对应 --固件响应Garage Door Opener动响作开/关","cat":"plug","device":"Plug 4D","action":"点击控制Garage Door Opener--","file":"tests/plug/plug_control.test.ts","testName":"[P0][ONES:15974#2nRaC87F][wifi] 点击控制Garage Door Opener-- Plug 4D","status":"todo"}, + {"kind":"ctrl","ones":15974,"step":"MAwYyCaC","proto":"wifi","name":"点击控制RGBICWW Strip Light (炫彩灯带)--开/关","result":"对应RGBICWW Strip Light (炫彩灯带)--固件响应动作开/关","cat":"strip_light","device":"StripLight 9S","action":"点击控制RGBICWW Strip Light ","file":"tests/strip_light/strip_light_control.test.ts","testName":"[P0][ONES:15974#MAwYyCaC][wifi] 点击控制RGBICWW Strip Light StripLight 9S","status":"todo"}, + {"kind":"ctrl","ones":15974,"step":"ML8CSkWX","proto":"wifi","name":"点击控制RGBICWW Floor Lamp(炫彩落地灯)--开/关","result":"对应RGBICWW Floor Lamp(炫彩落地灯)--固件响应动作开/关","cat":"ceiling_light","device":"CeilingLight 7Q","action":"点击控制RGBICWW Floor Lamp(炫","file":"tests/ceiling_light/ceiling_light_control.test.ts","testName":"[P0][ONES:15974#ML8CSkWX][wifi] 点击控制RGBICWW Floor Lamp(炫 CeilingLight 7Q","status":"todo"}, + {"kind":"ctrl","ones":15974,"step":"5sJcsTgi","proto":"wifi","name":"点击控制RGBIC Neon Wire Rope Light(炫彩钢丝霓虹灯)--开/关","result":"对应RGBIC Neon Wire Rope Light(炫彩钢丝霓虹灯)--固件响应动作开/关","cat":"strip_light","device":"StripLight 9S","action":"点击控制RGBIC Neon Wire Rope","file":"tests/strip_light/strip_light_control.test.ts","testName":"[P0][ONES:15974#5sJcsTgi][wifi] 点击控制RGBIC Neon Wire Rope StripLight 9S","status":"todo"}, + {"kind":"ctrl","ones":15974,"step":"U5z9wocr","proto":"wifi","name":"点击控制eu plug--开/关","result":"对应设备响应开/关","cat":"plug","device":"Plug 4D","action":"点击控制eu plug--开/关","file":"tests/plug/plug_control.test.ts","testName":"[P0][ONES:15974#U5z9wocr][wifi] 点击控制eu plug--开/关 Plug 4D","status":"todo"}, + {"kind":"ctrl","ones":15974,"step":"BiEXxZDr","proto":"wifi","name":"点击控制RGBIC Neon Rope Light(炫彩霓虹灯)--开/关","result":"对应RGBIC Neon Rope Light(炫彩霓虹灯)--固件响应动作开/关","cat":"strip_light","device":"StripLight 9S","action":"点击控制RGBIC Neon Rope Ligh","file":"tests/strip_light/strip_light_control.test.ts","testName":"[P0][ONES:15974#BiEXxZDr][wifi] 点击控制RGBIC Neon Rope Ligh StripLight 9S","status":"todo"}, + {"kind":"ctrl","ones":15974,"step":"RXm3iNLR","proto":"wifi","name":"点击控制Candle lamp(融蜡灯)--开/关(融蜡灯需要插110V电压)","result":"对应Candle lamp(融蜡灯)--固件响应动作开/关","cat":"ceiling_light","device":"CeilingLight 7Q","action":"点击控制Candle lamp(融蜡灯)--开/","file":"tests/ceiling_light/ceiling_light_control.test.ts","testName":"[P0][ONES:15974#RXm3iNLR][wifi] 点击控制Candle lamp(融蜡灯)--开/ CeilingLight 7Q","status":"todo"}, +];