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

相关新闻

HarmonyOS应用《玄象》开发实战:Canvas 太极图算法:阴阳半圆 + 鱼眼小圆的数学推导

HarmonyOS应用《玄象》开发实战:Canvas 太极图算法:阴阳半圆 + 鱼眼小圆的数学推导

阅读时长:约 20 分钟 | 难度:★★★★★ | 篇章:第 2 篇 启动体验:Splash 与动画 对应源码:entry/src/main/ets/pages/SplashPage.ets 中的 drawTaiji 方法 前言 太极图是中华哲学的核心符号,“一阴一…

2026/10/25 17:34:33 阅读更多 →
多语言AI应用开发实战:从模型选型到部署优化

多语言AI应用开发实战:从模型选型到部署优化

1. 项目概述:为什么需要多语言AI应用? 在全球化数字产品的开发中,多语言支持早已不是加分项而是基础需求。去年我们团队为某跨境电商平台开发客服系统时,发现传统翻译API存在三个致命缺陷:上下文丢失导致语义扭曲、专业…

2026/10/24 21:37:22 阅读更多 →
国产化AI原生企业通讯系统SmartMsg的技术架构与实现

国产化AI原生企业通讯系统SmartMsg的技术架构与实现

1. 项目概述:当国产化遇上AI原生智信通SmartMsg的诞生源于两个关键趋势的碰撞:一方面,企业通讯工具国产化替代需求在近年呈现爆发式增长;另一方面,大模型技术正在重构所有软件的人机交互方式。这个项目本质上是在用全栈…

2026/10/25 9:22:25 阅读更多 →

最新新闻

Electron桌面应用开发实战:从环境搭建到打包发布全流程

Electron桌面应用开发实战:从环境搭建到打包发布全流程

做前端这些年,我大部分时间都在跟浏览器标签页打交道,直到第一次把桌面应用跑起来,才发现原来自己一直被限制在地址栏和刷新按钮围起来的框框里。Electron这个词,最开始是在某段时间频繁出现在同事的讨论里,一个用HTML…

2026/10/27 17:33:32 阅读更多 →
滑盖智能锁T109深度解析:结构原理、安装调试与故障排查

滑盖智能锁T109深度解析:结构原理、安装调试与故障排查

简介:亚太天能T109滑盖智能锁产品说明书是一份PDF格式的官方技术文档,主要面向智能锁安装人员、终端用户及售后维护者,帮助快速掌握产品安装、配置与常见故障处理。全包仅1个PDF文件,大小4.37MB,内容结构清晰&#xff…

2026/10/27 4:06:49 阅读更多 →
PMSM弱磁控制原理与Simulink建模:高速AGV驱动系统设计指南

PMSM弱磁控制原理与Simulink建模:高速AGV驱动系统设计指南

上个月我在调试一台高速AGV的驱动系统,整车要求空载跑到8m/s,电机转速已经拉到额定点,驱动器的输出电压也顶到了母线电压极限附近。再往上踩速度指令,转速纹丝不动,三相电流反而开始震荡。那会儿我的第一反应就是&…

2026/10/27 7:21:53 阅读更多 →
C++核心知识点:从内存管理到STL的实战指南

C++核心知识点:从内存管理到STL的实战指南

C 这门语言我前前后后折腾了十几年,用它写过嵌入式驱动、做过游戏服务端,也搭过基础组件库。每次看到新人一头扎进"C 核心知识点"这个搜索词,我其实挺感慨的——这门语言的难点从来不是语法多,而是知识点之间的耦合太深…

2026/10/27 18:20:50 阅读更多 →
T109滑盖智能锁怎么装?安装调试与故障排查全攻略

T109滑盖智能锁怎么装?安装调试与故障排查全攻略

简介:亚太天能T109滑盖智能锁产品说明书以PDF格式发布,适合智能锁用户、安装人员与售后维修人员阅读。内容围绕T109系列指纹密码刷卡锁展开,先介绍前面板、后面板、锁体、机械钥匙、电池盒盖等部件名称与功能,再给出完整安装步骤&…

2026/10/27 6:20:47 阅读更多 →
LLM知识降熵:从信息垄断到理解权下放

LLM知识降熵:从信息垄断到理解权下放

你有没有过这种经历:翻开源码注释、论文摘要或者一份专业报告,每个字都认识,连在一起却像天书。想找人聊聊,身边要么没人懂,要么懂的懒得跟你解释。后来我试着把同一段内容丢给一个大语言模型,几秒钟之后&a…

2026/10/27 4:06:50 阅读更多 →

日新闻

周新闻

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/27 13:55:19 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/27 7:21:50 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/27 19:19:37 阅读更多 →