如何运行和编写测试
运行测试
本节介绍作为贡献者如何测试你对 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
。
如果你在 pull request 中进行了影响快照测试的更改,例如向被快照的示例之一添加了新的示例用例,则需要重新记录快照参考图像。
为此,请在 RNTester/RNTesterSnapshotTests.m 中将 recordMode
标志更改为 _runner.recordMode = YES;
,重新运行失败的测试,然后将 record 翻转回 NO
并提交/更新你的 pull request,然后等待查看 CircleCI 构建是否通过。
Android 单元测试
每当你处理可以通过 Java/Kotlin 代码单独测试的代码时,最好添加一个 Android 单元测试。Android 单元测试位于 packages/react-native/ReactAndroid/src/test/
中。
我们建议浏览这些测试,以了解好的单元测试可能是什么样子。
持续测试
我们使用 CircleCI 自动运行我们的开源测试。每当向 pull request 添加提交时,CircleCI 都会运行这些测试,以此帮助维护人员了解代码更改是否引入了回归。测试还在提交到 main
和 *-stable
分支时运行,以便跟踪这些分支的健康状况。
还有另一组测试在 Meta 的内部测试基础设施中运行。其中一些测试是由 React Native 的内部使用者定义的集成测试(例如,Facebook 应用程序中 React Native 表面的单元测试)。
这些测试在每次提交到 Facebook 源代码控制上托管的 React Native 副本时都会运行。当 pull request 导入到 Facebook 的源代码控制时,它们也会运行。
如果其中一项测试失败,你需要 Meta 的某个人来查看。由于 pull request 只能由 Meta 员工导入,因此导入 pull request 的人应该能够提供任何详细信息。
在本地运行 CI 测试: 大多数开源合作者依靠 CircleCI 来查看这些测试的结果。如果你更愿意使用与 CircleCI 相同的配置在本地验证你的更改,则 CircleCI 提供了一个命令行界面,能够本地运行作业。
F.A.Q.
如何升级 CI 测试中使用的 Xcode 版本?
当升级到新版本的 Xcode 时,首先要确保它受 CircleCI 支持。
你还需要更新测试环境配置,以确保测试在 CircleCI 计算机中安装的 iOS 模拟器上运行。
这也可以在 CircleCI 的 Xcode 版本参考中找到,方法是单击所需的版本并在“运行时”下查找。
然后你可以编辑这两个文件
-
.circleci/config.yml
编辑
macos:
下的xcode:
行(搜索_XCODE_VERSION
)。 -
scripts/.tests.env
编辑
IOS_TARGET_OS
环境变量以匹配所需的 iOS 运行时。
如果你打算在 GitHub 上合并此更改,请务必通知 Meta 员工,因为当他们导入你的 pull request 时,他们需要更新内部 Sandcastle RN OSS iOS 测试中 react_native_oss.py
中使用的 _XCODE_VERSION
的值。