跳至主要内容

如何运行和编写测试

运行测试

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

JavaScript 测试

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

yarn test

这将使用 Jest 运行测试。

您还应该确保您的代码通过了 Flow 和 lint 测试

yarn flow
yarn lint

iOS 测试

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

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

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

./scripts/objc-test.sh test

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

Xcode 还允许通过其测试导航器运行单个测试。您也可以使用 Command + 6 快捷键。

注意

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

编写测试

无论何时修复错误或向 React Native 添加新功能,最好添加一个涵盖它的测试。根据您正在进行的更改,可能有不同的测试类型适用。

JavaScript 测试

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

iOS 集成测试

React Native 提供了一些工具,可以更轻松地测试需要本地和 JS 组件跨桥通信的集成组件。

两个主要组件是 RCTTestRunnerRCTTestModuleRCTTestRunner 设置 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 以了解基本示例。

如果您进行的更改影响了拉取请求中的快照测试,例如向其中一个已进行快照的示例中添加新的示例用例,则需要重新记录快照参考图像。

为此,请将 recordMode 标志更改为 _runner.recordMode = YES;RNTester/RNTesterSnapshotTests.m 中,重新运行失败的测试,然后将记录翻转回 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 的值。