本节目标

· 理解 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 } from '@ohos/hypium';
import { StringUtil } from '../../../ets/utils/StringUtil';

export default function stringUtilTest() {
  describe('StringUtil', () => {
    it('should truncate long text', () => {
      const result = StringUtil.truncate('Hello World', 5);
      expect(result).assertEqual('Hello...');
    });

    it('should not truncate short text', () => {
      const result = StringUtil.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 } from '@ohos/hypium';
import { MockKit } from '@ohos/hamock';

export default function userServiceTest() {
  describe('UserService', () => {
    it('should return mocked data when api unavailable', () => {
      const mockKit = new MockKit();
      const userService = new UserService();
      // Mock 远程接口,使其返回固定值
      const mockFunc = mockKit.mockFunc(userService, 'fetchUserInfo');
      mockFunc.mockReturnValue({ name: 'TestUser', age: 25 });
      // 测试使用 Mock 数据的业务逻辑
      const result = userService.getUserName();
      expect(result).assertEqual('TestUser');
    });
  });
}

2.5 数据驱动测试

数据驱动能力支持复用同一个测试脚本,使用不同输入数据驱动测试脚本执行。适合对边界值、异常值进行批量验证的场景。

2.6 异步测试

对于涉及网络请求、定时器等异步操作的测试,it 回调支持 async/await 语法:

it('should fetch data from network', async () => {
  const service = new ApiService();
  const result = await service.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 } from '@ohos/hypium';
import { Driver, ON, Component } from '@kit.UiTestKit';
import { abilityDelegatorRegistry } from '@kit.TestKit';
import { UIAbility, Want } from '@kit.AbilityKit';

const delegator = abilityDelegatorRegistry.getAbilityDelegator();
const bundleName = abilityDelegatorRegistry.getArguments().bundleName;

function sleep(time: number) {
  return new Promise<void>((resolve: Function) => setTimeout(resolve, time));
}

export default function uiTest() {
  describe('UIAutomationTest', () => {
    it('testLoginFlow', 0, async (done: Function) => {
      // 启动被测 Ability
      const want: Want = { bundleName: bundleName, abilityName: 'EntryAbility' };
      await delegator.startAbility(want);
      await sleep(1000);

      // 创建 Driver 并连接
      const driver = Driver.create();
      // 查找用户名输入框并输入
      await driver.findComponent(ON.id('username_input')).inputText('testUser');
      // 查找密码输入框并输入
      await driver.findComponent(ON.id('password_input')).inputText('123456');
      // 点击登录按钮
      await driver.findComponent(ON.text('登录')).click();
      // 等待页面跳转
      await sleep(2000);
      // 断言登录后的页面元素
      const component: Component = await driver.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 } from '@kit.PerformanceAnalysisKit';
const DOMAIN = 0x0000;
const TAG = 'MyApp';

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 Profiler

Performance 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 } from '@kit.PerformanceAnalysisKit';

const nativeHeapSize: bigint = hidebug.getNativeHeapSize();
const allocatedSize: bigint = hidebug.getNativeHeapAllocatedSize();
const pss: bigint = hidebug.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 } from '@ohos/hypium';
import { Calculator } from '../../../ets/utils/Calculator';

export default function calculatorTest() {
  describe('Calculator', () => {
    it('should return sum of two numbers', () => {
      const calc = new Calculator();
      const result = calc.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 应用加载和丢帧问题。开发者可针对不同的性能问题场景选择不同模式的分析任务。

解读:性能分析需要根据问题类型选择对应的分析模式。启动慢用 Launch,UI 卡顿用 ArkUI,滑动丢帧用 Frame,Web 性能问题用 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(丢帧分析)、ArkWeb(Web 性能)四种分析模式。HiDebug 模块提供内存、CPU 等运行时数据采集接口。

常见问题排查
Attach Debugger 无法识别包名时,检查 debug 配置和签名类型。真机部署失败时,检查连接稳定性、调试授权和签名配置。调试卡在 Waiting 时,检查是否有多个进程导致 pid 不一致。

下节预告
第13课将进入 ArkUI 应用发布与上架的学习,涵盖应用签名配置、AppGallery Connect 创建应用、打包编译、隐私合规检测以及版本更新策略。

Logo

讨论HarmonyOS开发技术,专注于API与组件、DevEco Studio、测试、元服务和应用上架分发等。

更多推荐