Uniswap Wallet测试体系:Jest单元测试与Detox E2E自动化测试完整指南 Uniswap Wallet测试体系Jest单元测试与Detox E2E自动化测试完整指南【免费下载链接】walletUniswap Wallet is the simplest, safest, and most powerful self-custodial crypto wallet. It is developed by the Uniswap Labs team, inventors of the Uniswap Protocol.项目地址: https://gitcode.com/gh_mirrors/wall/walletUniswap Wallet 是 Uniswap Labs 团队开发的自托管加密货币钱包基于 React Native 构建。它的移动端 App 建立了一套双层测试体系用Jest 单元测试含快照测试保障每个组件与逻辑的正确性用Detox E2E 自动化测试在真实模拟器上完整跑通「创建钱包 → 交换代币」等用户核心流程。本文带你完整理解这套测试体系的架构、运行方式与实用技巧即使你是测试新手也能快速上手。 测试体系全景为什么需要双层测试加密货币钱包涉及资产管理与交易执行任何缺陷都可能造成真实资金损失因此质量保障格外严格。这个项目采用经典的「测试金字塔」思路测试层级工具运行环境速度验证目标单元测试 / 快照测试Jest react-test-rendererNode 环境秒级⚡ 极快组件渲染、纯函数逻辑、状态管理E2E 端到端测试Detox Hardhat真实 iOS 模拟器分钟级 较慢完整用户流程、真实交易上链单元测试散布在移动端源码apps/mobile/src/与共享包packages/wallet/、packages/utilities/中文件名以.test.ts(x)结尾。E2E 测试集中在 e2e 目录文件名以.e2e.js结尾与单元测试在目录上完全隔离。⚡ Jest 单元测试秒级反馈的第一道防线一键运行单元测试在移动端目录apps/mobile/下执行测试脚本即可yarn test # 等价于 jest --forceExit yarn snapshots # 等价于 jest -u用于更新快照文件脚本定义见 package.json。测试框架基于jest-expo预设天然适配 React Native 生态。值得学习的 3 个配置细节核心配置在 jest.config.js其中有三处对大型项目非常实用预设复用公共配置抽取到 config/jest-presets/ 目录移动端、共享包统一继承避免各包重复维护。覆盖率红线coverageThreshold设定全局行覆盖率不低于 21.5%并在 CI 中开启collectCoverage防止覆盖率进一步退化——这是一种「先保底线、再逐步提升」的务实策略。原生模块自动 Mock__mocks__/目录apps/mobile/mocks/预先为 Firebase、MaskedView、Skia 等原生依赖提供了假实现测试无需关心原生桥接专注验证业务逻辑。此外配置还通过moduleNameMapper将 Tamagui UI 库映射到native-test测试包让依赖复杂 UI 组件的测试也能在 Node 环境直接运行。 Detox E2E 自动化测试像真实用户一样操作 App三步跑通 E2E 测试E2E 测试依赖一个本地区块链Hardhat 分叉主网数据来模拟真实链上环境。运行前需先关闭 Metro 和模拟器中的 App然后yarn test:e2e:build # 构建 E2E 专用包并启动 Metro yarn hardhat # 启动本地区块链节点fork 主网 yarn test:e2e:run # 在 headless 模拟器上执行全部 E2E 测试三条脚本定义于 package.json注意它们都带RN_SRC_EXTe2e.js环境变量——这是该项目的E2E Mock 机制Metro 打包器会自动用同名的xxx.e2e.js文件替换原文件让测试环境替换掉时间、网络等难以控制的外部依赖。运行过程是 headless 的想亲眼观看测试操作打开 macOS 的Simulator.app即可实时看到 App 被「自动点击」。也可以只跑单个用例yarn test:e2e:run e2e/Swap.e2e.js用例设计「用例函数」的可复用模式E2E 目录结构清晰是新手值得抄作业的组织方式apps/mobile/e2e/ ├── *.e2e.js # 测试入口负责安装、启动 App ├── usecases/ # 可复用的操作流程Create、Swap、ImportAccounts └── utils/ # 权限 fixture、快捷引导函数以 Onboarding.e2e.js 为例入口文件只做两件事通过device.launchApp({ delete: true, permissions })全新安装并预授权权限然后执行Create用例函数。而 usecases/Create.js 才包含真实断言——输入钱包名、选择备份方式、查看助记词、开启 Face ID最终断言首页出现了正确的地址显示。另一个亮点是utils.js中的quickOnboarding()它封装了「导入已有助记词」的快捷引导流程让 Swap 等后续测试跳过冗长的创建步骤直接进入业务验证。Swap E2E一条完整交易链的验证usecases/Swap.js 验证了最核心的资金操作先断言切换 USD 计价后输入框金额保留正确再完整执行「确认交换 → 交易 → Face ID 生物识别device.matchFace()→ 完成」的全链路。因为背后是 Hardhat 本地链整条交易真实上链、真实校验但又不消耗任何真实代币——这正是 E2E 测试与生产环境「尽可能接近、又安全可控」的平衡点。Mock 与排错小技巧Mock 规则Detox 只支持整文件 Mock。把utils.ts想 Mock 的行为写成utils.e2e.js即可详见官方说明 e2e/README.md。排错利器遇到「Element not visible」时用 Detox 的Debug View Hierarchy可视化 App 当前视图树一眼定位元素 id 是否正确。超时配置e2e/config.json 将单条测试超时设为 4 分钟testTimeout: 240000并限定maxWorkers: 1——E2E 依赖单台模拟器单线程串行运行更稳定。 新手上手建议Best Practices先单测、后 E2E本地开发时用yarn test获得秒级反馈只在提交前或 CI 中跑 E2E。E2E 用例保持「端到端」语义验证完整用户价值如一笔交换成交而不是重复单测已覆盖的细枝末节。用 id 而非文本定位元素测试统一使用element(by.id(...))元素 id 常量集中在src/features/telemetry/constants中避免文案改动含 i18n 多语言导致测试崩坏。善用预设与 fixture新增共享包测试时直接复用config/jest-presets/E2E 中把重复引导流程抽成quickOnboarding()这类函数。失败先看视图树E2E 挂掉先上 Debug View Hierarchy再考虑是否要加sleep或调整权限 fixture。总结Uniswap Wallet 用Jest 单元测试守住代码层的每一处细节复用预设、覆盖率红线、原生模块 Mock用Detox E2E 测试在真实模拟器 本地区块链上验证创建钱包、代币交换等资金关键路径。两层测试分工明确、互不重叠既保证了开发反馈速度又守住了「资金安全」这条底线——这套体系对任何 React Native 加密项目都有很强的参考价值。【免费下载链接】walletUniswap Wallet is the simplest, safest, and most powerful self-custodial crypto wallet. It is developed by the Uniswap Labs team, inventors of the Uniswap Protocol.项目地址: https://gitcode.com/gh_mirrors/wall/wallet创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考