在这里插入图片描述

每日一句正能量

生活中的许多烦恼都源于盲目和别人攀比。
攀比的本质,是用别人的尺子量自己的生活。你看到的多是他人光鲜的“高光时刻”,却拿它对比自己琐碎的日常。切断这种无意义的比较,烦恼会减少大半。

摘要

摘要: 高质量的自动化测试是保障 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.0SmartPerf 性能基准工具链 的深度整合,使得"开发即测试、提交即验证"成为可能。


二、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(...) 为基本断言,另有 assertTrueassertThrowErrorassertUndefined 等丰富断言方法。

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 的自动化测试体系搭建过程:

  1. 单元测试:使用 Hypium 框架编写 ArkTS 业务逻辑测试,掌握同步/异步/Mock 三种模式;
  2. UI 自动化:使用 UiTest 完成组件定位与操作,覆盖单设备与分布式流转场景;
  3. 性能压测:使用 SmartPerf 采集首帧、滑动、内存等关键指标,建立性能基线;
  4. CI/CD 流水线:基于 GitLab CI / Jenkins 实现提交即测试,设置质量门禁阻断劣化代码。

可直接落地的行动清单:

  • 为新模块创建对应的 ohosTest 目录,保持与被测代码的目录对称;
  • 核心业务函数必须配套单元测试,优先覆盖边界条件与异常分支;
  • UI 自动化聚焦用户核心路径(登录 → 下单 → 支付),避免过度测试低频页面;
  • 性能测试纳入每次 Release 构建,对比历史版本发现性能劣化;
  • CI 流水线中设置清晰的阶段依赖,UI/性能测试使用专属设备标签避免资源争用;
  • 定期回顾测试报告,清理无效/过期的测试用例,保持套件健康度。

测试不是开发的负担,而是持续交付的信心来源。在 HarmonyOS 生态高速迭代的今天,一套稳健的自动化测试体系,将是团队最值得信赖的质量护城河。


转载自:https://blog.csdn.net/u014727709/article/details/162935952
欢迎 👍点赞✍评论⭐收藏,欢迎指正

Logo

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

更多推荐