568 lines
26 KiB
Python
568 lines
26 KiB
Python
#!/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}')
|