【共创季稿事节】HarmonyOS 7.0 自动化测试实战:从单元测试到UI自动化与性能压测
文章目录

每日一句正能量
生活中的许多烦恼都源于盲目和别人攀比。
攀比的本质,是用别人的尺子量自己的生活。你看到的多是他人光鲜的“高光时刻”,却拿它对比自己琐碎的日常。切断这种无意义的比较,烦恼会减少大半。
摘要
摘要: 高质量的自动化测试是保障 HarmonyOS 7.0 应用稳定交付的核心基础设施。本文从测试金字塔理论出发,系统讲解 Hypium 单元测试框架、UI 自动化测试引擎、性能基准压测工具的使用方法,并基于 GitLab CI / Jenkins 搭建完整的 DevOps 测试流水线。通过真实代码示例与工具链演示,帮助开发者构建可落地的鸿蒙自动化测试体系。
一、HarmonyOS 7.0 测试体系概览
1.1 测试金字塔模型
在移动应用测试领域,Mike Cohn 提出的测试金字塔依然是最具指导意义的理论框架。针对 HarmonyOS 7.0 的技术栈特点,我们可以将测试体系映射为如下三层结构:

底层(单元测试):占比最大,运行最快,成本最低。针对 ArkTS / C++ 业务逻辑函数进行白盒测试,使用 Hypium + JUnit 风格断言。
中层(集成/服务测试):验证模块间接口契约、Ability 生命周期、数据持久化等行为,使用 Hypium 的 Service Test 能力。
顶层(UI/E2E 测试):模拟真实用户操作路径,覆盖页面跳转、手势交互、跨设备流转等场景,使用 UI Test / UI Automator。
遵循金字塔模型的核心原则:越靠近底层,测试应该越多;越靠近顶层,测试应该越少但覆盖关键路径。 这既能保障回归效率,又能控制维护成本。
1.2 HarmonyOS 测试框架演进
| 版本 | 测试框架 | 关键特性 |
|---|---|---|
| HarmonyOS 2.x | DevEco Testing | 基础单元测试与 UI 录制 |
| HarmonyOS 3.x/4.x | Hypium + UiTest | 引入 Hypium 统一测试框架,支持异步断言 |
| HarmonyOS 5.x/7.0 | Hypium 2.0 + SmartPerf | 增强性能压测、多设备协同测试、CI/CD 原生集成 |
HarmonyOS 7.0 在测试领域的最大升级是 Hypium 2.0 与 SmartPerf 性能基准工具链 的深度整合,使得"开发即测试、提交即验证"成为可能。
二、Hypium 单元测试实战
2.1 环境准备与项目结构
在 DevEco Studio 中创建测试工程时,Hypium 框架已内置。标准模块的测试目录结构如下:
entry/src/
├── main/
│ └── ets/
│ └── pages/
│ └── Index.ets
└── ohosTest/
└── ets/
└── test/
├── Ability.test.ets # Ability 生命周期测试
├── Calculator.test.ets # 业务逻辑单元测试
└── List.test.ets # 列表组件行为测试
在 oh-package.json5 中确认依赖:
{
"dependencies": {
"@ohos/hypium": "1.0.16"
}
}
2.2 基础单元测试用例
以支付金额校验模块为例,演示 Hypium 的测试语法:
// entry/src/ohosTest/ets/test/PaymentValidator.test.ets
import { describe, it, expect } from '@ohos/hypium';
import { PaymentValidator } from '../../../main/ets/utils/PaymentValidator';
export default function paymentValidatorTest() {
describe('PaymentValidator 单元测试套件', () => {
it('合法金额应通过校验', 0, () => {
const result = PaymentValidator.validate('100.50');
expect(result.isValid).assertEqual(true);
expect(result.amount).assertEqual(100.50);
});
it('负数金额应被拒绝', 0, () => {
const result = PaymentValidator.validate('-10.00');
expect(result.isValid).assertEqual(false);
expect(result.errorCode).assertEqual('ERR_NEGATIVE_AMOUNT');
});
it('超过限额的金额应被拒绝', 0, () => {
const result = PaymentValidator.validate('999999.99');
expect(result.isValid).assertEqual(false);
expect(result.errorCode).assertEqual('ERR_EXCEED_LIMIT');
});
it('非数字字符串应被拒绝', 0, () => {
const result = PaymentValidator.validate('abc');
expect(result.isValid).assertEqual(false);
expect(result.errorCode).assertEqual('ERR_INVALID_FORMAT');
});
it('边界值:刚好等于限额应通过', 0, () => {
const result = PaymentValidator.validate('50000.00');
expect(result.isValid).assertEqual(true);
});
});
}
关键语法点:
describe定义测试套件,it定义单个用例;- 第二个参数
0表示同步测试,异步场景传入TestType.function; expect(...).assertEqual(...)为基本断言,另有assertTrue、assertThrowError、assertUndefined等丰富断言方法。
2.3 异步逻辑测试
ArkTS 中大量 API 为异步 Promise 风格,Hypium 支持 async/await 测试:
import { describe, it, expect } from '@ohos/hypium';
import { UserService } from '../../../main/ets/services/UserService';
export default function userServiceTest() {
describe('UserService 异步接口测试', () => {
it('应能正常获取用户信息', TestType.function, async () => {
const user = await UserService.getUserInfo('u123456');
expect(user).assertNotNull();
expect(user.id).assertEqual('u123456');
expect(user.nickname.length).assertLarger(0);
});
it('不存在的用户应返回 404', TestType.function, async () => {
try {
await UserService.getUserInfo('not_exist');
expect().assertFail(); // 预期进入 catch,若走到这里则测试失败
} catch (error) {
expect(error.code).assertEqual(404);
}
});
});
}
2.4 Mock 与依赖注入
单元测试的核心原则之一是隔离被测单元。HarmonyOS 7.0 支持通过 mock 工具替换依赖:
import { describe, it, expect, mock } from '@ohos/hypium';
import { OrderService } from '../../../main/ets/services/OrderService';
export default function orderServiceMockTest() {
describe('OrderService Mock 测试', () => {
it('应正确计算折扣金额', 0, () => {
// Mock 支付网关,避免真实网络调用
const mockPaymentGateway = mock.create();
mockPaymentGateway.when('queryDiscountRate')
.afterReturn(0.85); // 模拟返回 85 折
const orderService = new OrderService(mockPaymentGateway);
const finalPrice = orderService.checkout(1000);
expect(finalPrice).assertEqual(850);
});
});
}
三、UI 自动化测试实战
3.1 UI Test 框架选型
HarmonyOS 7.0 提供两套 UI 自动化能力:
| 能力 | 适用场景 | 特点 |
|---|---|---|
| UiTest | 单设备页面操作 | 基于组件树查找,支持断言组件属性 |
| UI Automator | 跨应用/系统级交互 | 支持手势模拟、截图比对、设备流转测试 |
对于常规应用,推荐优先使用 UiTest,它与 ArkUI 组件模型深度绑定,定位稳定、执行高效。
3.2 UiTest 核心 API 与用例
// entry/src/ohosTest/ets/test/LoginPage.test.ets
import { describe, it, expect } from '@ohos/hypium';
import { Driver, ON } from '@ohos.UiTest';
export default function loginPageTest() {
describe('登录页面 UI 自动化测试', () => {
it('应能完成完整登录流程', TestType.function, async () => {
const driver = Driver.create();
// 1. 等待并点击"我的"Tab
await driver.findComponent(ON.text('我的')).click();
// 2. 输入手机号
const phoneInput = await driver.findComponent(ON.id('phone_input'));
await phoneInput.inputText('13800138000');
// 3. 输入密码
const pwdInput = await driver.findComponent(ON.id('password_input'));
await pwdInput.inputText('Harmony@2026');
// 4. 点击登录按钮
await driver.findComponent(ON.text('登录')).click();
// 5. 断言登录成功后的页面元素
const welcomeText = await driver.findComponent(ON.textContains('欢迎回来'));
expect(await welcomeText.getText()).assertContain('欢迎回来');
// 6. 截图留档(可选)
await driver.screenShot('login_success.png');
});
it('空手机号应提示错误', TestType.function, async () => {
const driver = Driver.create();
await driver.findComponent(ON.id('phone_input')).inputText('');
await driver.findComponent(ON.id('password_input')).inputText('123456');
await driver.findComponent(ON.text('登录')).click();
const errorTip = await driver.findComponent(ON.text('请输入手机号'));
expect(errorTip).assertNotNull();
});
});
}
常用定位策略:
ON.text('精确文本')— 按文本精确匹配;ON.textContains('部分文本')— 按文本模糊匹配;ON.id('组件ID')— 按开发者声明的 id 匹配,最稳定;ON.type('组件类型')— 按组件类型匹配,如 Button、TextInput。
3.3 跨设备流转测试
HarmonyOS 的分布式能力是核心竞争力,UI Automator 支持多设备协同测试:
import { describe, it, expect } from '@ohos/hypium';
import { Driver, ON } from '@ohos.UiTest';
export default function distributedTest() {
describe('跨设备流转 UI 测试', () => {
it('视频播放应能从手机流转到平板', TestType.function, async () => {
// 手机端:启动视频并点击流转按钮
const phoneDriver = Driver.create('phone_device_id');
await phoneDriver.findComponent(ON.text('播放')).click();
await phoneDriver.findComponent(ON.id('transfer_btn')).click();
// 平板端:断言视频已接续并播放
const padDriver = Driver.create('pad_device_id');
const videoPlayer = await padDriver.findComponent(ON.id('video_player'));
expect(await videoPlayer.getAttr('playbackState')).assertEqual('playing');
});
});
}
四、性能基准测试与 SmartPerf
4.1 为什么需要性能压测?
功能正确只是及格线,流畅体验才是高分项。HarmonyOS 7.0 对应用的性能指标有明确基线要求:
| 指标 | 达标线 | 优秀线 |
|---|---|---|
| 首帧绘制时间 | < 300ms | < 200ms |
| 页面转场动画 | < 200ms | < 120ms |
| 内存峰值占用 | < 256MB | < 180MB |
| CPU 持续占用 | < 30% | < 15% |
| 丢帧率(Jank) | < 5% | < 1% |
4.2 SmartPerf 工具链使用
SmartPerf 是 HarmonyOS 官方提供的性能分析平台,支持自动化性能采集与基准对比。
步骤一:配置性能测试用例
// entry/src/ohosTest/ets/test/Performance.test.ets
import { describe, it, expect } from '@ohos/hypium';
import { performance } from '@kit.PerformanceKit';
export default function performanceTest() {
describe('首页性能基准测试', () => {
it('首帧绘制时间应小于 200ms', TestType.function, async () => {
const trace = performance.startTrace('page_launch');
// 模拟启动首页
await launchEntryAbility();
trace.stop();
const metrics = trace.getMetrics();
expect(metrics.firstFrameTime).assertLess(200);
expect(metrics.totalLaunchTime).assertLess(500);
});
it('长列表滑动丢帧率应小于 2%', TestType.function, async () => {
const trace = performance.startTrace('list_scroll');
// 模拟快速滑动 100 条数据
await simulateFling(1000, -3000); // x, velocityY
trace.stop();
const metrics = trace.getMetrics();
expect(metrics.jankRate).assertLess(0.02);
expect(metrics.avgFrameTime).assertLess(16.6); // 60fps 基准
});
});
}
步骤二:命令行执行并导出报告
# 连接设备并执行性能测试
hdc shell am start -a ohos.aa.action.ohosTest \
-b com.example.demo \
-m entry \
-s unittest Performance.test.ets
# 拉取性能 trace 文件
hdc file recv /data/app/el2/100/base/com.example.demo/haps/entry/files/perf.trace ./perf.trace
# 使用 SmartPerf-Host 解析并生成 HTML 报告
smartperf-cli analyze --input ./perf.trace --output ./perf-report/
五、CI/CD 测试流水线搭建
5.1 流水线架构设计

上图展示了基于 GitLab CI 的完整测试流水线。每次代码推送触发构建后,依次执行单元测试、集成测试、UI 自动化测试与性能基准测试,任一阶段失败都将阻断合并。
5.2 GitLab CI 配置实战
在项目根目录创建 .gitlab-ci.yml:
stages:
- build
- unit_test
- integration_test
- ui_test
- perf_test
- report
variables:
HOS_SDK: "/opt/harmonyos/sdk/7.0"
NODE_OPTIONS: "--max-old-space-size=4096"
# 阶段一:编译构建
build_job:
stage: build
image: harmonyos/ci-builder:7.0
script:
- npm install
- hvigorw assembleRelease --no-daemon
artifacts:
paths:
- entry/build/default/outputs/default/
expire_in: 1 hour
# 阶段二:单元测试
unit_test_job:
stage: unit_test
image: harmonyos/ci-builder:7.0
dependencies:
- build_job
script:
- hvigorw test --module entry --testPath ohosTest --no-daemon
artifacts:
reports:
junit: entry/build/default/outputs/ohosTest/report.xml
paths:
- entry/build/default/outputs/ohosTest/
# 阶段三:集成测试
integration_test_job:
stage: integration_test
image: harmonyos/ci-builder:7.0
script:
- hvigorw test --module entry --testPath integrationTest --no-daemon
# 阶段四:UI 自动化测试(需连接真机/模拟器)
ui_test_job:
stage: ui_test
tags:
- harmonyos-device-farm
script:
- hdc list targets
- hvigorw uiTest --module entry --no-daemon
- mkdir -p ui-screenshots
- hdc file recv /data/app/el2/100/base/com.example.demo/haps/entry/files/screenshots/ ui-screenshots/
artifacts:
paths:
- ui-screenshots/
expire_in: 3 days
# 阶段五:性能基准测试
perf_test_job:
stage: perf_test
tags:
- harmonyos-device-farm
script:
- hvigorw perfTest --module entry --no-daemon
- smartperf-cli analyze --input entry/build/perf.trace --output perf-report/
artifacts:
paths:
- perf-report/
expire_in: 7 days
# 阶段六:聚合报告
report_job:
stage: report
image: alpine
dependencies:
- unit_test_job
- ui_test_job
- perf_test_job
script:
- echo "所有测试阶段已完成,生成聚合报告..."
only:
- merge_requests
- main
5.3 Jenkins 流水线等价方案
若团队使用 Jenkins,可通过 Pipeline DSL 实现相同逻辑:
pipeline {
agent any
stages {
stage('Build') {
steps {
sh 'hvigorw assembleRelease'
}
}
stage('Test') {
parallel {
stage('Unit') {
steps { sh 'hvigorw test --module entry --testPath ohosTest' }
}
stage('UI') {
steps { sh 'hvigorw uiTest --module entry' }
}
}
}
}
post {
always {
junit '**/report.xml'
publishHTML([
allowMissing: false,
alwaysLinkToLastBuild: true,
keepAll: true,
reportDir: 'perf-report',
reportFiles: 'index.html',
reportName: 'SmartPerf Report'
])
}
}
}
六、测试报告与质量门禁
6.1 自动化测试报告示例

上图展示了测试流水线执行后的聚合报告,包含单元测试通过率、UI 测试覆盖页面、性能指标趋势等关键信息。通过历史数据对比,可以直观发现回归问题。
6.2 质量门禁配置建议
在 Merge Request 合入前,建议设置以下硬性门禁:
| 门禁项 | 阈值 | 阻断合并 |
|---|---|---|
| 单元测试通过率 | >= 90% | 是 |
| 核心模块覆盖率 | >= 70% | 是 |
| UI 关键路径用例 | 100% 通过 | 是 |
| 首帧绘制时间 | <= 300ms | 是 |
| 丢帧率 | <= 5% | 否(警告) |
| 内存峰值 | <= 256MB | 否(警告) |
七、总结与最佳实践
本文从测试金字塔理论出发,完整演示了 HarmonyOS 7.0 的自动化测试体系搭建过程:
- 单元测试:使用 Hypium 框架编写 ArkTS 业务逻辑测试,掌握同步/异步/Mock 三种模式;
- UI 自动化:使用 UiTest 完成组件定位与操作,覆盖单设备与分布式流转场景;
- 性能压测:使用 SmartPerf 采集首帧、滑动、内存等关键指标,建立性能基线;
- CI/CD 流水线:基于 GitLab CI / Jenkins 实现提交即测试,设置质量门禁阻断劣化代码。
可直接落地的行动清单:
- 为新模块创建对应的
ohosTest目录,保持与被测代码的目录对称; - 核心业务函数必须配套单元测试,优先覆盖边界条件与异常分支;
- UI 自动化聚焦用户核心路径(登录 → 下单 → 支付),避免过度测试低频页面;
- 性能测试纳入每次 Release 构建,对比历史版本发现性能劣化;
- CI 流水线中设置清晰的阶段依赖,UI/性能测试使用专属设备标签避免资源争用;
- 定期回顾测试报告,清理无效/过期的测试用例,保持套件健康度。
测试不是开发的负担,而是持续交付的信心来源。在 HarmonyOS 生态高速迭代的今天,一套稳健的自动化测试体系,将是团队最值得信赖的质量护城河。
转载自:https://blog.csdn.net/u014727709/article/details/162935952
欢迎 👍点赞✍评论⭐收藏,欢迎指正
更多推荐



所有评论(0)