如何运行和编写测试
运行测试
本节内容是关于作为贡献者测试您对 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 作为 NativeModules.TestModule 导出到 JavaScript。
测试本身用 JS 编写,并且必须在完成后调用 TestModule.markTestCompleted(),否则测试将超时并失败。
测试失败主要通过抛出 JS 异常来指示。也可以使用 runTest:module:initialProps:expectErrorRegex: 或 runTest:module:initialProps:expectErrorBlock: 测试错误条件,这些方法将期望抛出错误并验证错误是否与提供的标准匹配。
请参阅以下示例用法和集成点
iOS 快照测试
一种常见的集成测试类型是快照测试。这些测试渲染一个组件,并使用 FBSnapshotTestCase 库在幕后使用 TestModule.verifySnapshot() 验证屏幕快照与参考图像。通过在 RCTTestRunner 上设置 recordMode = YES,然后运行测试来记录参考图像。
快照在 32 位和 64 位以及各种操作系统版本之间会略有不同,因此建议您强制使用正确配置运行测试。
强烈建议模拟所有网络数据,以及其他可能存在问题的依赖项。请参阅 SimpleSnapshotTest 以获取一个基本示例。
如果您在拉取请求中进行更改,影响到快照测试,例如向某个被快照的示例添加新的示例用例,您将需要重新记录快照参考图像。
为此,请在 RNTester/RNTesterSnapshotTests.m 中将 recordMode 标志更改为 _runner.recordMode = YES;,重新运行失败的测试,然后将 record 切换回 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 版本参考中找到,通过点击所需版本并在 Runtimes 下查看。
然后您可以编辑这两个文件
-
.circleci/config.yml编辑
macos:下的xcode:行(搜索_XCODE_VERSION)。 -
scripts/.tests.env编辑
IOS_TARGET_OS环境变量以匹配所需的 iOS 运行时。
如果您打算在 GitHub 上合并此更改,请务必通知 Meta 员工,因为他们需要更新在导入您的拉取请求时在内部 Sandcastle RN OSS iOS 测试 react_native_oss.py 中使用的 _XCODE_VERSION 值。