如何运行和编写测试
运行测试
本节介绍作为贡献者如何测试你对 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 还允许通过其 Test Navigator 运行单个测试。你也可以使用 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
作为 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
的值。