HarmonyOS7 UI 自动化测试:UiTest 框架从 0 到 1
文章目录前言为什么要写 UI 测试UiTest 框架概览环境搭建查找组件模拟操作断言验证测试报告写在最后前言你有没有试过改了一行代码结果三个页面炸了我上个月就干过这事——改了个按钮颜色把整个订单流程搞崩了。手动测了两天才把问题找全人都麻了。从那以后我就在想要是有一套自动化测试能替我点点点该多好。折腾了一周 UiTest 框架终于跑通了第一个 UI 自动化测试用例。今天把整个过程分享出来帮你少踩坑。HarmonyOS7 提供了官方的 UI 自动化测试框架UiTest专门用来对 ArkUI 页面做自动化验证。说实话之前我一直觉得写测试是浪费时间直到那次改一行炸三页的事故才真正意识到——没有测试的代码就像没有刹车的车早晚出事。为什么要写 UI 测试先聊聊为什么需要 UI 测试而不是只靠单元测试。单元测试管的是逻辑但用户看到的、操作的是 UI。按钮能不能点页面跳转对不对列表滑到底部会不会崩这些问题单元测试覆盖不了。我之前的项目有个搜索页单元测试全过结果真机上输入法一弹出来就把搜索按钮遮住了。这种问题只有 UI 测试能发现。UI 自动化测试能帮我们做到回归保障改代码不怕旧功能炸持续集成每次提交自动跑测试减少手动测试把重复的点点点交给机器UiTest 框架概览UiTest 是 HarmonyOS7 官方的 UI 自动化测试框架核心能力包括能力说明|组件查找| 通过 id、text、type 等属性定位 UI 组件 ||模拟操作| 点击、长按、滑动、输入文本等 ||断言验证| 检查组件属性、页面状态是否符合预期 ||测试报告| 自动生成测试结果报告 |它的 API 风格跟 Android 的 UiAutomator 有点像但更简洁。如果你写过 Android UI 测试上手会很快。环境搭建写 UI 测试之前得先把环境搭好。步骤不复杂但有几个坑要注意。1. 在模块的oh-package.json5中添加依赖{ devDependencies: { ohos/hypium: 1.0.6 } }2. 在测试目录下创建测试文件测试文件放在entry/src/ohosTest/ets/目录下别放错位置了。ohosTest是专门放仪器测试的目录跟test目录不一样。3. 配置测试运行器在module.json5里确认有测试配置{ abilities: [ { name: EntryAbility, srcEntry: ./ets/EntryAbility.ets } ] }划重点测试文件必须在ohosTest目录下否则框架识别不了。查找组件UiTest 的核心思路就两步找到组件操作组件。找组件是第一步也是最关键的一步。按 id 查找import{Driver,ON}fromohos.UiTest;constdriverDriver.create();constbuttonawaitdriver.findComponent(ON.id(loginButton));这段代码通过组件的id来查找。ON.id()是最精确的查找方式前提是你给组件设了id。按文本查找consttextCompawaitdriver.findComponent(ON.text(登录));当组件没有设 id 时可以通过显示文本来查找。不过这种方式有个隐患——文本改了测试就挂了。所以还是建议给关键组件加 id。按类型查找constlistCompawaitdriver.findComponent(ON.type(List));按组件类型查找适合需要操作某个类型的容器组件时使用。敲黑板查找组件返回的是Promise必须用await。忘了加await是新手最常见的坑。模拟操作找到组件后就可以模拟用户操作了。点击操作constloginBtnawaitdriver.findComponent(ON.id(loginButton));awaitloginBtn.click();click()模拟单击。如果你需要长按用longClick()。滑动操作awaitdriver.swipe(200,500,200,100,500);// 参数起点x, 起点y, 终点x, 终点y, 滑动速度(ms)swipe()是屏幕级别的滑动适合滚动页面、下拉刷新等场景。输入文本constinputCompawaitdriver.findComponent(ON.id(searchInput));awaitinputComp.inputText(HarmonyOS7);往输入框里填文字。注意这个操作会先清空原有内容再输入新内容。组合操作示例——模拟登录流程asyncfunctiontestLogin(){constdriverDriver.create();// 输入用户名constusernameInputawaitdriver.findComponent(ON.id(username));awaitusernameInput.inputText(testuser);// 输入密码constpasswordInputawaitdriver.findComponent(ON.id(password));awaitpasswordInput.inputText(123456);// 点击登录按钮constloginBtnawaitdriver.findComponent(ON.id(loginButton));awaitloginBtn.click();// 等待页面响应awaitdriver.delayMs(1000);}这段代码模拟了完整的登录操作。delayMs()用来等待页面跳转时间根据实际情况调整。断言验证操作完了得验证结果对不对。这才是测试的核心——光操作不验证那叫演示不叫测试。验证组件是否可见import{assert}fromohos/hypium;consthomeTitleawaitdriver.findComponent(ON.text(首页));assert.assertTrue(homeTitle!null,登录后应跳转到首页);这段代码检查登录后是否出现了首页文字。如果组件找不到说明跳转没成功。验证组件属性conststatusTextawaitdriver.findComponent(ON.id(orderStatus));consttextawaitstatusText.getText();assert.assertEqual(text,已完成,订单状态应为已完成);先拿到组件再读取它的文本内容跟预期值对比。assertEqual会在值不匹配时抛出异常测试标记为失败。验证组件数量constlistItemsawaitdriver.findComponents(ON.type(ListItem));assert.assertEqual(listItems.length,10,列表应显示10条数据);注意findComponents带 s返回所有匹配的组件数组。适合验证列表数据是否正确加载。血泪教训断言一定要写清楚错误信息不然测试挂了你看半天不知道哪里出了问题。测试报告测试跑完会自动生成报告。在 DevEco Studio 里右键测试文件 → Run Tests执行完就能看到结果。报告里包含信息说明用例总数总共跑了多少条测试通过数绿色的没问题的失败数红色的需要排查执行时间每条用例耗时失败截图断言失败时自动截图建议把 UI 测试集成到 CI 流水线里每次提交代码自动跑一遍。这样谁改坏了东西第一时间就能发现。写在最后UiTest 框架上手不难关键是把组件 id 规划好。我现在的习惯是所有用户可交互的组件必须设 id按钮用btnXxx输入框用inputXxx统一命名。这样写测试的时候查找组件就轻松了。还有一点别一上来就想覆盖所有场景。先从核心流程开始——登录、支付、关键操作路径把这些保住了再慢慢扩展。测试覆盖率 20% 但都是关键路径比覆盖率 80% 但全是边缘场景有用得多。如果你还没写过 UI 自动化测试今天就可以动手试试。先跑通一个用例你就知道有多香了。

相关新闻

ChatGPT、Codex、Plus与Pro:AI会调用工具,为什么仍然经常把任务做错?

ChatGPT、Codex、Plus与Pro:AI会调用工具,为什么仍然经常把任务做错?

很多开发者判断AI Agent能力时,首先会看它能不能调用工具。能不能读取项目文件。 能不能运行测试命令。 能不能查询日志。 能不能修改代码。 能不能连续完成多个步骤。当ChatGPT负责理解需求,Codex进入工程环境执行任务,Plus与Pro支撑更高频、…

2026/10/10 22:22:47 阅读更多 →
任天堂Switch自制固件大气层:3步快速上手游戏优化终极指南

任天堂Switch自制固件大气层:3步快速上手游戏优化终极指南

任天堂Switch自制固件大气层:3步快速上手游戏优化终极指南 【免费下载链接】Atmosphere-stable 大气层整合包系统稳定版 项目地址: https://gitcode.com/gh_mirrors/at/Atmosphere-stable 你是否还在为Switch游戏加载缓慢、系统功能受限而烦恼?大…

2026/10/8 5:34:32 阅读更多 →
魔兽争霸III终极优化插件:3分钟解决经典游戏所有兼容性问题

魔兽争霸III终极优化插件:3分钟解决经典游戏所有兼容性问题

魔兽争霸III终极优化插件:3分钟解决经典游戏所有兼容性问题 【免费下载链接】WarcraftHelper Warcraft III Helper , support 1.20e, 1.24e, 1.26a, 1.27a, 1.27b 项目地址: https://gitcode.com/gh_mirrors/wa/WarcraftHelper 还在为经典魔兽争霸III在现代电…

2026/10/6 4:48:34 阅读更多 →

最新新闻

Dubbo服务注册与暴露全流程解析:从Spring容器启动到注册中心

Dubbo服务注册与暴露全流程解析:从Spring容器启动到注册中心

1. 从一次线上故障说起&#xff1a;为什么要搞清楚服务注册与暴露很多同学用 Dubbo 做微服务&#xff0c;配置文件里写个<dubbo:service>或者加个DubboService注解&#xff0c;服务就能被调用了&#xff0c;至于背后发生了什么&#xff0c;基本靠“框架自动搞定”这句话糊…

2026/10/14 20:52:20 阅读更多 →
从零搭建私有文档问答:向量检索与RAG实战指南

从零搭建私有文档问答:向量检索与RAG实战指南

1. 从零搭建私有文档问答&#xff1a;为什么向量检索是绕不开的那道坎很多人第一次接触大模型应用&#xff0c;脑子里想的都是"我把文档丢给模型&#xff0c;它就能回答我的问题"。真动手才发现&#xff0c;模型根本读不到你的私有文档——它只认训练时见过的东西。于…

2026/10/14 20:52:20 阅读更多 →
Mahout推荐系统实训:从协同过滤原理到可调试工程实践

Mahout推荐系统实训:从协同过滤原理到可调试工程实践

1. 这不是“学个框架”那么简单&#xff1a;Mohout推荐引擎在真实实训场景中的定位与价值你点开这个标题&#xff0c;大概率是刚收到实训任务通知&#xff0c;或者正对着教学平台里“创新实训&#xff08;19&#xff09;”这行字发呆。别急着去GitHub搜安装命令——先搞清楚一件…

2026/10/14 20:52:20 阅读更多 →
LDA主题模型实战指南:从原理到可解释文本分析

LDA主题模型实战指南:从原理到可解释文本分析

1. 这不是“黑箱”&#xff0c;而是文本挖掘的基石级工具&#xff1a;LDA到底在解决什么问题&#xff1f;你可能已经听过LDA——Latent Dirichlet Allocation&#xff0c;中文常译作“潜在狄利克雷分布”。但别被这串数学味十足的名字吓退。它既不是高不可攀的理论模型&#xf…

2026/10/14 20:52:20 阅读更多 →
医疗医药AI+BI小范围试点落地路径分享

医疗医药AI+BI小范围试点落地路径分享

导语 医疗医药行业数智化转型持续推进&#xff0c;AIBI成为企业优化经营决策、提升业务效率的核心抓手&#xff0c;但不少企业在落地时容易陷入“盲目铺摊子却无法验证价值”的困境&#xff0c;小范围试点是控制项目风险、验证业务价值的关键起步阶段。医疗医药行业有合规要求高…

2026/10/14 20:52:20 阅读更多 →
5G信令流程解析实战:从NAS、RRC到NGAP的日志分析与排障指南

5G信令流程解析实战:从NAS、RRC到NGAP的日志分析与排障指南

简介&#xff1a;《5G信令流程解析信息介绍及学习技巧》面向5G通信初学者及相关从业者&#xff0c;集中讲解信令流程中的关键概念与学习方法&#xff0c;帮助读者理解用户终端、基站、核心网等通信实体及其交互机制。文档从背景知识出发&#xff0c;阐述5G相对前代在速率、延迟…

2026/10/14 20:51:17 阅读更多 →

日新闻

AnyPS5通用适配层设计:兼容性与性能的工程取舍

AnyPS5通用适配层设计:兼容性与性能的工程取舍

1. 从"AnyPS5"这个名字说起&#xff1a;它到底想解决什么问题第一次看到"AnyPS5"这个标题&#xff0c;我脑子里冒出来的第一个念头是&#xff1a;这大概率是一个围绕"跨平台运行"或者"通用适配"做文章的项目。名字里的"Any"…

2026/10/14 0:00:41 阅读更多 →
Flutter跨平台开发实战:二手交易应用与HarmonyOS适配

Flutter跨平台开发实战:二手交易应用与HarmonyOS适配

1. 项目概述&#xff1a;Flutter跨平台二手交易应用开发作为一名长期从事移动应用开发的工程师&#xff0c;我最近完成了一个基于Flutter框架的二手物品交易平台项目。这个项目最吸引我的地方在于它完美结合了Flutter的跨平台优势与HarmonyOS的生态特性&#xff0c;实现了"…

2026/10/14 0:00:41 阅读更多 →
DFS算法解决飞机降落调度问题实战

DFS算法解决飞机降落调度问题实战

1. 项目背景与核心思路飞机降落问题是一个经典的调度优化场景&#xff0c;也是算法竞赛和面试中的高频题目。这个题目要求我们合理安排多架飞机的降落顺序和时间&#xff0c;确保所有飞机都能安全着陆而不发生冲突。在实际航空管制中&#xff0c;这类问题直接关系到飞行安全和机…

2026/10/14 0:00:41 阅读更多 →

周新闻

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

简介&#xff1a;基于 ARIMA、LSTM、Transformer 等模型的流感时间序列预测 Python 源码&#xff0c;面向计算机相关专业课程设计与期末大作业学生&#xff0c;以及项目实战学习者。内容覆盖预处理、平稳性检验、定阶、残差分析、多模型对比预测的完整时序建模流程&#xff0c;…

2026/10/14 3:30:28 阅读更多 →
影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程&#xff1a;键盘模拟输入实战——输入文本与模拟按键的区别 做影刀RPA自动化&#xff0c;十个新手有八个栽在"往输入框里填东西"这件事上&#xff1a;要么填不进去&#xff0c;要么填了一半&#xff0c;要么直接把原来内容追加在后面。这背后的根因&…

2026/10/14 16:30:29 阅读更多 →
影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程&#xff1a;阅文起点小说数据采集实战——书籍信息与章节内容 1. 认识影刀&#xff1a;什么场景该用RPA采小说数据 起点中文网的页面结构相对稳定——分类榜单、书籍详情、章节内容三块独立页面&#xff0c;跳转链路清晰。这种场景非常适合影刀自动化&#x…

2026/10/14 3:29:58 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/13 22:01:27 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/13 14:57:39 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/14 7:53:34 阅读更多 →