テストの実行と作成方法
テストの実行
このセクションは、コントリビューターとしてReact Nativeへの変更をテストする方法についてです。まだの場合は、ネイティブコードを含むプロジェクトのビルドのための開発環境のセットアップ手順を完了してください。
JavaScriptテスト
JavaScriptのテストスイートを実行する最も簡単な方法は、React Nativeチェックアウトのルートで次のコマンドを使用することです。
yarn test
これにより、Jestを使用してテストが実行されます。
また、コードがFlowおよびリントテストに合格することも確認する必要があります。
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スナップショットテスト
インテグレーションテストの一般的なタイプはスナップショットテストです。これらのテストはコンポーネントをレンダリングし、TestModule.verifySnapshot()
を使用して画面のスナップショットを参照画像と比較検証します。内部的にはFBSnapshotTestCase
ライブラリが使用されています。参照画像は、RCTTestRunner
でrecordMode = YES
に設定してからテストを実行することで記録されます。
スナップショットは32ビットと64ビット、およびさまざまなOSバージョンでわずかに異なるため、テストが正しい設定で実行されるように強制することをお勧めします。
また、すべてのネットワークデータをモックアウトし、その他の潜在的に問題のある依存関係も同様に扱うことを強くお勧めします。基本的な例については、SimpleSnapshotTest
を参照してください。
プルリクエストでスナップショットテストに影響を与える変更(スナップショットされる例に新しいケースを追加するなど)を行った場合は、スナップショット参照画像を再記録する必要があります。
これを行うには、RNTester/RNTesterSnapshotTests.mでrecordMode
フラグを_runner.recordMode = YES;
に変更し、失敗したテストを再実行してから、recordMode
を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がコマンドラインインターフェースを提供しており、ジョブをローカルで実行する機能があります。
よくある質問 (F.A.Q.)
CIテストで使用されるXcodeのバージョンをアップグレードするにはどうすればよいですか?
新しいバージョンのXcodeにアップグレードする際は、まずそれがCircleCIでサポートされていることを確認してください。
また、テスト環境の設定を更新して、テストがCircleCIマシンにインストールされているiOSシミュレーターで実行されるようにする必要があります。
これもCircleCIのXcodeバージョンリファレンスで、目的のバージョンをクリックし、Runtimesの下を見ることで確認できます。
その後、これら2つのファイルを編集できます
-
.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
の値を更新する必要があります。