HarmonyOS应用《玄象》开发实战:.ohpm 依赖管理:@ohos/hypium 与 @ohos/hamock 测试体系

发布时间:2026/7/26 22:02:40
HarmonyOS应用《玄象》开发实战:.ohpm 依赖管理:@ohos/hypium 与 @ohos/hamock 测试体系 阅读时长约 18 分钟 | 难度★★★☆☆ | 篇章第 1 篇 · 项目架构与设计哲学对应源码xuanxiang_ohos_app/oh-package.json5、entry/oh-package.json5、entry/src/ohosTest/、entry/src/test/前言在大型 HarmonyOS 应用中依赖管理与测试体系是工程化质量的两块基石。玄象项目通过 OpenHarmony Package Manager.ohpm管理三方库依赖并通过ohos/hypium单元测试框架与ohos/hamockMock 框架构建完整的测试体系。本篇将深入剖析玄象项目的 .ohpm 依赖配置与测试体系搭建方式让您掌握在 HarmonyOS 项目中实施工业级测试驱动开发的路径。提示玄象项目的命理算法八字排盘、神煞查法、历法算法农历转换、节气计算涉及大量复杂逻辑单元测试是保证算法正确性的必备手段。一、.ohpm 依赖管理体系1.1 .ohpm 概述OpenHarmony Package Manager简称 .ohpm是 HarmonyOS 的官方包管理工具类似 npm 之于 Node.js。工具用途ohpm包管理命令行工具oh-package.json5包描述文件类似 package.jsonoh-package-lock.json5锁定文件类似 package-lock.jsonoh_modules/依赖安装目录类似 node_modules1.2 玄象项目 oh-package.json5 全貌工程级oh-package.json5{ modelVersion: 6.0.2, description: Please describe the basic information., dependencies: { }, devDependencies: { ohos/hypium: 1.0.25, ohos/hamock: 1.0.0 } }模块级entry/oh-package.json5{ name: entry, version: 1.0.0, description: Please describe the basic information., main: , author: , license: , dependencies: {} }1.3 字段解析工程级oh-package.json5字段字段含义玄象项目值modelVersion配置模型版本6.0.2description工程描述默认占位dependencies运行时依赖空devDependencies开发时依赖hypium hamock模块级entry/oh-package.json5字段字段含义玄象项目值name模块名entryversion模块版本1.0.0main入口文件空默认dependencies模块级依赖空1.4 依赖版本规范玄象项目使用精确版本号ohos/hypium: 1.0.25, ohos/hamock: 1.0.0而非范围版本如^1.0.25原因可复现构建精确版本确保不同时间构建产物一致。避免隐式升级范围版本可能引入不兼容的新版本。锁定文件保障oh-package-lock.json5已锁定传递依赖。提示玄象项目若引入更多三方库如ohos/net-http网络请求库应同样使用精确版本号。二、ohos/hypium 单元测试框架2.1 hypium 简介ohos/hypium是 HarmonyOS 官方单元测试框架特性包括BDD 风格 APIdescribe/it/expect异步测试支持async函数测试断言库丰富的expect断言方法Mock 集成与ohos/hamock无缝协作2.2 玄象项目测试目录结构entry/src/ ├── main/ # 主代码 ├── ohosTest/ # 仪器化测试在设备上运行 │ ├── ets/ │ │ └── test/ │ │ ├── Ability.test.ets │ │ └── List.test.ets │ └── module.json5 └── test/ # 单元测试在本地 JVM 运行 ├── List.test.ets └── LocalUnit.test.ets2.3 Ability.test.ets 示例import{describe,it,expect}fromohos/hypium;import{UIAbility}fromkit.AbilityKit;exportdefaultfunctionabilityTest(){describe(AbilityTest,(){it(assertContain,0,(){constaabc;constbb;expect(a).assertContain(b);});it(assertEqual,0,(){consta1;constb1;expect(a).assertEqual(b);});});}2.4 List.test.ets 测试入口importabilityTestfrom./Ability.test;exportdefaultfunctiontestsuite(){abilityTest();}2.5 hypium 核心 APIdescribe测试套件describe(MansionDataTest,(){// 测试用例});it测试用例it(should return 28 mansions,0,(){constcountMansionData.getTotalCount();expect(count).assertEqual(28);});第二个参数0是测试用例的过滤参数0表示不过滤。expect断言hypium 提供丰富的断言方法断言方法含义assertEqual(value)严格相等assertTrue()为 trueassertFalse()为 falseassertNull()为 nullassertUndefined()为 undefinedassertContain(value)包含子串assertInstanceOf(type)类型实例assertLarger(value)大于assertLess(value)小于2.6 异步测试it(async test,0,async(){constresultawaitsomeAsyncFunction();expect(result).assertEqual(expected);});2.7 beforeAll / beforeEach 钩子describe(MansionDataTest,(){letdata:MansionData;beforeAll((){// 套件开始前执行一次datanewMansionData();});beforeEach((){// 每个用例前执行data.reset();});it(test1,0,(){// ...});});三、ohos/hamock Mock 框架3.1 hamock 简介ohos/hamock是 HarmonyOS 官方 Mock 框架用于在单元测试中模拟依赖Mock 类替换被测对象的依赖Stub 方法模拟方法返回值Spy 方法监听方法调用3.2 hamock 基本 Mockimport{Mock,MockKit,when}fromohos/hamock;MockclassMockLunarCalendar{getTodayHeavenlyStems():string{return甲子;}}3.3 when-thenReturn 模式constmockDatamock(LunarCalendar);when(mockData.getTodayHeavenlyStems()).thenReturn(甲子);// 在被测对象中使用 mockDataconstresultmockData.getTodayHeavenlyStems();expect(result).assertEqual(甲子);3.4 verify 验证调用constmockDatamock(LunarCalendar);// ... 调用 mockData 的方法verify(mockData,getTodayHeavenlyStems).called(1);3.5 Spy 监听constspyspy(LunarCalendar,getTodayHeavenlyStems);// ... 触发调用verify(spy,1).called();四、玄象项目测试实战4.1 历法算法测试玄象项目的LunarCalendar.ets包含农历转换、节气计算等核心算法应有完整的单元测试覆盖import{describe,it,expect}fromohos/hypium;import{LunarCalendar}from../../../../main/ets/common/utils/LunarCalendar;exportdefaultfunctionlunarCalendarTest(){describe(LunarCalendarTest,(){// 测试农历转公历it(lunarToSolar_2024_chineseNewYear,0,(){constsolarLunarCalendar.lunarToSolar(2024,1,1);expect(solar.year).assertEqual(2024);expect(solar.month).assertEqual(2);expect(solar.day).assertEqual(10);});// 测试二十四节气it(getSolarTerm_2024_lichun,0,(){constlichunLunarCalendar.getSolarTerm(2024,立春);expect(lichun.month).assertEqual(2);expect(lichun.day).assertEqual(4);});// 测试干支计算it(getHeavenlyStems_2024_jiaChen,0,(){constganzhiLunarCalendar.getYearGanZhi(2024);expect(ganzhi).assertEqual(甲辰);});});}4.2 八字命理测试玄象项目的命理算法应有独立的测试套件describe(MingliAlgorithmTest,(){it(should calculate correct day master,0,(){constbazinewBazi(1990,5,15,10,30);constdayMasterbazi.getDayMaster();expect(dayMaster).assertEqual(庚);});it(should calculate correct ten gods,0,(){consttenGodsMingliAnalyzer.calculateTenGods(甲,丙);expect(tenGods).assertEqual(食神);});it(should find Tianyi nobleman correctly,0,(){constnoblemanShenShaFinder.findTianyiNobleman(甲);expect(nobleman).assertContain(丑);expect(nobleman).assertContain(未);});});4.3 卦象起卦测试describe(HexagramDivinationTest,(){it(should produce valid hexagram from coins,0,(){constcoins[3,3,2];// 三次铜钱正反面constyaoHexagramDivination.castYao(coins);expect(yao).assertContain(阴);// 2338少阴});it(should calculate changing lines correctly,0,(){constoriginal[1,1,1,0,0,0];// 上乾下坤constchangedHexagramDivination.calculateChanged(original);expect(changed.length).assertEqual(6);});});4.4 Mock 网络请求测试玄象项目的 AI 取名功能依赖网络请求应通过 Mock 测试import{Mock,when}fromohos/hamock;MockclassMockHttpClient{post(url:string,data:object):Promiseresponse{returnPromise.resolve({code:200,data:{names:[玄道]}});}}describe(AiNamingServiceTest,(){it(should return name suggestions,0,async(){constmockClientnewMockHttpClient();constservicenewAiNamingService(mockClient);constresultawaitservice.suggestNames(1990-05-15,male);expect(result.names[0]).assertEqual(玄道);});});五、玄象项目测试覆盖规划5.1 测试覆盖目标模块覆盖率目标关键测试点LunarCalendar≥ 95%农历/公历转换、节气计算、干支推算MansionData≥ 90%二十八宿数据完整性、星野分野HexagramData≥ 95%六十四卦数据、纳甲、世应HeavenlyStems≥ 95%天干地支、五行归属、六十甲子SolarTerms≥ 90%节气时刻表、节令计算AiNamingService≥ 80%Mock 网络请求、五格剖象算法5.2 测试分层策略玄象项目采用三层测试金字塔E2E 测试设备端真实测试 ↑ 集成测试模块间协作测试 ↑ 单元测试算法/逻辑测试5.3 测试运行方式# 运行所有单元测试hvigorwtest--modemodule-pmoduleentrydefault# 运行仪器化测试需连接设备hvigorw ohosTest--modemodule-pmoduleentrydefault六、玄象项目测试目录规划6.1 完整测试目录结构entry/src/ ├── test/ # 单元测试本地运行 │ ├── utils/ │ │ ├── LunarCalendar.test.ets │ │ ├── MansionData.test.ets │ │ ├── HexagramData.test.ets │ │ └── HeavenlyStems.test.ets │ └── services/ │ ├── AiNamingService.test.ets │ └── DivinationService.test.ets └── ohosTest/ # 仪器化测试设备运行 └── ets/test/ ├── Ability.test.ets # Ability 生命周期测试 ├── pages/ │ ├── HomePage.test.ets │ └── MansionListPage.test.ets └── ui/ # UI 交互测试 └── FeatureGrid.test.ets6.2 测试文件命名规范玄象项目测试文件命名规范测试文件被测类名.test.ets如LunarCalendar.test.ets测试套件被测类名Test如LunarCalendarTest测试用例should_期望行为_when_前置条件如should_return_28_mansions提示规范的命名让测试结果可读性更高便于排查失败用例。七、持续集成中的测试7.1 CI 流水线集成玄象项目的 CI 流水线应包含测试环节# .github/workflows/ci.yml (示意)jobs:test:steps:-uses:actions/checkoutv3-name:Setup HarmonyOS SDKrun:|# 安装 HarmonyOS SDK-name:Install Dependenciesrun:ohpm install-name:Run Unit Testsrun:hvigorw test--mode module-p moduleentrydefault-name:Run Lintrun:hvigorw codeLinter--mode module-p moduleentrydefault7.2 测试覆盖率报告# 生成覆盖率报告hvigorwtest--coverage--modemodule-pmoduleentrydefault生成的 HTML 覆盖率报告位于build/reports/coverage/。总结本篇以玄象项目oh-package.json5配置与测试目录结构为蓝本系统剖析了 HarmonyOS 应用的 .ohpm 依赖管理与测试体系从依赖版本规范、ohos/hypium单元测试 API、ohos/hamockMock 框架到玄象项目历法算法、命理算法、卦象起卦的测试实战再到测试覆盖规划、CI 集成方案。掌握这套测试驱动开发体系是构建高质量 HarmonyOS 应用的核心能力。下一篇《10 · 项目目录约定common/components/constants/utils/pages 六层架构》将带您深入玄象项目的分层架构设计。如果这篇文章对你有帮助欢迎点赞、收藏⭐、关注你的支持是我持续创作的动力相关资源HarmonyOS 官方文档ohpm 包管理HarmonyOS 官方文档ohos/hypium 单元测试HarmonyOS 官方文档ohos/hamock Mock 框架HarmonyOS 官方文档自动化测试框架使用指南开源鸿蒙跨平台社区https://openharmonycrossplatform.csdn.net