跳到主要内容

如何运行和编写测试

运行测试

本节介绍作为贡献者如何测试你对 React Native 所做的更改。如果你还没有,请按照步骤设置你的开发环境,以使用原生代码构建项目

JavaScript 测试

运行 JavaScript 测试套件最简单的方法是在你的 React Native 检出根目录中使用以下命令

bash
yarn test

这将使用 Jest 运行测试。

你还应该确保你的代码通过 Flow 和 Lint 测试。

bash
yarn flow
yarn lint

iOS 测试

请遵循 packages/rn-tester 目录中的 README.md 指令。

然后,回到 React Native 检出的根目录并运行 yarn。这将设置你的 JavaScript 依赖项。

此时,你可以通过从 React Native 检出的根目录调用以下脚本来运行 iOS 测试

bash
./scripts/objc-test.sh test

你也可以使用 Xcode 运行 iOS 测试。打开 RNTester/RNTesterPods.xcworkspace 并通过按 Command + U 或从菜单栏中选择 Product 然后 Test 来本地运行测试。

Xcode 还允许通过其 Test Navigator 运行单个测试。你也可以使用 Command + 6 快捷方式。

注意

objc-test.sh 确保你的测试环境已设置为运行所有测试。它还禁用了已知不稳定或损坏的测试。在使用 Xcode 运行测试时请记住这一点。如果你看到意外的失败,请首先查看它是否在 objc-test.sh 中被禁用。

iOS Podfile/Ruby 测试

如果你正在修改 Podfile 配置,那么有一些 Ruby 测试可以验证这些配置。

运行 Ruby 测试

bash
cd scripts
sh run_ruby_tests.sh

Android 测试

Android 单元测试不会在模拟器中运行,但它们会在你本地机器上的 JVM 上运行。

要运行 Android 单元测试,请从你的 React Native 检出根目录调用以下脚本

bash
./gradlew test

编写测试

每当你修复错误或向 React Native 添加新功能时,最好添加一个覆盖它的测试。根据你所做的更改,可能有不同类型的测试是合适的。

JavaScript 测试

JavaScript 测试可以在 __test__ 目录中找到,与被测试的文件并置。请参阅 TouchableHighlight-test.js 以获取一个基本示例。你还可以按照 Jest 的 测试 React Native 应用程序 教程了解更多信息。

iOS 集成测试

React Native 提供了方便的工具,可以更轻松地测试需要原生和 JS 组件之间通过桥接通信的集成组件。

两个主要组件是 RCTTestRunnerRCTTestModuleRCTTestRunner 设置 React Native 环境并提供将测试作为 Xcode 中的 XCTestCase 运行的功能 (runTest:module 是最简单的方法)。RCTTestModule 作为 NativeModules.TestModule 导出到 JavaScript。

测试本身是用 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 界面的单元测试)。

这些测试在每次提交到 Facebook 源代码管理中托管的 React Native 副本时都会运行。它们在拉取请求导入到 Facebook 源代码管理时也会运行。

如果其中一个测试失败,你需要 Meta 的人查看。由于拉取请求只能由 Meta 员工导入,因此导入拉取请求的人应该能够提供任何详细信息。

注意

在本地运行 CI 测试: 大多数开源协作者都依赖 CircleCI 来查看这些测试的结果。如果你宁愿使用与 CircleCI 相同的配置在本地验证你的更改,CircleCI 提供了一个命令行界面,能够本地运行作业。

常见问题

如何升级 CI 测试中使用的 Xcode 版本?

升级到新版本的 Xcode 时,首先确保它受 CircleCI 支持

你还需要更新测试环境配置,以确保测试在 CircleCI 机器中安装的 iOS 模拟器上运行。

这也可以在 CircleCI 的 Xcode 版本参考 中通过点击所需版本并查看“运行时”下找到。

然后你可以编辑这两个文件

  • .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 的值。