テストの実行と記述方法
テストの実行
このセクションでは、コントリビューターとして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コンポーネントの両方で通信する必要がある統合コンポーネントをテストしやすくする機能を提供します。
2つの主要なコンポーネントは、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スナップショットテスト
一般的な統合テストのタイプは、スナップショットテストです。 これらのテストはコンポーネントをレンダリングし、FBSnapshotTestCase
ライブラリを内部で使用して、TestModule.verifySnapshot()
を使用して画面のスナップショットを参照画像と照合して検証します。 参照画像は、RCTTestRunner
でrecordMode = YES
を設定してからテストを実行することで記録されます。
スナップショットは、32ビットと64ビット、およびさまざまなOSバージョン間でわずかに異なるため、正しい構成でテストが実行されるようにすることをお勧めします。
また、他の潜在的に問題のある依存関係とともに、すべてのネットワークデータをモックアウトすることを強くお勧めします。 基本的な例については、SimpleSnapshotTest
を参照してください。
プルリクエストでスナップショットテストに影響を与える変更(スナップショットされた例の1つに新しい例を追加するなど)を行った場合は、スナップショット参照画像を再記録する必要があります。
これを行うには、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バージョンリファレンスで、目的のバージョンをクリックし、ランタイムで確認することもできます。
次に、これら2つのファイルを編集できます
-
.circleci/config.yml
macos:
の下のxcode:
行を編集します(_XCODE_VERSION
を検索します)。 -
scripts/.tests.env
目的のiOSランタイムと一致するように、
IOS_TARGET_OS
envvarを編集します。
この変更をGitHubにマージする場合は、Metaの従業員に通知してください。プルリクエストをインポートするときに、react_native_oss.py
の社内Sandcastle RN OSS iOSテストで使用される_XCODE_VERSION
の値を更新する必要があるためです。