尧图网站设计 尧图网站设计YAOTU DESIGN
ARTICLE DETAIL

资讯详情

深耕网站设计与一线实操的经验洞察。

【细胞工坊|19】HarmonyOS ArkTS 回归测试实战:覆盖启动、空数据、异常输入和重复点击

【细胞工坊|19】HarmonyOS ArkTS 回归测试实战:覆盖启动、空数据、异常输入和重复点击 本文基于「细胞工坊」真实 HarmonyOS ArkTS 源码编写源码目录为D:\huawei\one14-9重点复核pages/Index.ets、HomePage.ets、LabPage.ets、LearningPage.ets、MinePage.ets、model/Experiment.ets和common/Constants.ets。需要先说明边界源码中没有看到已落地的自动化测试框架、单元测试目录或 UI 自动化脚本因此本文讨论的是面向 HarmonyOS 5.0 发布前的可执行回归测试清单和源码级风险审计不会虚构“已实现自动化测试平台”。文章中的测试点都能回到真实页面、路由、状态和数据函数。一、回归测试先从主链路开始而不是从用例数量开始一个教育工具类 HarmonyOS 应用真正容易出问题的地方通常不是单个静态页面而是页面之间的连续操作。用户从启动页进入首页点击热门实验切到实验室筛选分类收藏实验再到学习中心进入工具最后在我的页查看记录和清理数据。只要其中一个入口跳错、参数缺失、空数据没有兜底、重复点击造成状态错乱应用就会表现为“功能异常”。「细胞工坊」的主页面由Index.ets组织四个 Tab 分别承载HomePage、LabPage、LearningPage和MinePage。这意味着 05-19 的回归测试不能只盯一个页面而要覆盖启动、Tab 切换、跨 Tab 跳转、列表筛选、收藏状态、本地数据、路由参数和异常源码文本。当前源码还能暴露一个实际风险MinePage.ets文件开头混入了审核/测试说明文本LabPage 和 LearningPage 注释附近也有乱码痕迹。文章不能假装这些问题不存在。更可靠的做法是把它们纳入回归检查发布前不仅要点页面还要确认源码文件头、导入语句、组件声明和中文资源没有被外部文本污染。二、Index.ets启动和 Tab 切换是第一条必测链路Index.ets是应用主入口页面它通过Tabs承载四个页面并用currentIndex记录当前 Tab。底部 Tab 的图标和文字颜色由currentIndex targetIndex判断选中态使用AppColors.TAB_SELECTED未选中态使用AppColors.TAB_UNSELECTED。State currentIndex: number 0 private tabController: TabsController new TabsController() Tabs({ barPosition: BarPosition.End, index: this.currentIndex, controller: this.tabController }) { TabContent() { HomePage({ onSwitchTab: (index: number) { this.tabController.changeIndex(index) } }) } TabContent() { LabPage() } TabContent() { LearningPage() } TabContent() { MinePage() } } .onChange((index: number) { this.currentIndex index })这段代码决定了第一组回归测试冷启动默认是否进入首页点击四个底部 Tab 是否都能切换选中态颜色是否同步变化切到其他 Tab 后返回首页是否没有白屏statusBarHeight和bottomBarHeightpadding 是否没有遮挡底部导航。需要注意一个细节HomePage通过onSwitchTab调用tabController.changeIndex(index)但currentIndex的最终更新依赖 Tabs 的onChange。测试时要覆盖“首页按钮触发跨 Tab 切换”不能只手动点底部 Tab。否则可能漏掉 controller 和状态同步之间的问题。三、HomePage热门实验、快捷入口和跨 Tab 回归首页有两个关键动作一个是进入实验详情一个是从首页切到实验室或学习中心。HomePage.ets中hotExperiments()从getHotExperiments()取热门实验并根据screenWidth截断显示数量热门实验卡片点击后通过router.pushUrl进入ExperimentSimPage并携带expId和expName。private hotExperiments(): Experiment[] { const cols this.screenWidth 600 ? 8 : 6 const hot getHotExperiments() return hot.slice(0, cols) } router.pushUrl({ url: views/experiment/ExperimentSimPage, params: { expId: exp.id, expName: exp.name } })这里要测三类情况。第一正常点击热门实验实验页能拿到expId和expName。第二切换屏幕宽度或平板布局时热门实验数量变化不应造成 Grid 高度、卡片文本截断或按钮错位。第三首页“全部实验”和“去学习”按钮通过onSwitchTab(1)、onSwitchTab(2)切换 Tab 时底部导航状态要同步。从源码看首页没有空态分支因为getHotExperiments()基于静态实验数据返回。文章不能写“首页已实现空态组件”。更准确的回归点是如果后续热门实验数据变成远程或可配置必须给hotExperiments().length 0补空态当前版本主要验证静态数据链路和屏幕宽度变化。四、LabPage分类筛选和收藏重复点击最容易出状态问题LabPage.ets的核心状态有三个experiments、selectedCategory和favoriteIds。分类筛选通过Constants.CATEGORIES[this.selectedCategory]获取当前分类再用filter筛实验收藏通过toggleFavorite(id)在数组中增删 ID并保存到DataStore。private filteredExperiments(): Experiment[] { const cat Constants.CATEGORIES[this.selectedCategory] if (cat Constants.CATEGORY_ALL) { return this.experiments } return this.experiments.filter(e e.category cat) }这段代码对应的测试重点是分类索引。selectedCategory默认是 0对应CATEGORY_ALL。测试时要依次点击全部、基础、培养、DNA、病毒、遗传、细胞确认列表变化合理再返回全部确认数据恢复。这里还要注意“分类名和实验模型里的 category 是否一致”否则某个分类可能显示空列表。收藏重复点击更关键。toggleFavorite先复制favoriteIds如果 ID 已存在就删除不存在就追加然后调用DataStore.saveFavorites(next)。回归测试要覆盖同一实验连续点击两次第一次进入收藏第二次取消收藏切换 Tab 或重新进入 LabPage 后收藏状态能从DataStore.loadFavorites()恢复。private async toggleFavorite(id: string): Promisevoid { const idx this.favoriteIds.indexOf(id) const next [...this.favoriteIds] if (idx 0) { next.splice(idx, 1) } else { next.push(id) } this.favoriteIds next await DataStore.saveFavorites(next) }当前源码里点击收藏图标所在 Row 也在列表项的点击区域内部。测试时需要确认点击收藏图标不会误触发外层实验页跳转。如果实际运行中同时触发收藏和进入详情就需要加事件隔离或调整点击区域。五、LearningPage工具路由要覆盖兜底分支学习页由知识分类和学习工具组成工具点击时使用routeMap将工具标识映射到具体页面。这里有一个明确的异常输入兜底const url routeMap[tool.route] ?? views/learning/FormulaPage。这说明如果tool.route不在映射表中页面会默认跳转到公式页。const routeMap: Recordstring, string { formula: views/learning/FormulaPage, unit: views/learning/UnitConverterPage, constants: views/learning/ConstantsPage, method: views/learning/ExperimentMethodPage } const url routeMap[tool.route] ?? views/learning/FormulaPage router.pushUrl({ url: url })这段代码能支撑“异常输入”测试但边界要说清楚异常输入不是用户在页面上手动输入文本而是工具模型里的route可能出现未登记值。回归测试可以临时构造或检查模型数据确认所有工具 route 都在routeMap中如果后续新增工具必须同时更新映射表。学习分类点击会把category: cat.name作为参数传给KnowledgeListPage。测试时要覆盖各分类名包括中文分类名在路由参数中的传递是否正常。由于当前源码终端显示有中文乱码发布前还需要在 DevEco 或实际编辑器中确认源码编码和页面文案没有被破坏。六、MinePage路由分发和文件头污染都要纳入回归MinePage.ets的菜单项包含实验记录、收藏、笔记、保存的数据、设置、帮助与反馈、关于我们。openRoute(routeName)用一组 if/else 把菜单 route 映射到页面 URL。它也用try/catch包住跳转避免路由异常直接抛到页面。private openRoute(routeName: string): void { try { if (routeName records || routeName saved_data) { router.pushUrl({ url: views/mine/ExperimentRecordsPage }) } else if (routeName favorites) { router.pushUrl({ url: views/mine/FavoritesPage }) } else if (routeName settings) { router.pushUrl({ url: views/mine/SettingsPage }) } } catch (_) { } }这段代码对应两类测试。第一逐个点击菜单项确认目标页面能打开返回后仍在我的页。第二检查未识别 route 是否不会造成崩溃。当前openRoute没有默认分支也没有 Toast因此未知 route 会静默无响应。这个行为可以接受但要在回归表里记录避免误以为所有异常都有用户提示。更重要的是源码文件头问题。当前读取到的MinePage.ets在import之前混入了审核说明和测试信息文本这可能导致 ArkTS 编译失败或页面解析异常。05-19 的文章必须把它作为“发布前源码级回归检查项”确认每个.ets文件以合法 import、interface、class、component 或声明开头不允许混入外部测试备注。七、Experiment 模型参数边界是异常输入测试的来源model/Experiment.ets中每个实验参数都有min、max、defaultValue和step。这为异常输入测试提供了真实边界。比如放大倍数、温度、样本数量、病毒载量、抗体水平等参数都应该在实验页里按照范围限制处理。export interface ExperimentParam { name: string unit: string min: number max: number defaultValue: number step: number }回归测试不应只测默认值还要测边界值。每个实验至少抽一个参数验证最小值、最大值、默认值和步进变化。若参数来自滑块或步进器重复点击加减按钮时不应越界若参数用于 Canvas 或计算公式极限值不应造成 NaN、负尺寸、除零或动画卡死。当前文章只基于主页面和模型不直接声称实验页已完成所有边界保护。更准确的测试建议是主页面负责把expId带到实验页实验页需要独立验证参数边界。05-19 只把边界测试来源讲清楚避免越过已读源码范围。八、Constants.CATEGORIES空数据测试要从分类一致性开始空数据测试不是只把列表清空。对 LabPage 来说空数据最常见来源是分类名不一致。Constants.CATEGORIES中定义了全部、基础、培养、DNA、病毒、遗传、细胞。filteredExperiments()用这些分类值和Experiment.category做等值比较。static readonly CATEGORIES: string[] [ Constants.CATEGORY_ALL, Constants.CATEGORY_BASIC, Constants.CATEGORY_CULTURE, Constants.CATEGORY_DNA, Constants.CATEGORY_VIRUS, Constants.CATEGORY_GENETICS, Constants.CATEGORY_CELL ]测试时可以用两种方式。第一正常数据下逐个分类点击确认每个分类都有期望实验或能显示空态。第二构造一个没有任何实验属于某分类的情况检查页面是否有空态说明。当前LabPage没有显式空态分支如果filteredExperiments()返回空数组List 会直接空白。这个现象要记录为后续改进点。同理LearningPage 的categories和tools都来自模型函数。如果模型函数返回空数组当前页面 Grid 也会空白。回归测试要把“空白是否可接受”变成明确结论而不是靠用户反馈才发现。九、建议的回归测试矩阵切面源码入口测试动作预期结果启动Index.ets冷启动进入应用默认首页可见底部 Tab 不遮挡Tab 切换Tabs.onChange连续点击首页、实验室、学习、我的currentIndex同步选中态正确首页跳转HomePage.onSwitchTab点击“全部实验”“去学习”跨 Tab 跳转后底部状态正确热门实验getHotExperiments()点击热门实验卡片携带expId、expName进入实验页分类筛选LabPage.filteredExperiments()切换全部和各分类列表按分类变化无异常空白重复收藏LabPage.toggleFavorite()同一收藏按钮连续点击两次收藏进入再取消本地状态一致学习工具LearningPage.routeMap点击四个工具入口路由进入对应页面未知 route 有兜底我的页菜单MinePage.openRoute()逐个点击菜单项页面可打开并可返回本地数据DataStore清除收藏、记录、笔记后返回页面空数据状态可解释不残留旧统计源码污染五个页面文件检查文件头和 import 前文本不应出现外部测试说明或乱码这张矩阵的价值是把测试点绑定到源码入口。每个失败都能回到具体页面或函数而不是只写“测试通过/不通过”。十、常见回归问题与修复方向问题可能原因修复方向首页按钮切 Tab 后底部状态没变只调用 controller状态未同步确认Tabs.onChange更新currentIndex点击收藏后同时进入详情子节点点击冒泡到 ListItem调整点击区域或加事件隔离某个分类列表空白Constants.CATEGORIES与模型 category 不一致统一分类常量补空态学习工具跳错页面routeMap未登记新工具 route新增工具时同步更新映射和测试我的页点击无响应route 未覆盖或跳转异常被吞掉增加默认提示或诊断日志构建阶段直接失败.ets文件头混入外部文本清理 import 前非法文本固定编码这些问题都不需要先引入庞大的测试框架。先把主链路、空数据、异常输入、重复点击和源码污染查清楚才有资格继续谈自动化。十一、发布前验证步骤本地回归建议按下面顺序执行。第一打开 DevEco 或命令行构建确认 ArkTS 编译先通过如果编译失败优先检查MinePage.ets文件头和页面注释附近的异常文本。第二启动应用确认首页和底部导航可见。第三按首页、实验室、学习、我的四个 Tab 顺序切换再反向切回首页。第四进入热门实验和实验室列表覆盖路由参数、分类筛选和收藏重复点击。第五进入学习中心点击知识分类和工具入口。第六进入我的页点击记录、收藏、笔记、设置、帮助、关于并检查返回路径。第七清除本地数据后重新进入相关页面确认没有旧状态残留。如果需要进一步提高可靠性可以把这张手工清单转成自动化脚本。但在当前源码状态下第一优先级仍是源码合法性、主链路可达和页面状态一致性。自动化不应该掩盖已知的源码文件头污染问题。十二、结论回归测试要能回到源码而不是只列操作步骤基于D:\huawei\one14-9的真实源码05-19 能成立的结论是细胞工坊的回归测试应围绕Index主导航、HomePage跨 Tab 跳转、LabPage分类筛选与收藏、LearningPage工具路由、MinePage菜单分发、Experiment参数边界和Constants分类常量展开。当前源码没有自动化测试框架因此本文提供的是发布前可执行的人工回归矩阵和源码审计方法。同时当前读取到的页面源码存在文件头混入外部文本和部分中文显示异常的风险。这个风险不能在文章里粉饰成已解决。更务实的交付结论是先用回归清单锁定启动、空数据、异常输入和重复点击再把源码文件合法性作为构建前置检查。对 HarmonyOS 5.0 应用来说回归测试不是堆用例数量而是让每个关键用户路径、每个状态更新和每个发布风险都能被定位、复现和解释。部分内容由AI辅助生成。
返回列表