Testing your Changes
Testing your Changes
本文档是关于测试您对React Native作出贡献的更改。如果您有兴趣测试React Native应用程序,请查看Jest网站上的React Native Tutorial。
React Native repo有几个可以运行的测试来验证你没有对你的PR进行回归。这些测试与Travis和Circle持续集成系统一起运行,该系统将自动注释带请求的测试结果。
无论您何时修复错误或向React Native添加新功能,都应该添加一个覆盖它的测试。根据您所做的更改,可能有适当的不同类型的测试。
- JavaScript
- Android
- iOS
- Apple TV
- End-to-end tests
- Website
JavaScript
Jest
Jest测试是在带有节点的命令行上运行的仅限JavaScript的测试。您可以运行现有的React Native jest测试:
$ cd react-native
$ npm test
当您正在进行只修改JavaScript代码的更改时,添加Jest测试是个不错的主意。
测试本身存在于__tests__
他们测试的文件的目录中。看TouchableHighlight-test.js
一个基本的例子。
Flow
你也应该确保你的代码通过流测试。这些可以运行使用:
$ cd react-native
$ npm run flow
Android
Unit Tests
Android单元测试不会在模拟器中运行。他们只是使用普通的Java安装。默认的macOS Java安装不够,您可能需要安装Java 8(JDK8)。您可以输入javac -version
终端来查看您拥有的版本:
$ javac -version
javac 1.8.0_111
版本字符串1.8.x_xxx
对应于JDK 8。
您还需要安装Buck构建工具。
运行Android单元测试:
$ cd react-native
$ ./scripts/run-android-local-unit-tests.sh
无论何时处理可由Java代码单独测试的代码,添加Android单元测试都是一个好主意。Android单元测试在下ReactAndroid/src/tests
,所以你可以通过该目录浏览测试的好例子。
集成测试
要运行集成测试,您需要安装Android NDK。请参阅先决条件。
您还需要安装Buck构建工具。
我们建议在模拟器中运行Android集成测试,但您也可以使用真实的Android设备。使模拟器保持可见的窗口运行是一个不错的主意。这样,如果你的测试失败了,你可以看看模拟器进行调试。
某些设备和一些仿真器配置可能无法在测试中使用。我们确实维护一个可以工作的仿真器配置,作为测试的标准。运行这个模拟器配置:
$ cd react-native
$ ./scripts/run-android-emulator.sh
运行模拟器后,运行集成测试:
$ cd react-native
$ ./scripts/run-android-local-integration-tests.sh
集成测试应该只需几分钟即可在现代开发人员机器上运行。
无论何时您需要同时测试需要同时测试JavaScript和Java的代码时,添加Android集成测试是一个不错的主意。Android集成测试依赖于ReactAndroid/src/androidTest
,因此您可以浏览该目录以获得测试的良好示例。
iOS
集成测试
React Native提供了一些工具,以便测试集成组件,这些组件需要本地组件和JS组件通过桥进行通信。这两个主要组件是RCTTestRunner
和RCTTestModule
。RCTTestRunner
设置ReactNative环境,并提供工具XCTestCase
在Xcode中运行测试(runTest:module
是最简单的方法)。RCTTestModule
被导出为JS NativeModules.TestModule
。
测试本身是用JS编写的,并且必须TestModule.markTestCompleted()
在完成时调用,否则测试会超时并失败。测试失败主要是通过抛出JS异常来表示的。也可以测试错误条件,runTest:module:initialProps:expectErrorRegex:
或者runTest:module:initialProps:expectErrorBlock:
预期会抛出错误,并验证错误是否符合所提供的条件。
有关示例用法和集成点,请参阅以下内容:
IntegrationTestHarnessTest.js
RNTesterIntegrationTests.m
IntegrationTestsApp.js
您可以使用Xcode中IntegrationTest和RNTester应用程序中的cmd + U在本地运行集成测试,也可以在macOS上的命令行中运行以下命令:
$ cd react-native
$ ./scripts/objc-test-ios.sh
您的Xcode安装将带有运行最新操作系统的各种模拟器。您可能需要手动创建一个新的模拟器来匹配
XCODE_DESTINATION
测试脚本中的参数。
Screenshot/Snapshot Tests
快照测试是一种常见的集成测试类型。这些测试会渲染一个组件,并TestModule.verifySnapshot()
使用FBSnapshotTestCase
后台的库来验证屏幕快照与参考图像之间的关系。参考图像是通过设置记录recordMode = YES
上RCTTestRunner
,然后运行测试。快照在32位和64位以及各种操作系统版本之间略有不同,因此建议您强制执行测试时使用正确的配置。强烈建议所有的网络数据都被嘲笑,以及其他潜在的麻烦依赖。看SimpleSnapshotTest
一个基本的例子。
如果您进行影响PR中快照测试的更改,例如将新示例添加到其中一个快照样例中,则需要重新录制快照参考图像。为此,只需_runner.recordMode = YES;
在RNTester / RNTesterSnapshotTests.m中更改为,重新运行失败的测试,然后将记录翻转回NO
并提交/更新您的PR,然后等待Travis构建是否通过。
Apple TV
上面讨论的iOS测试也将在tvOS上运行。在RNTester Xcode项目中,选择RNTester-tvOS目标,然后按照上述步骤在Xcode中运行测试。
您可以通过在macOS上的命令行中运行以下命令来在本地运行Apple TV单元和集成测试:
$ cd react-native
$ ./scripts/objc-test-tvos.sh (make sure the line `TEST="test"` is uncommented)
端到端测试
最后,通过执行以下脚本确保端到端测试成功运行:
$ cd react-native
$ ./scripts/test-manual-e2e.sh
网站
React Native网站托管在GitHub页面上,并自动从Markdown源生成,以及JavaScript源文件中的注释。无论何时编辑文档,检查网站是否正确生成总是一个好主意。
$ cd website
$ npm install
$ npm start
然后在浏览器中打开http:// localhost:8079 / react-native / index.html。