如何執行與編寫測試
執行測試
本節說明作為貢獻者,如何測試您對 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 位元以及各種 OS 版本之間會略有不同,因此建議您強制使用 正確的設定 執行測試。
也強烈建議模擬所有網路資料,以及其他可能造成問題的依賴項。請參閱 SimpleSnapshotTest
以取得基本範例。
如果您在 pull request 中進行變更,影響了快照測試,例如在其中一個已快照的範例中新增了新的範例案例,則需要重新記錄快照參考圖片。
若要執行此操作,請在 RNTester/RNTesterSnapshotTests.m 中將 recordMode
標誌變更為 _runner.recordMode = YES;
,重新執行失敗的測試,然後將記錄切換回 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 提供了一個 命令列介面,能夠在本機執行作業。
常見問題
我該如何升級 CI 測試中使用的 Xcode 版本?
升級到新版本的 Xcode 時,請先確認 CircleCI 支援該版本。
您也需要更新測試環境設定,以確保測試在 CircleCI 機器中安裝的 iOS 模擬器上執行。
也可以在 CircleCI 的 Xcode 版本參考 中找到,方法是按一下所需的版本,然後查看 Runtimes 下方。
然後您可以編輯這兩個檔案
-
.circleci/config.yml
編輯
macos:
下方的xcode:
行(搜尋_XCODE_VERSION
)。 -
scripts/.tests.env
編輯
IOS_TARGET_OS
環境變數以符合所需的 iOS Runtime。
如果您打算在 GitHub 上合併此變更,請務必通知 Meta 員工,因為當他們匯入您的 pull request 時,他們需要更新內部 Sandcastle RN OSS iOS 測試中使用的 _XCODE_VERSION
值,該值位於 react_native_oss.py
中。