#!/usr/bin/env python3 """生成 UI自动化测试计划.docx""" from docx import Document from docx.shared import Inches, Pt, Cm, RGBColor from docx.enum.table import WD_TABLE_ALIGNMENT from docx.enum.text import WD_ALIGN_PARAGRAPH from docx.enum.section import WD_ORIENT from docx.oxml.ns import qn from docx.oxml import OxmlElement import datetime doc = Document() # ======================== 样式设置 ======================== style = doc.styles['Normal'] style.font.name = '微软雅黑' style.font.size = Pt(10.5) style.element.rPr.rFonts.set(qn('w:eastAsia'), '微软雅黑') def set_cell_shading(cell, color): shading_elm = OxmlElement('w:shd') shading_elm.set(qn('w:fill'), color) shading_elm.set(qn('w:val'), 'clear') cell._tc.get_or_add_tcPr().append(shading_elm) def add_table_with_header(doc, headers, rows, col_widths=None): table = doc.add_table(rows=1 + len(rows), cols=len(headers)) table.style = 'Table Grid' # Header for i, h in enumerate(headers): cell = table.rows[0].cells[i] cell.text = h cell.paragraphs[0].runs[0].bold = True set_cell_shading(cell, '4472C4') cell.paragraphs[0].runs[0].font.color.rgb = RGBColor(255, 255, 255) # Data for r_idx, row_data in enumerate(rows): for c_idx, val in enumerate(row_data): table.rows[r_idx + 1].cells[c_idx].text = str(val) if col_widths: for i, w in enumerate(col_widths): for row in table.rows: row.cells[i].width = Cm(w) return table # ======================== 封面 ======================== doc.add_paragraph() doc.add_paragraph() title = doc.add_paragraph() title.alignment = WD_ALIGN_PARAGRAPH.CENTER run = title.add_run('SwitchBot App UI自动化测试计划') run.font.size = Pt(26) run.bold = True doc.add_paragraph() subtitle = doc.add_paragraph() subtitle.alignment = WD_ALIGN_PARAGRAPH.CENTER run = subtitle.add_run('单品设备功能测试 + 设备添加 + 自动化场景') run.font.size = Pt(14) run.font.color.rgb = RGBColor(68, 114, 196) doc.add_paragraph() doc.add_paragraph() info = doc.add_paragraph() info.alignment = WD_ALIGN_PARAGRAPH.CENTER info.add_run(f'版本: v1.0\n').font.size = Pt(11) info.add_run(f'日期: {datetime.date.today().strftime("%Y-%m-%d")}\n').font.size = Pt(11) info.add_run('部门: 测试部\n').font.size = Pt(11) doc.add_page_break() # ======================== 1. 项目概述 ======================== doc.add_heading('1. 项目概述', level=1) doc.add_heading('1.1 背景', level=2) doc.add_paragraph( 'SwitchBot App 涵盖 100+ 款 IoT 设备,需要对每款设备的 App 功能进行自动化回归测试。' '本计划基于已验证的 Vitest + Appium 技术框架,按品类批量推进覆盖所有设备。' ) doc.add_heading('1.2 技术栈', level=2) rows = [ ('框架', 'Vitest (TypeScript) + Appium'), ('驱动', 'UIAutomator2 (Android) / WebDriverAgent (iOS)'), ('AI辅助', 'Claude Code 边跑边写生成 & 调试脚本'), ('测试设备', 'Samsung 1080x2280 (Android) / iPhone 390x844pt (iOS)'), ('App', 'SwitchBot (com.theswitchbot.switchbot)'), ('报告', '自定义 HTML 报告 + JSON 结果'), ('用例管理', 'ONES 平台同步'), ] add_table_with_header(doc, ['项目', '说明'], rows) doc.add_heading('1.3 当前进度', level=2) doc.add_paragraph('已调试完成的设备(不在本计划范围内):') rows = [ ('Bot', '5', '卡片/控制/设置/场景/日志', '100%'), ('Camera (Pan/Tilt Plus 3K)', '6', '卡片/控制/全屏/事件/录像/设置', '100%'), ('AI Hub', '11', '设置/投屏/侦测/勿扰/存储/回放/AI事件/日报/功能页/连接/绑定', '86%'), ] 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_page_break() # ======================== 2. 设备清单 ======================== doc.add_heading('2. 待覆盖设备清单(82款)', level=1) device_categories = { '窗帘 (9款)': [ ('Curtain Rod', '已有脚本', '调试适配'), ('Curtain Rod 2', '已有脚本', '调试适配'), ('Curtain U Rail', '已有脚本', '调试适配'), ('Curtain U Rail 2', '已有脚本', '调试适配'), ('Curtain U Rail 2.3', '复用模板', '新增配置'), ('Curtain 3 U Rail', '复用模板', '新增配置'), ('Curtain 3 Rod 2025', '复用模板', '新增配置'), ('Curtain 4 Urail', '复用模板', '新增配置'), ('Roller Shade', '复用模板', '新增配置'), ], '锁 (12款)': [ ('Lock (JP)', '已有脚本', '调试适配'), ('Lock (US)', '已有脚本', '调试适配'), ('Lock (EU)', '复用模板', '新增配置'), ('Lock Pro (EU)', '复用模板', '新增配置'), ('Lock Pro (US)', '复用模板', '新增配置'), ('Lock Lite', '复用模板', '新增配置'), ('Lock Ultra (JP)', '需新写', 'UI差异大'), ('Lock Ultra (US)', '需新写', 'UI差异大'), ('Lock Ultra (EU)', '需新写', 'UI差异大'), ('Lock Pro Matter Enabled', '复用模板', '新增配置'), ('US Vision Deadbolt Pro', '需新写', '全新UI'), ('US Vision Deadbolt', '需新写', '全新UI'), ], '灯光 (10款)': [ ('LED Strip Light 2', '已有脚本', '调试适配'), ('Strip Light 3', '已有脚本', '调试适配'), ('RGBICWW Strip Light', '复用模板', '新增配置'), ('RGBICWW Floor Lamp', '复用模板', '新增配置'), ('RGBIC Neon Rope Light', '复用模板', '新增配置'), ('RGBIC Wire Neon Rope Light', '复用模板', '新增配置'), ('RGBICWW Ceiling Light', '已有脚本', '调试适配'), ('Floor Lamp', '复用模板', '新增配置'), ('Candle Lamp', '复用模板', '新增配置'), ('Permanent Outdoor Lights', '需新写', '户外新品'), ], '插座+开关 (6款)': [ ('Plug Mini (JP) HomeKit Enabled', '已有脚本', '调试适配'), ('Plug Mini (US) HomeKit Enabled', '已有脚本', '调试适配'), ('Plug Mini (EU)', '复用模板', '新增配置'), ('Relay Switch 1', '已有脚本', '调试适配'), ('Relay Switch 1PM', '复用模板', '新增配置'), ('Relay Switch 2PM', '复用模板', '新增配置'), ], '扫地机 (9款)': [ ('Robot Vacuum Cleaner S1', '已有脚本', '调试适配'), ('Robot Vacuum Cleaner S1 Plus (W)', '已有脚本', '调试适配'), ('Mini Robot Vacuum K10+Pro', '复用模板', '新增配置'), ('Robot Vacuum K20+ Pro', '需新写', '新一代UI'), ('Robot Vacuum K10+ Pro Combo', '复用模板', '新增配置'), ('Robot Vacuum K11+', '需新写', '新一代UI'), ('Robot Vacuum K11+ Pro', '需新写', '新一代UI'), ('Floor Cleaning Robot S20', '需新写', '全新UI'), ('Floor Cleaning Robot S20 Mini', '需新写', '全新UI'), ], '传感器+温控 (7款)': [ ('Indoor/Outdoor Thermo-Hygrometer', '已有脚本', '调试适配'), ('Meter Pro', '已有脚本', '调试适配'), ('Meter Pro (CO2 Monitor)', '复用模板', '新增CO2功能'), ('Water Leak Detector with Sensor Cable', '已有脚本', '调试适配'), ('Presence Sensor', '需新写', '全新UI'), ('Home Climate Panel', '需新写', '全新UI'), ('Weather Station', '需新写', '全新UI'), ], '风扇+空净+加湿器 (6款)': [ ('Circulator Fan', '已有脚本', '调试适配'), ('Standing Circulator Fan', '复用模板', '新增配置'), ('Circulator Fan Pro', '复用模板', '新增配置'), ('Air Purifier', '需新写', '全新品类'), ('Air Purifier Table', '需新写', '全新品类'), ('Evaporative Humidifier (Auto-refill)', '已有脚本', '调试适配'), ], '摄像头+门铃 (3款)': [ ('Pan/Tilt Cam 3MP猫狗定制款', '复用camera', '调试适配'), ('Video Doorbell', '需新写', '门铃UI差异'), ('OSC KVS', '已有脚本', '调试适配'), ], '网关Hub (3款)': [ ('Hub 3', '已有脚本', '调试适配'), ('AI Hub', '已完成', '—'), ('AI Hub Show', '需新写', '带屏新品'), ], '门控+安防+配件 (5款)': [ ('Keypad Vision', '已有脚本', '调试适配'), ('Keypad Vision Pro', '复用模板', '新增配置'), ('Garage Door Opener', '需新写', '全新品类'), ('Safety Alarm', '需新写', '全新品类'), ('Smart Radiator Thermostat', '需新写', '全新品类'), ], 'AI产品 (5款)': [ ('Art Frame', '需新写', '全新UI框架'), ('Art Frame luma', '需新写', '全新UI框架'), ('AI Pet', '需新写', '全新品类'), ('AI PinNote', '需新写', '全新品类'), ('Bot Rechargeable', '复用bot', '调试适配'), ], '机器人+联名+其他 (8款)': [ ('OBBOTO 1.0', '需新写', '全新品类'), ('Robotic Actuator', '需新写', '全新品类'), ('Robotic Arm', '需新写', '全新品类'), ('Robotic Picker', '需新写', '全新品类'), ('SwitchBot KATAフレンズ KUMAMON ver.', '复用bot', '特殊UI定制'), ('KATA Friends 国行版', '复用bot', '特殊UI定制'), ('Outdoor PTC', '需新写', '全新品类'), ('FindCard', '已有脚本', '调试适配'), ], } for cat_name, devices in device_categories.items(): doc.add_heading(cat_name, level=2) add_table_with_header(doc, ['设备名称', '脚本状态', '备注'], devices, col_widths=[6, 3, 4] ) doc.add_paragraph() doc.add_page_break() # ======================== 3. 测试维度说明 ======================== doc.add_heading('3. 测试维度说明', level=1) doc.add_paragraph('每款设备根据功能复杂度,覆盖以下测试维度:') 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', '可选'), ] add_table_with_header(doc, ['维度', '文件命名', '内容', '用例数', '适用阶段'], rows ) doc.add_paragraph() doc.add_paragraph('用例数量估算:每设备平均 25-40 条,82款设备总计约 2000-3000 条自动化用例。') doc.add_page_break() # ======================== 4. Phase 1 ======================== doc.add_heading('4. Phase 1: 高复用品类调试(W1-W4)', level=1) doc.add_paragraph( '策略:同品类 UI 高度相似,已有脚本模板。每周选定一个品类,' '调通首台设备后,通过修改设备名称配置快速扩展到同品类其他型号。' ) 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人'), ] add_table_with_header(doc, ['周次', '品类', '设备数', '输出内容', '用例数', '人力'], rows ) 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) doc.add_paragraph( '策略:这些品类功能较复杂或有较大UI差异,每周处理一个品类。' '扫地机需要处理地图和清扫模式,传感器需要读取数据图表。' ) 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人'), ] add_table_with_header(doc, ['周次', '品类', '设备数', '输出内容', '用例数', '人力'], rows ) doc.add_paragraph() p = doc.add_paragraph() p.add_run('里程碑:').bold = True p.add_run(' 第8周末交付 25 款设备,累计覆盖率提升至 76%') 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_paragraph( '策略:这些设备UI独特或为全新品类,需要从头编写测试脚本。' '依赖设备到位和UI稳定。' ) 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', '测试'), ] add_table_with_header(doc, ['任务', '输出', '负责'], rows) doc.add_paragraph() doc.add_heading('添加设备排期', level=3) rows = [ ('W13', 'BLE直连类(Bot/Meter/Sensor)验证\n+ Wi-Fi配网框架', '3', '端到端demo验证'), ('W14', '窗帘/锁/灯光批量铺开', '31', 'connect脚本×31'), ('W15', '扫地机/传感器/风扇等', '22', 'connect脚本×22'), ('W16', 'AI产品/新品收尾 + 全量回归', '29', 'connect脚本×29 + 回归报告'), ] add_table_with_header(doc, ['周次', '任务', '设备数', '输出'], rows) doc.add_heading('7.2 自动化/场景联动测试', level=2) doc.add_paragraph('自动化场景测试验证设备间联动的可靠性,覆盖以下维度:') 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('8.1 人力', level=2) rows = [ ('自动化测试工程师', '1-2人', '全职,全程'), ('嵌入式工程师(配合)', '0.5人', '前2周提供串口协议,后续按需'), ('AI辅助 (Claude Code)', '—', '脚本生成+调试,贯穿全程'), ] add_table_with_header(doc, ['角色', '人数', '说明'], rows) doc.add_heading('8.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前到位'), ] add_table_with_header(doc, ['阶段', '设备需求', '到位时间'], rows) doc.add_heading('8.3 环境', level=2) rows = [ ('测试手机', 'Samsung (Android) + iPhone (iOS)', '已有'), ('Appium Server', 'v2.x + UIAutomator2', '已有'), ('网络环境', '稳定Wi-Fi (Deco)', '已有'), ('CI/CD', 'Jenkins/GitHub Actions (可选)', '待搭建'), ] add_table_with_header(doc, ['项目', '说明', '状态'], rows) doc.add_page_break() # ======================== 9. 总体排期表 ======================== doc.add_heading('9. 总体排期一览', 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 + 最终报告'), ] add_table_with_header(doc, ['周次', '阶段', '品类/任务', '设备数', '用例数', '交付物'], rows, col_widths=[1.5, 2, 4, 1.5, 1.5, 5] ) doc.add_paragraph() p = doc.add_paragraph() p.add_run('总计:').bold = True p.add_run('16周 | 82款设备 | ~2366条用例 | 85+脚本文件 + 8个通用helper') doc.add_page_break() # ======================== 10. 质量标准 ======================== doc.add_heading('10. 质量标准与验收', level=1) doc.add_heading('10.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) rows = [ ('Phase 1 (W4末)', '37款设备调通,通过率≥85%', '覆盖率45%'), ('Phase 2 (W8末)', '累计62款设备,通过率≥80%', '覆盖率76%'), ('Phase 3 (W12末)', '全部82款单品覆盖', '覆盖率100%'), ('Phase 4 (W16末)', '添加流程+自动化场景', '全流程覆盖'), ] 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_page_break() # ======================== 11. 风险与依赖 ======================== doc.add_heading('11. 风险与依赖', level=1) doc.add_heading('11.1 关键依赖', level=2) rows = [ ('实体设备到位', '高', '无设备无法调试', '提前一个Phase准备'), ('同品类UI一致性', '中', 'UI差异大则无法复用', '差异设备单独排期'), ('新品UI稳定', '高', 'UI仍在迭代会导致返工', '等UI冻结后再开始'), ('嵌入式串口协议', '高', '影响添加设备Phase', '提前2周启动协议定义'), ('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之前搭建?') # ======================== 保存 ======================== output_path = '/Users/woan/Desktop/AI_UIAutomation/docs/UI自动化测试计划.docx' doc.save(output_path) print(f'✓ 文档已生成: {output_path}')