鸿蒙 PC Markdown 编辑器模拟器验证:鸿蒙 2in1 上的桌面工作流
鸿蒙 PC Markdown 编辑器模拟器验证:鸿蒙 2in1 上的桌面工作流
浏览器测试和 ArkTS编译都通过后,应用仍可能在系统选择器、窗口生命周期、输入法、ArkWeb主题或 HDC安装上失败。鸿蒙 PC优先产品需要一套可重复的模拟器工作流,把构建、启动、强杀、文件操作、主题和证据留存串起来,而不是依赖 DevEco里偶然点通一次。
本文基于 OhMarkdown在 MateBook Pro 2in1模拟器上的实际验证,说明启动脚本、HDC连接、HAP安装、系统交互和截图规则。代码位于 https://gitcode.com/VON-/codex_md_oh,对应提交3a9146e。
模拟器目标与环境
当前环境:HarmonyOS 6.1.1、API 24、MateBook Pro 2in1模拟器、3120×2080显示。它覆盖自由窗口、键盘、鼠标、系统文件选择器和深色设置,比 phone预览更接近目标。
模拟器仍不等于真机:物理触控板、真实内存、存储 provider、功耗和窗口管理可能不同。报告明确写“模拟器通过,真机待复核”。
一条脚本完成构建和启动
DEVECO_HOME="${DEVECO_HOME:-/Applications/DevEco-Studio.app/Contents}"HDC="$DEVECO_HOME/sdk/default/openharmony/toolchains/hdc"EMULATOR="$DEVECO_HOME/tools/emulator/Emulator"EMULATOR_NAME="${OHMARKDOWN_EMULATOR:-MateBook Pro}"PROJECT_ROOT="$(CDPATH= cd -- \ "$(dirname--"$0")/.."&&pwd)" HAP="$PROJECT_ROOT/entry/build/default/outputs/default/entry-default-unsigned.hap" "$PROJECT_ROOT/scripts/build-debug.sh"先构建 Web和 Debug HAP,避免安装旧产物。模拟器名称可用环境变量覆盖,默认与项目验证目标一致。
连接检测与等待
if!"$HDC"list targets-v2>/dev/null|grep-q"Connected";then"$EMULATOR"-start"$EMULATOR_NAME"\>/dev/null2>&1&fiattempt=0while!"$HDC"list targets-v2>/dev/null|grep-q"Connected";doattempt=$((attempt+1))if["$attempt"-ge60];thenecho"等待模拟器连接超时。">&2exit1fisleep1done窗口出现不等于 HDC已连接,脚本最多等待60秒。超时非零退出,不继续执行看似成功的安装。连接检测目前只判断任一 Connected,若同时有真机和模拟器,应选择明确 target id,避免安装错设备。
覆盖安装与冷启动
"$HDC"install-r"$HAP""$HDC"shell aa force-stop\com.example.ohmarkdown>/dev/null2>&1||true"$HDC"shell aa start\-aEntryAbility\-bcom.example.ohmarkdowninstall -r覆盖安装保留应用数据,适合验证恢复记录和升级;force-stop后重新启动形成可控前台状态。若要验证首次安装,还需卸载清数据的独立场景,不能每次都覆盖安装。
force-stop允许失败是因为应用可能未运行;安装和 start不能吞错。脚本输出“已启动”只在命令成功后出现。
文件选择器必须真实操作
工作区和文件打开使用系统 DocumentViewPicker。测试在 Documents创建无敏感样本文档,通过 UI选择文件夹或文件,返回应用后检查 URI读取、名称、状态栏和正文。
曾经把完整授权 URI直接传给listFile,模拟器报 No such file or directory。真实系统操作暴露了纯代码审查无法发现的 URI/path差异。修复后用new uri.URI(...).path枚举,并保留 URI构造子项。
选择器测试覆盖确认与取消。取消后当前 dirty文档必须保持,状态回到 Modified;不能只测选择成功。
强杀恢复验证
在编辑器输入未保存标记文本,等待至少1.5秒快照,使用 HDC force-stop,不执行正常退出。重新 start后应显示恢复对话框,选择 Recover正文回来且标签仍脏;选择 Discard则记录清除。
验证 RPO时在文本中加入时间序号,区分快照前后内容。重复强杀应覆盖:计时器触发前、触发后、恢复后未保存再次强杀、保存成功后强杀。
普通关闭窗口可能触发生命周期,不等于进程突然终止,不能作为崩溃证据。
中文输入和快捷键
模拟器使用小艺输入法输入拼音组合,观察组合串、候选上屏、Ctrl+Z整次撤销和无残留字符。快捷键验证 Ctrl+S打开保存选择器、Ctrl+O打开文件流程、Ctrl+F聚焦搜索框。
Web自动化insertText不能完全模拟 IME composition。设备验证需要真实候选交互。物理键盘长按和系统快捷键冲突仍留给真机。
多标签与关闭分支
输入 Session-A,新建标签输入 Session-B,往返切换检查正文和星号;在 A撤销不能改变 B。关闭脏标签分别选择取消、放弃、保存,取消保留、放弃只删目标、保存选择器取消仍保留。
模拟器画面验证标签活动边、关闭按钮和后继选择,Playwright补充 EditorState历史断言。两层缺一不可。
工作区树
选择 Documents后检查一级目录、Markdown过滤、目录优先排序;点击子目录按需展开,点击文件打开新标签;折叠删除后代。空目录、无支持文件和权限失败需要状态反馈。
两千项上限尚未在模拟器建立规模语料,不能仅凭代码标为设备通过。
系统深色切换
打开系统设置的深色模式,与 OhMarkdown并排。切换后原生外壳、CodeMirror、预览、边框和状态栏同时变暗,不能留下白色 Web区。验证后切回浅色,恢复设备环境。
初次验证发现 ArkUI变暗但 ArkWeb仍白,促成 AppStorage到setTheme的显式 Bridge。媒体查询测试无法替代系统配置生命周期。
分栏和同步滚动
准备长文档,分别滚动源码与预览,检查另一侧跟随且不回弹;关闭 Sync后两侧独立;快速换边观察递归抖动。窗口缩窄到断点下,分栏改为上下布局且没有重叠。
模拟器鼠标滚轮不等于真机触控板惯性,报告保留真机项。
性能采集
用 1MiB与10MiB临时文档,日志OhMarkdownPerf记录文件读取和编辑器加载。模拟器实测:1MiB总83ms,10MiB总345ms。内存用 hidumper统计主进程、ArkWeb活跃和辅助进程 PSS。
1MiB完整进程组324.7MiB,高于250MiB目标29.9%;10MiB396.4MiB。加载时间通过不代表内存通过,指标分开结论。
应用截图证据
下图是 MateBook Pro 2in1模拟器中的完整桌面工作台。标题栏、活动栏、侧栏、标签、工具栏、编辑区和状态栏同时可见。
截图使用无敏感 fixture,保留完整应用边界。每个功能证据还保存主题、工作区、搜索、大纲、标签和恢复专项图片。图片文件实际格式与扩展名要一致。
截图不能替代动作记录
静态图无法证明保存、滚动和恢复。测试报告应写前置数据、操作、预期、实际、构建 commit和证据路径。对话框分支逐项记录,不能用一张主界面图代表全部通过。
自动截图前清理通知、用户名、路径和文档正文。必要时裁剪但保留应用上下文;不要用设计稿冒充运行截图。
模拟器状态清理
每轮结束恢复浅色主题、关闭测试选择器、删除临时公共文件或使用专用目录。恢复记录是否保留要明确,避免下一轮启动弹框影响用例。不要未经确认删除用户真实未保存内容。
测试脚本可以创建带前缀临时文件并在 after清理。系统设置属于共享状态,必须记录变更与恢复。
自动化演进
可用 HDC脚本安装、启动、强停和拉取日志;UI操作可通过测试框架或稳定坐标辅助,但系统选择器与窗口位置会变化,优先使用组件标识。截图命名用语义和日期,不用 screen1。
模拟器流水线需要独占设备,串行执行,失败后保存日志和屏幕。连接失败、应用崩溃、断言失败分别报告。
当前边界
模拟器不是鸿蒙 PC真机;HDC脚本未选择特定 target;设备 UI尚未完全自动化;两千项目录、反复强杀、物理触控板、多窗口压力和签名 Release未验证。
冷启动、覆盖安装和清数据要分开
覆盖安装保留沙箱,适合升级与恢复;首次安装没有历史记录,适合检查默认主题、初始空标签和权限;清数据启动适合确认测试残留不会被代码依赖。三种场景结果不能混在一起。
升级验证应先用旧 HAP创建未保存恢复记录和工作区状态,再安装新 HAP,检查记录版本校验与迁移。当前 RecoveryRecord只有 version 1且无迁移,未知版本会被拒绝;测试必须确认应用仍能启动,而不是卡在恢复循环。
卸载会删除应用沙箱,执行前要明确没有需要保留的草稿。自动化环境可以使用专用模拟器快照,用户共享设备不能随意清数据。
日志与崩溃证据
HDC拉取 hilog时按应用 bundle、时间和标签过滤。性能使用OhMarkdownPerf,普通生命周期使用有限日志。正文、URI和搜索词不进入日志。发现退出时同时记录应用主进程、ArkWeb进程、系统 LowMemoryKill和异常堆栈。
“应用窗口消失”可能是 force-stop、崩溃或系统杀进程,必须根据系统记录区分。性能报告曾记录一次10MiB连续撤销触发 LowMemoryKill,修复后用相同路径复测且未产生新记录;这比“后来没闪退”更有证据。
每次设备报告绑定 HAP哈希。若日志来自 Debug而截图来自另一个 Release,不能合并成一条结论。
自由窗口尺寸矩阵
主工作台设置最小640×480,侧边栏在宽度小于900时隐藏,Web分栏在760以下改为上下布局。模拟器应逐档验证640、720、900、1280、1440vp,并在每档检查标签、Open/Save、模式控制、状态栏和长文件名。
测试不仅拖到目标宽度,还要连续来回跨越断点,观察组件是否残留、Web尺寸是否更新和焦点是否丢失。最大化、还原、分屏和最小化回前台也属于 PC生命周期。截图至少保留宽、窄和深色三个基线。
证据目录结构
每个功能使用日期与阶段目录,包含 test-cases、test-report和 evidence。图片采用语义名称,如system-dark-split.jpeg、workspace-expanded.jpeg,报告引用相对路径。相同图片不要被多个不相关结论重复使用。
技术文章图片复制到本地忽略目录,不修改仓库测试证据。复制后用file检查实际格式,PNG不能继续错误命名为 JPEG。图片替代文本说明界面、状态和验证点,方便离线阅读与无障碍。
结语
OhMarkdown模拟器工作流把 Web构建、HAP组装、连接等待、覆盖安装、强停启动和真实系统交互串成可重复路径。文件选择、恢复、输入法、主题和分栏都在2in1环境产生证据,同时对真机缺口保持明确。
鸿蒙 PC优先不是一句设备声明,而是每个核心工作流都必须在目标形态上被实际操作、记录、清理和复测。