如何运行与编写测试
本页面由 PageTurner AI 翻译(测试版)。未经项目官方认可。 发现错误? 报告问题 →
运行测试
本节介绍如何测试您对 React Native 的贡献修改。如果您尚未完成开发环境配置,请先完成使用原生代码构建项目的环境搭建步骤。
JavaScript 测试
运行 JavaScript 测试套件最简单的方式是在 React Native 仓库根目录执行以下命令:
yarn test
该命令使用 Jest 运行测试。
您还应确保代码通过 Flow 和代码规范检查:
yarn flow
yarn lint
iOS 测试
请遵循 packages/rn-tester 目录中的 README.md 说明进行操作。
然后返回 React Native 仓库根目录并运行 yarn,这将安装 JavaScript 依赖项。
此时您可以通过在仓库根目录执行以下脚本来运行 iOS 测试:
./scripts/objc-test.sh test
You can also use Xcode to run iOS tests. Open RNTester/RNTesterPods.xcworkspace and run tests locally by pressing Command + U or selecting Product then Test from the menubar.
Xcode also allows running individual tests through its Test Navigator. You can also use Command + 6 shortcut.
objc-test.sh 会确保测试环境配置正确以运行所有测试,同时禁用已知不稳定或损坏的测试用例。使用 Xcode 运行测试时请留意此机制。若遇到意外失败情况,请先检查该测试是否已在 objc-test.sh 中被禁用。
iOS Podfile/Ruby 测试
若您修改了 Podfile 配置,可使用 Ruby 测试脚本进行验证:
运行 Ruby 测试:
cd scripts
sh run_ruby_tests.sh
Android 测试
Android 单元测试无需在模拟器中运行,可直接在您本地机器的 JVM 上执行。
运行 Android 单元测试时,请在 React Native 仓库根目录执行以下脚本:
./gradlew test
编写测试
当您修复 bug 或为 React Native 添加新功能时,建议编写相应的测试用例进行覆盖。根据您所做的修改类型,可能需要选择不同形式的测试方案。
JavaScript 测试
JavaScript 测试文件位于 __test__ 目录中,与被测试文件保持同级位置。参考 TouchableHighlight-test.js 查看基础示例,或通过 Jest 的 测试 React Native 应用 教程了解更多信息。
iOS 集成测试
React Native 提供了专用工具,用于简化需要原生模块与 JS 组件跨桥通信的集成测试。
两个核心组件是 RCTTestRunner 和 RCTTestModule。RCTTestRunner 负责配置 React Native 环境,并提供在 Xcode 中以 XCTestCase 形式运行测试的能力(其中 runTest:module 是最简调用方式)。RCTTestModule 在 JavaScript 端通过 NativeModules.TestModule 访问。
测试用例本身用 JS 编写,必须在结束时调用 TestModule.markTestCompleted(),否则测试将因超时而失败。
测试失败主要通过抛出 JS 异常来标识。您也可使用 runTest:module:initialProps:expectErrorRegex: 或 runTest:module:initialProps:expectErrorBlock: 来测试错误场景,这些方法会验证抛出的错误是否符合预期条件。
参考以下示例了解具体用法和集成方式:
iOS 快照测试
快照测试是一种常见的集成测试类型。这类测试会渲染一个组件,并使用 TestModule.verifySnapshot() 将屏幕快照与参考图像进行比对,其底层使用了 FBSnapshotTestCase 库。参考图像的生成方式是在 RCTTestRunner 上设置 recordMode = YES 后运行测试。
32位和64位系统以及不同操作系统版本的快照会略有差异,因此建议强制测试在正确的配置下运行。
强烈建议将所有网络数据以及其他可能引起问题的依赖项进行模拟。可参考 SimpleSnapshotTest 查看基础示例。
如果您在拉取请求中进行的修改影响了快照测试(例如为某个快照示例添加新用例),则需要重新录制快照参考图像。
操作步骤:在 RNTester/RNTesterSnapshotTests.m 中将 recordMode 标志改为 _runner.recordMode = YES;,重新运行失败的测试,然后将记录模式切换回 NO,最后提交/更新拉取请求并等待 CircleCI 构建是否通过。
Android 单元测试
当您处理可通过 Java/Kotlin 代码单独测试的代码时,最好添加 Android 单元测试。Android 单元测试位于 packages/react-native/ReactAndroid/src/test/ 目录下。
建议浏览这些测试以了解良好单元测试的编写方式。
持续测试
我们使用 CircleCI 自动运行开源测试。每当拉取请求中新增提交时,CircleCI 都会运行这些测试,帮助维护者判断代码变更是否引入了回归问题。这些测试也会在提交到 main 和 *-stable 分支时运行,以监控这些分支的健康状况。
还有另一组测试在 Meta 的内部测试基础设施中运行。部分测试由 React Native 的内部使用者定义(例如 Facebook 应用中 React Native 界面的单元测试)。
这些测试会在每次提交到 Meta 源代码控制系统托管的 React Native 副本时运行。当拉取请求导入到 Meta 的源代码控制系统时也会触发运行。
如果其中某项测试失败,您需要 Meta 内部人员协助排查。由于只有 Meta 员工才能导入拉取请求,导入该请求的人员应能协助处理相关事宜。
本地运行 CI 测试: 大多数开源协作者依赖 CircleCI 查看这些测试结果。若您希望使用与 CircleCI 相同的配置在本地验证变更,CircleCI 提供了命令行界面,支持在本地运行任务。
常见问题解答
如何升级 CI 测试中使用的 Xcode 版本?
升级到新版 Xcode 时,请首先确认其已被 CircleCI 支持。
你还需要更新测试环境配置,确保测试能在 CircleCI 机器上预装的 iOS 模拟器中运行。
这也可以在 CircleCI 的 Xcode 版本参考文档中找到,点击所需版本后查看 Runtimes 部分即可。
然后你可以编辑以下两个文件:
-
.circleci/config.yml编辑
macos:下的xcode:行(搜索_XCODE_VERSION)。 -
scripts/.tests.env编辑
IOS_TARGET_OS环境变量,使其匹配所需的 iOS 运行时版本。
如果你计划在 GitHub 上合并此更改,请确保通知 Meta 员工,因为他们在导入你的拉取请求时,需要更新 react_native_oss.py 中内部 Sandcastle RN OSS iOS 测试使用的 _XCODE_VERSION 值。