05 鸿蒙APP 测试、性能、安全、发布与生产实践
一、详细知识点1. 测试体系类型目标示例单元测试验证纯逻辑收藏切换、数据转换组件测试验证 UI 状态空状态、按钮文案UI 测试验证用户流程首页到详情、收藏、设置兼容测试验证设备差异手机、平板、横竖屏回归测试防止旧功能被破坏发布前核心路径2. 调试与日志日志要能回答哪个模块、哪个动作、哪个参数边界、失败原因是什么。不要输出 token、手机号、定位、身份证等敏感信息。3. 性能优化问题原因处理首屏慢初始化太多首屏最小化异步加载列表卡顿item 复杂、重绘多拆组件、缓存、分页内存增长监听和缓存未释放生命周期清理耗电高频定位或后台任务降频、按需启停包体大资源冗余压缩、裁剪、按模块管理4. 安全与隐私生产实践鸿蒙工程必须做权限最小化、数据最小化、本地敏感数据保护、日志脱敏、网络安全和隐私政策对齐。上线前要确认申请权限与实际功能一致。5. 发布治理发布不是“能编译”。发布前需要版本号、签名、图标、名称、权限说明、隐私政策、崩溃回归、性能回归、弱网验证和灰度策略。二、本章 demoDemo 1本地可运行验证cd/Users/liuyinghui/Documents/harmonyOS/harmonyos-knowledge-system/demo/web-previewnodeserver.js验收路径首页展示 4 条新闻。点击卡片进入详情。收藏一篇文章。进入收藏页能看到收藏文章。进入设置页切换深色模式和字体。Demo 2生产发布检查表检查项demo 映射首屏可用首页列表加载错误可恢复NewsService可模拟失败后显示错误空状态收藏为空时显示EmptyView状态可追踪收藏和设置由 Store 管理多端适配页面使用自适应宽度和内容流Demo 3生产实践扩展任务把NewsService从 mock 替换成真实 HTTP。把FavoriteStore改成 Preferences 持久化。增加搜索、分类、分页。增加单元测试覆盖 Store。增加发布前检查脚本。三、面试题与详细答案1. 如何证明一个鸿蒙应用可以发布要从功能、稳定性、性能、安全、合规和发布配置证明。功能上核心路径可跑通稳定性上无高频崩溃性能上首屏和列表不卡安全上权限最小化、日志脱敏合规上隐私政策和权限说明一致发布配置上签名、版本、图标、包名正确。2. 如何排查首页启动慢先看生命周期和首屏加载链路onCreate、onWindowStageCreate是否做了重任务首页是否同步解析大数据是否加载大图是否等待非首屏接口。优化方向是首屏最小化、异步加载、缓存必要数据、延后非关键任务。3. 收藏功能应该怎么测试至少测五类默认未收藏点击后收藏再次点击取消收藏页数量变化重启后是否按设计保留。如果使用持久化还要测缓存损坏、版本升级和清空数据。4. 工程化开发者和普通开发者的差别是什么普通开发者能把功能写出来工程化开发者能控制复杂度、处理失败路径、设计可测试架构、优化性能、保障隐私安全并能把项目稳定发布和长期维护。四、五倍扩展知识点矩阵1. 质量保障全景维度基础工程化生产实践功能测试手工点核心流程写验收清单自动化覆盖关键路径单元测试测纯函数测 Service/StoreMock 数据源和异常UI 测试看页面显示覆盖跳转和状态多设备回归日志打印错误模块化日志traceId、脱敏、分级性能感觉不卡测首屏和列表指标化和回归门禁安全不硬编码密码权限最小化隐私合规审计发布能打包检查签名版本灰度、回滚、审计监控用户反馈崩溃收集指标趋势和复盘文档写运行说明写架构说明写故障和发布手册团队协作口头约定代码规范审查清单和责任边界2. 测试金字塔少量端到端测试适量 UI/组件测试大量单元测试类型检查和静态检查单元测试便宜适合覆盖转换、筛选、收藏、设置等逻辑UI 测试较贵适合覆盖核心用户路径端到端测试最贵只覆盖登录、首页、详情、支付或提交等核心链路。3. 性能问题拆解指标可能原因优化冷启动慢初始化过多延迟非关键任务首屏慢等待多个接口缓存优先、并发加载滚动卡item 复杂拆组件、减少计算点击慢主线程阻塞异步化、节流内存高缓存不清LRU、生命周期释放包体大图片和依赖冗余压缩、裁剪耗电高后台任务频繁降频、按需流量高重复请求缓存、去重发热计算密集降低频率卡死同步 IO移到异步4. 安全和隐私扩展风险表现处理权限过度申请无关权限最小化权限日志泄露输出 token/手机号脱敏本地明文保存敏感数据使用安全能力网络风险明文传输使用可信安全传输截图泄露敏感页面可截图按场景限制数据过量收集无关信息数据最小化第三方 SDK未说明采集审计 SDK用户撤回无关闭入口提供撤回路径缓存残留退出后仍保留清理策略调试包泄露debug 上线发布前检查5. 发布流程需求冻结代码冻结测试回归性能和安全检查签名打包灰度发布监控全量或回滚发布治理的核心不是流程复杂而是每一步都有可验证产物测试报告、性能记录、权限清单、隐私说明、包信息、灰度指标和回滚方案。五、生产实践扩展任务任务目标验收增加 Store 单测验证收藏逻辑收藏/取消/重复点击都正确增加 Service 失败测试验证错误路径页面显示重试增加日志规范统一模块日志日志含模块和动作增加性能清单控制首屏和列表发布前逐项检查增加权限清单合规治理权限与功能对应增加隐私清单避免过度采集数据项有用途增加发布清单降低漏项版本、签名、图标齐全增加回滚方案控制发布风险可退回上一版本增加弱网测试验证用户体验有缓存或错误提示增加多端测试验证适配手机和平板可用增加崩溃复盘模板问题闭环有原因、影响、修复增加代码审查表控制质量PR 可检查示例发布前检查表类别检查项通过标准功能首页、详情、收藏、设置核心流程无阻断兼容手机、平板、横竖屏无布局遮挡性能首屏、列表滚动无明显卡顿稳定重复刷新、快速切页状态不乱安全日志、权限、本地数据无敏感泄露合规隐私政策、权限说明与实际功能一致发布包名、版本、签名配置正确回滚上一版本包和策略可执行六、问题排查方法1. 崩溃排查先收集设备、系统版本、应用版本、操作路径、日志和复现概率。再判断是空值、越界、权限、资源、线程还是系统能力调用失败。修复后必须补回归用例。2. 卡顿排查先定位发生在启动、滚动、点击还是页面切换。再看是否有同步 IO、大量计算、大图加载、复杂布局、重复刷新。优化后要用同样设备和路径复测。3. 状态错乱排查检查状态来源是否重复、异步请求是否乱序、页面返回是否保留旧参数、Store 是否被多个入口修改。解决方案通常是统一状态入口、加请求版本、清理生命周期。4. 发布事故复盘复盘不只问“谁写的”而是问为什么测试没发现为什么发布门禁没挡住为什么监控没及时报警为什么回滚不够快。工程团队用复盘改流程。七、扩展面试题5. 如何设计鸿蒙项目的测试策略先把纯逻辑和 Service/Store 做单元测试再给核心页面做组件或 UI 测试最后用少量端到端测试覆盖关键路径。测试重点不是数量而是覆盖高风险路径启动、登录、数据加载、提交、权限、弱网和发布回归。6. 如何判断一个性能优化是否有效必须有优化前后的同路径、同设备、同数据量对比。只说“感觉快了”不够。要明确指标例如首屏时间、列表滚动流畅度、内存峰值、请求次数、包体大小。没有指标就无法判断是否退化。7. 日志应该如何设计日志要包含模块、动作、关键状态和错误原因但不能包含敏感信息。普通信息、警告和错误要分级。线上日志要能帮助定位问题也要控制量避免影响性能和隐私。8. 发布前为什么要做弱网测试移动应用常处在不稳定网络。弱网下如果没有超时、重试、缓存和错误提示用户会看到无限加载或误以为操作成功。弱网测试能暴露真实用户环境中的失败路径。9. 如何设计回滚策略保留上一稳定版本包和配置明确触发回滚的指标例如崩溃率、核心接口失败率、支付或提交失败率。灰度发布时先小流量观察异常时快速停止扩量并回滚。10. 可上线项目治理最重要的是什么最重要的是可验证和可复盘。功能、性能、安全、发布都要有清单和证据事故发生后能定位、修复、补测试、改流程。生产实践不是写更多代码而是让项目长期稳定演进。八、质量治理详解库1. 测试不是最后一步如果测试只在开发结束后进行很多架构问题已经很难修。生产实践做法是在设计阶段就考虑可测试性Service 可替换、Store 可验证、页面状态可模拟。2. 验收清单要绑定业务路径“功能正常”太模糊。验收清单应写成具体路径打开首页、点击详情、收藏文章、进入收藏页、切换主题、返回首页。每条都能执行。3. 性能优化先定位再行动不要看到卡顿就盲目重构。先确认卡顿发生在启动、渲染、网络、滚动还是图片再选择优化方案。没有定位的优化容易引入新问题。4. 安全问题常来自便利写法为了调试输出 token、为了方便保存明文数据、为了省事申请全部权限这些都会成为上线风险。安全要从编码阶段纳入规范。5. 发布风险要用灰度控制一次性全量发布风险高。灰度可以先暴露少量用户观察崩溃、性能和核心业务指标再逐步放量。6. 回滚不是失败是能力没有回滚能力才是风险。发布必须准备上一稳定版本、配置回退方式和触发条件。7. 线上事故要复盘流程事故不是只找代码错误还要看测试为什么没覆盖、监控为什么没发现、发布为什么没挡住、文档为什么没说明。8. 日志要平衡信息和成本日志太少定位不了问题太多影响性能和隐私。要分级、脱敏、按模块记录并控制线上日志量。9. 隐私合规要和功能同步更新新增权限、新增数据采集、新增第三方 SDK都要同步更新隐私说明和权限说明。不能等发布前集中补。10. 稳定交付不是 API 记忆真正的稳定交付能力是面对失败、性能、兼容、安全和协作时仍能稳定交付。API 会变但工程判断长期有效。九、质量场景化实战库场景检查点失败表现改进首次启动首屏时间长时间白屏延迟非关键任务新闻刷新请求状态无限加载超时和重试快速点击并发状态重复收藏禁用或幂等空收藏空状态空白页EmptyView断网弱网体验无提示错误页和缓存横屏布局挤压遮挡自适应大字号无障碍文本溢出自适应高度深色模式对比度看不清主题变量日志安全泄露信息脱敏发布包配置版本错误发布检查灰度风险全量事故分批放量回滚恢复无法退回保留稳定包十、扩展面试题库11. 为什么测试要覆盖失败路径真实用户一定会遇到网络失败、权限拒绝、空数据和重复点击。只测成功路径会让应用在真实环境中不稳定。失败路径测试能验证产品是否可恢复。12. 性能优化为什么要防止“优化错对象”如果没有定位可能花时间优化无关代码。例如卡顿来自图片加载却去改网络层首屏慢来自同步初始化却去改列表。指标和定位能避免无效优化。13. 如何设计发布门禁发布门禁应包括自动化测试通过、核心手工验收通过、权限清单确认、隐私说明确认、版本签名确认、性能无明显退化、灰度和回滚方案准备。14. 什么样的日志算好日志好日志能定位问题但不泄露隐私。它包含模块、动作、关键状态、错误原因和关联 id同时分级清晰不把调试噪声带到生产。15. 如何培养可上线工程能力持续做三件事写代码时考虑边界交付时留下验证证据出问题后复盘并改进流程。稳定交付不是不出错而是能让错误影响更小、恢复更快、下次不再发生。十一、质量体系补全质量域检查内容工具/手段交付证据功能正确性核心流程、异常流程、空状态手工验收、自动化测试验收清单单元测试Model、Mapper、Store、Service测试框架测试报告UI 测试页面跳转、按钮、输入、状态DevEco 测试能力UI 测试记录专项测试兼容、性能、稳定、安全DevEco Testing、真机专项报告调试能力hilog、断点、hdc、设备日志IDE、命令行问题定位记录性能体验启动、渲染、内存、功耗、包体Profiler、真机观测性能基线弱网体验超时、重试、缓存、失败提示网络模拟弱网用例安全隐私权限、日志、数据存储、第三方 SDK清单审查合规记录发布质量签名、版本、灰度、回滚AGC、发布平台发布记录运营反馈崩溃、反馈、指标、复盘监控和日志复盘文档十二、测试用例矩阵模块成功路径失败路径边界路径首页加载新闻列表网络失败空列表详情根据 id 打开id 不存在数据被删除收藏收藏/取消Store 写入失败重复点击设置切换主题持久化失败字号超界搜索命中结果无结果空关键字权限用户授权用户拒绝权限撤回通知成功发送通知关闭点击跳转异常缓存命中缓存缓存损坏版本迁移发布包可安装签名错误版本回滚十三、性能专项指标目标排查方向优化动作冷启动首屏尽快可见Ability 初始化、首页请求延迟非关键任务页面切换点击后快速响应导航、参数、数据预取缓存详情数据列表滚动稳定流畅item 复杂度、图片懒加载、分页内存不持续增长缓存、监听、图片清理和上限功耗后台不过度运行定位、轮询、动画按需启停包体不引入冗余图片、依赖资源压缩弱网可恢复超时、重试缓存和错误页十四、安全与隐私清单检查项问题处理权限是否和功能一一对应删除无关权限用户说明是否解释用途在触发场景说明日志是否包含敏感信息脱敏和分级本地数据是否明文保存敏感内容使用安全能力网络是否处理证书和错误统一网络层第三方 SDK是否说明采集SDK 审查数据删除用户能否清理提供清除入口截图/录屏敏感页面是否保护按场景限制调试包是否误发布发布门禁检查十五、发布与运营流程否是需求冻结代码冻结测试回归性能与安全检查签名打包小范围发布观察指标是否异常扩大范围暂停 / 回滚 / 修复发布前必须准备版本号和构建号。签名和证书。权限清单。隐私说明。核心流程验收结果。性能和弱网检查结果。回滚包和回滚条件。发布后观察指标。十六、架构治理能力架构设计能力不是会画图而是能把业务复杂度控制在可维护范围内。治理点判断标准落地方式模块边界业务、公共、平台能力分开feature/common/platform依赖方向单向、稳定禁止 common 依赖 feature状态管理来源清楚、可恢复ViewState Store数据流页面不接触底层系统 APIService Repository错误处理用户可理解、日志可定位ErrorMapper可测试性不依赖真实 UI 和网络mock Repository可观测性日志可串联traceId可演进性新需求不大改旧代码接口和分层十七、补充面试题16. 如何建立发布门禁发布门禁要覆盖自动化测试、核心手工验收、性能基线、安全清单、权限清单、签名版本、灰度方案和回滚方案。任何一项缺失都可能让问题进入线上。17. 如何设计鸿蒙应用的可观测性统一日志格式记录模块、动作、traceId、结果和错误码关键链路记录开始和结束敏感信息脱敏发布后关注崩溃、失败率、耗时和用户反馈。18. 如何做架构评审看业务目标、模块划分、依赖方向、数据流、状态管理、错误处理、权限、安全、性能、测试和发布。评审结果要变成代码约束和检查清单而不是只停留在会议纪要。19. 如何判断项目是否具备长期维护能力看新人能否跑通模块边界是否清楚核心流程是否有测试错误是否可定位发布是否可回滚文档是否解释架构和排错路径。20. 如何从功能开发走向架构设计能力每做一个功能都追问状态从哪里来失败怎么处理数据怎么缓存权限怎么降级如何测试如何发布如何回滚。长期这样训练才能从写页面走到设计系统。