【ArkUI 入门练中学】第12课:应用测试与调试

📅 发布时间:2026/10/9 12:32:03
【ArkUI 入门练中学】第12课:应用测试与调试
本节目标· 理解 HarmonyOS 测试金字塔模型掌握单元测试、集成测试、UI 自动化测试的定位与边界· 掌握 Hypium 测试框架的基本用法能够编写包含 describe、it、expect 的测试用例· 掌握 JsUnit 的断言能力与 Mock 能力能够对业务函数和异步接口进行测试· 掌握 UiTest 框架的核心 API能够实现组件查找、事件注入与属性断言· 掌握 DevEco Studio 调试工具的使用包括断点调试、日志查看与 Attach Debugger· 掌握 DevEco Profiler 的性能分析能力能够定位启动耗时、卡顿丢帧与内存泄漏问题· 了解 HiDebug 模块的调试调优接口能够获取内存、CPU 等运行时数据· 掌握常见调试问题的排查方法包括包名无法识别、签名类型不匹配等· 能够为应用建立基本的测试与调试工作流提升代码质量与问题定位效率一、测试体系概述1.1 测试分层模型HarmonyOS 应用测试遵循经典的测试金字塔模型单元测试Unit Test 测试单个函数、类或模块的逻辑正确性执行速度快占比最高。集成测试Integration Test 测试模块间协作、数据流转、API 调用等场景。UI 自动化测试UI Test 模拟用户操作验证界面交互、页面跳转、状态更新等端到端流程。核心原则测试重心应放在单元测试层越往上层的测试执行速度越慢、维护成本越高但覆盖面越接近真实用户场景。1.2 测试框架全景HarmonyOS 官方提供了完整的测试框架支持统一由 Test Kit 提供。自动化测试框架 arkxtest 支持 JS/TS 语言的单元测试框架JsUnit及 UI 测试框架UiTest。JsUnit 提供单元测试用例执行能力提供用例编写基础接口生成对应报告用于测试系统或应用接口。UiTest 通过简洁易用的 API 提供查找和操作界面控件能力支持用户开发基于界面操作的自动化测试脚本。Hypium 是 HarmonyOS 生态提供的自动化测试基础框架以及配套的开发工具可支持开发者开发自动化测试用例包括创建工程、自动化代码开发、用例执行和报告分析等步骤。测试用例基于 ohos/hypium 包编写在 oh-package.json5 的 devDependencies 节点中配置版本号即可使用。二、单元测试2.1 测试环境与目录结构在 DevEco Studio 创建的工程中测试代码默认位于 entry/src/ohosTest/ets/test 目录。测试文件命名遵循 *.test.ets 规范。一个完整的测试脚本需要包含三个基本元素依赖导包使用单元测试框架提供的接口、测试代码编写编写测试用例的相关测试逻辑、断言接口调用设置测试代码中的检查点用于检查用例是否符合预期。2.2 基本测试用例结构测试用例使用 describe 定义测试套it 定义单个测试用例expect 进行断言import{describe,it,expect}fromohos/hypium;import{StringUtil}from../../../ets/utils/StringUtil;exportdefaultfunctionstringUtilTest(){describe(StringUtil,(){it(should truncate long text,(){constresultStringUtil.truncate(Hello World,5);expect(result).assertEqual(Hello...);});it(should not truncate short text,(){constresultStringUtil.truncate(Hi,5);expect(result).assertEqual(Hi);});});}2.3 断言能力JsUnit 提供断言能力用于判断用例实际结果值与预期值是否相符。常用断言包括assertEqual判断值相等、assertTrue判断为真、assertFalse判断为假、assertContain判断包含子串、assertInstanceOf判断实例类型等。2.4 Mock 能力Mock 能力支持函数级 Mock对定义的函数进行 Mock 并修改函数的行为使其返回指定的值或者执行指定操作。在 instrument test 和 local test 中均支持 Mock 能力可以使用 hamock 或 hypium 包中的 Mock API 实现。import{describe,it,expect}fromohos/hypium;import{MockKit}fromohos/hamock;exportdefaultfunctionuserServiceTest(){describe(UserService,(){it(should return mocked data when api unavailable,(){constmockKitnewMockKit();constuserServicenewUserService();// Mock 远程接口使其返回固定值constmockFuncmockKit.mockFunc(userService,fetchUserInfo);mockFunc.mockReturnValue({name:TestUser,age:25});// 测试使用 Mock 数据的业务逻辑constresultuserService.getUserName();expect(result).assertEqual(TestUser);});});}2.5 数据驱动测试数据驱动能力支持复用同一个测试脚本使用不同输入数据驱动测试脚本执行。适合对边界值、异常值进行批量验证的场景。2.6 异步测试对于涉及网络请求、定时器等异步操作的测试it 回调支持 async/await 语法it(should fetch data from network,async(){constservicenewApiService();constresultawaitservice.fetchArticles();expect(result.length).assertLarger(0);});三、UI 自动化测试3.1 UiTest 框架概览UiTest 框架主要对外提供了 UiTest API 供开发人员在对应测试场景调用其脚本的运行基础仍是单元测试框架。UiTest 提供了组件查找、事件注入、属性断言等能力。Hypium 提供了 HarmonyOS UI 测试常用组件库UIDriver 是设备 UI 测试核心功能类提供设备连接、断开、点击、滑动、控件查找等操作UIComponent 是控件组件提供控件属性获取和控件操作接口BY 是控件选择器根据控件属性定位控件支持多条件组合查询UIWindow 提供窗口相关属性获取和窗口操作接口。3.2 基本使用流程import{describe,it,expect}fromohos/hypium;import{Driver,ON,Component}fromkit.UiTestKit;import{abilityDelegatorRegistry}fromkit.TestKit;import{UIAbility,Want}fromkit.AbilityKit;constdelegatorabilityDelegatorRegistry.getAbilityDelegator();constbundleNameabilityDelegatorRegistry.getArguments().bundleName;functionsleep(time:number){returnnewPromisevoid((resolve:Function)setTimeout(resolve,time));}exportdefaultfunctionuiTest(){describe(UIAutomationTest,(){it(testLoginFlow,0,async(done:Function){// 启动被测 Abilityconstwant:Want{bundleName:bundleName,abilityName:EntryAbility};awaitdelegator.startAbility(want);awaitsleep(1000);// 创建 Driver 并连接constdriverDriver.create();// 查找用户名输入框并输入awaitdriver.findComponent(ON.id(username_input)).inputText(testUser);// 查找密码输入框并输入awaitdriver.findComponent(ON.id(password_input)).inputText(123456);// 点击登录按钮awaitdriver.findComponent(ON.text(登录)).click();// 等待页面跳转awaitsleep(2000);// 断言登录后的页面元素constcomponent:Componentawaitdriver.findComponent(ON.text(欢迎回来));expect(component!null).assertTrue();done();});});}关键 API 说明ON.id() 按组件 ID 查找ON.text() 按文本内容查找。findComponent 返回 Component 对象可进一步调用 click()、inputText() 等操作。3.3 事件注入与系统操作UiTest 支持模拟多种外设操作如鼠标、键盘、触摸等。此外还可以模拟网络场景、设置时间时区、管理字体、操作剪贴板等。四、调试工具4.1 断点调试DevEco Studio 支持源码级断点调试在代码行号旁点击即可添加断点。调试时可查看变量值、调用栈、表达式求值等。对于已运行的应用可通过 Attach Debugger to Process 附加到进程进行调试。Attach Debugger 的两个前提条件应用配置为调试模式app.json5 中 “debug”: true以及配置调试签名而非发布签名。如果无法识别包名可执行 hdc shell bm dump -n 包名 | grep debug 查询应用信息或执行 hdc shell bm dump -n 包名 | grep appProvisionType 查询证书类型。4.2 日志调试使用 HiLog 进行分级日志打印日志级别从低到高包括 DEBUG、INFO、WARN、ERROR、FATAL。通过 hilog 命令行工具可在终端查看设备日志支持按 tag、级别、进程 ID 过滤。import{hilog}fromkit.PerformanceAnalysisKit;constDOMAIN0x0000;constTAGMyApp;hilog.debug(DOMAIN,TAG,调试信息: %{public}s,value);hilog.info(DOMAIN,TAG,常规信息);hilog.error(DOMAIN,TAG,错误信息: %{public}s,error.message);4.3 常见调试问题排查问题一Attach Debugger 无法识别包名。首先执行 hdc shell bm dump -n 包名 | grep debug 查询应用信息如果返回的 “debug” 配置为 false需要在 app.json5 中增加 “debug”: true。如果 debug 已为 true执行 bm dump -n 包名 | grep appProvisionType 查看证书类型若返回 “release” 则说明使用了正式签名需要配置调试签名。问题二调试启动时卡在 Waiting for application to come online。使用 hdc shell 进入设备执行 ps 命令查找包名对应的进程如果存在多个进程可能导致调试侧拿到旧的进程 pid需要清理后重试。问题三真机部署失败。重点检查设备与开发机连接是否稳定、调试授权弹窗是否已确认、工程签名配置是否符合运行目标。应用安装失败时应先看 IDE 的 Run 日志而不是只看页面提示。五、性能分析工具5.1 DevEco ProfilerPerformance Analysis Kit性能分析服务为开发者提供应用事件、日志、跟踪分析工具可观测应用运行时状态用于行为分析、故障分析、安全分析、统计分析帮助开发者持续改进应用体验。性能分析工具 Profiler 全新升级提供 ArkTS/C 内存检测、信息抓取分析等能力可帮助开发者快速定位并解决问题。Profiler 支持多种分析模式Launch 用于分析应用启动耗时识别启动瓶颈ArkUI 用于定位组件耗时、页面布局、状态变量更新导致的卡顿问题Frame 用于深度分析卡顿丢帧原因ArkWeb 用于定位 Web 应用加载和丢帧问题。5.2 HiDebug 调试接口ohos.hidebug 模块为应用提供多种调试、调优的方法帮助开发者定位性能瓶颈、优化应用性能。主要功能包括内存数据分析、CPU 使用率监控、trace 采集、profiler 采集、VM 堆快照转储。该模块内的接口仅建议在应用调试、调优阶段使用。常用接口包括hidebug.getNativeHeapSize() 获取进程持有的内存总字节数hidebug.getNativeHeapAllocatedSize() 获取已使用的内存字节数hidebug.getPss() 获取应用进程实际使用的物理内存大小hidebug.getCpuUsage() 获取当前进程的 CPU 使用率。import{hidebug}fromkit.PerformanceAnalysisKit;constnativeHeapSize:biginthidebug.getNativeHeapSize();constallocatedSize:biginthidebug.getNativeHeapAllocatedSize();constpss:biginthidebug.getPss();console.info(nativeHeapSize ${nativeHeapSize});console.info(pss ${pss});5.3 故障检测与诊断Performance Analysis Kit 提供故障检测能力包括崩溃检测、地址越界检测、应用冻屏检测、资源泄漏检测、任务超时检测等。还提供检测模式可检测应用线程耗时调用、元能力资源泄漏等问题。错误管理提供捕获应用运行时异常能力以及应用非预期退出后启动状态和数据的自恢复能力。六、多元化习题习题 1判断题题目在 HarmonyOS 应用测试中单元测试的执行速度比 UI 测试慢因此单元测试占比应该最低。答案错误解读单元测试测试单个函数或模块的逻辑正确性执行速度快在测试金字塔中占比最高。UI 自动化测试模拟用户操作执行速度较慢占比应该较低。习题 2单选题题目以下哪个断言方法用于判断实际值与预期值相等A. assertTrue()B. assertEqual()C. assertContain()D. assertInstanceOf()答案B解读assertEqual 用于判断实际值与预期值是否相等。assertTrue 判断是否为真assertContain 判断是否包含子串assertInstanceOf 判断是否为某个类的实例。习题 3多选题题目关于 Hypium 测试框架以下说法正确的有多选A. Hypium 是 HarmonyOS 生态提供的自动化测试基础框架B. 测试用例使用 describe 定义测试套it 定义单个用例C. Hypium 支持 Mock 能力可以对函数进行 Mock 并修改其行为D. Hypium 仅支持同步测试不支持异步测试答案A、B、C解读Hypium 是 HarmonyOS 生态的自动化测试基础框架选项 A 正确。测试用例使用 describe 定义测试套it 定义单个用例选项 B 正确。Hypium 支持 Mock 能力可以对定义的函数进行 Mock 并修改函数的行为选项 C 正确。it 回调支持 async/await 语法可以进行异步测试选项 D 错误。习题 4代码填空题题目请补全以下单元测试代码测试 Calculator.add() 方法是否正确返回两数之和。import{describe,it,expect}fromohos/hypium;import{Calculator}from../../../ets/utils/Calculator;exportdefaultfunctioncalculatorTest(){describe(Calculator,(){it(should return sum of two numbers,(){constcalcnewCalculator();constresultcalc.add(3,4);// 在此处填写断言代码______________});});}答案expect(result).assertEqual(7)解读assertEqual 用于判断实际结果值与预期值是否相等。calc.add(3, 4) 的预期结果为 7因此断言 expect(result).assertEqual(7)。习题 5代码改错题题目某开发者使用 Attach Debugger 调试应用时无法识别包名。已知 app.json5 中已配置 “debug”: true。请指出可能的原因并给出排查方法。答案可能的原因是应用使用了正式签名release而非调试签名。排查方法是执行 hdc shell bm dump -n 包名 | grep appProvisionType 查询证书类型如果返回 “appProvisionType”: “release”则需要配置调试签名。修正方案是在 DevEco Studio 中配置调试签名。解读Attach Debugger 调试依赖两个条件应用配置为调试模式以及配置调试签名。当 debug 已为 true 但仍无法识别包名时应排查签名类型。习题 6简答题题目简述 HarmonyOS 测试金字塔模型的三层结构以及各层的定位和特点。答案HarmonyOS 测试金字塔模型包括三层。单元测试位于金字塔底层测试单个函数、类或模块的逻辑正确性执行速度快占比最高。集成测试位于中间层测试模块间协作、数据流转、API 调用等场景。UI 自动化测试位于顶层模拟用户操作验证界面交互、页面跳转、状态更新等端到端流程执行速度较慢但最接近真实用户场景。解读测试金字塔的核心思想是测试重心应放在单元测试层越往上层的测试执行速度越慢、维护成本越高。合理的测试策略应以大量的单元测试为基础配合适量的集成测试和少量的关键路径 UI 测试。习题 7简答题题目简述 DevEco Profiler 的四种分析模式及其适用场景。答案DevEco Profiler 支持四种分析模式。Launch 模式用于分析应用启动耗时识别启动瓶颈。ArkUI 模式用于定位组件耗时、页面布局、状态变量更新导致的卡顿问题。Frame 模式用于深度分析卡顿丢帧原因。ArkWeb 模式用于定位 Web 应用加载和丢帧问题。开发者可针对不同的性能问题场景选择不同模式的分析任务。解读性能分析需要根据问题类型选择对应的分析模式。启动慢用 LaunchUI 卡顿用 ArkUI滑动丢帧用 FrameWeb 性能问题用 ArkWeb。合理使用 Profiler 可以快速定位性能瓶颈。七、本节知识点总结测试金字塔模型单元测试测试单个函数逻辑执行快、占比高。集成测试测试模块间协作。UI 自动化测试模拟用户操作验证端到端流程。测试重心应放在单元测试层。Hypium 测试框架HarmonyOS 生态的自动化测试基础框架。使用 describe 定义测试套it 定义用例expect 进行断言。支持同步与异步测试、Mock 能力和数据驱动能力。在 oh-package.json5 的 devDependencies 中配置 ohos/hypium 依赖。单元测试测试代码位于 entry/src/ohosTest/ets/test 目录。断言能力包括 assertEqual、assertTrue、assertContain 等。Mock 能力支持函数级 Mock可修改函数行为使其返回指定值。UI 自动化测试UiTest 框架提供组件查找、事件注入、属性断言能力。核心组件包括 Driver设备操作、Component控件操作、BY控件选择器。支持通过 ON.id()、ON.text() 等方式定位控件。调试工具支持源码级断点调试和 Attach Debugger 附加到进程。Attach Debugger 需要应用配置为调试模式并配置调试签名。HiLog 提供分级日志打印hilog 命令行工具可按 tag、级别过滤日志。性能分析DevEco Profiler 支持 Launch启动耗时、ArkUI组件耗时卡顿、Frame丢帧分析、ArkWebWeb 性能四种分析模式。HiDebug 模块提供内存、CPU 等运行时数据采集接口。常见问题排查Attach Debugger 无法识别包名时检查 debug 配置和签名类型。真机部署失败时检查连接稳定性、调试授权和签名配置。调试卡在 Waiting 时检查是否有多个进程导致 pid 不一致。下节预告第13课将进入 ArkUI 应用发布与上架的学习涵盖应用签名配置、AppGallery Connect 创建应用、打包编译、隐私合规检测以及版本更新策略。