如何运行和编写测试
运行测试
本节介绍作为贡献者如何测试您对 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 组件跨桥通信的集成组件。
两个主要组件是 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
以了解基本示例。
如果您进行的更改影响了拉取请求中的快照测试,例如向其中一个已进行快照的示例中添加新的示例用例,则需要重新记录快照参考图像。
为此,请将 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
的值。