Summary: Motivation was to improve logging for RNTester e2e tests. ## Changelog: [INTERNAL] - Add logging. Pull Request resolved: https://github.com/facebook/react-native/pull/39466 Test Plan: Check logs during 2e automation is running. Reviewed By: NickGerleman Differential Revision: D49499233 Pulled By: cipolleschi fbshipit-source-id: c803fa9227995ed3862b6a919a7590f80e2afc08
RNTester E2E folder
In this folder we have a the setup for running E2E testing in RNTester via the usage of Appium and WebDriverIO and Jest.
Setting up locally
(one-off) Setting up Appium
The first step you need to do is to ensure to install the tooling:
npm install appium@2.0.0 -g
appium driver install uiautomator2
appium driver install xcuitest
You should not need to run install commands for drivers separately more than once, even if you bump the dep in package.json.
Building RNTester app
Building manually .app and .apk is required to run automation tests on local environment.
-
(optional) If you previously built RNTester, you may need to clean up build files and Pods:
yarn test-e2e-local-clean && yarn install -
Step 1: install packages for the repository, then navigate in the rn-tester folder
cd react-native yarn install cd packages/rn-tester
Now, depending on the platform, there are some specific steps
Building for iOS
- Make sure you have Bundler
gem install bundler- we use it ensure installing the right version of CocoaPods locally. - Install Bundler and CocoaPods dependencies:
bundle installthenbundle exec pod installoryarn setup-ios-hermesfor RNTester with Hermes. In order to use JSC instead of Hermes engine, run:USE_HERMES=0 bundle exec pod installorsetup-ios-jscinstead. - You can build app with React Native CLI or manually with Xcode:
- To build with React Native CLI:
- Run
npx react-native build-ios --mode Debug --scheme RNTester --buildFolder /path/to/build-folder, replace/path/to/build-folderwith the real path. - Copy the built app using
mv-mv /path/to/build-folder/Build/Products/Debug-iphonesimulator/RNTester.app ~/react-native/packages/rn-tester-e2e/appsor manually.
- Run
- To build with Xcode, open the generated
RNTester.xcworkspaceand build.- Find the RNTester.app in
~/Library/Developer/Xcode/DerivedData/RNTesterPods-{id}/Build/Products/Debug-iphonesimulator - Copy the app to the following directory
~/react-native/packages/rn-tester-e2e/apps.
- Find the RNTester.app in
- To build with React Native CLI:
- Change its name to:
rn-tester.app
Building for Android
-
You'll need to have all the prerequisites (SDK, NDK) for Building React Native installed.
-
Start an Android emulator.
-
Build the app via
# In order to not use Hermes engine, run `yarn install-android-jsc` instead. yarn install-android-hermes yarn startNote: Building for the first time can take a while.
-
Find the app-*-debug.apk in
~/react-native/packages/rn-tester/android/app/build/outputs/apk/hermes/debug -
Copy the app
app-*-debug.apkto the following directory~/react-native/packages/rn-tester-e2e/apps -
Change its name to:
rn-tester.apk
Setting up the RNTester E2E folder
In react-native/packages/rn-tester-e2e open the following file
/react-native/packages/rn-tester-e2e/e2e-config.js
And modify lines L24->L39 to reflect your local setup configuration (ex. platformVersion, deviceName). Make sure to not commit this change if you send a PR to add tests.
Testing the RNTester app E2E
After you have done all the above correctly, and you have the Android/iOS apps in the rn-tester-e2e/apps folder, in a dedicated terminal window, run:
appium --base-path /wd/hub
This will start the Appium server - you will need this to keep running.
Then open a second terminal window and start the Metro terminal from the packages/rn-tester folder, via yarn start --reset-cache. This terminal window also needs to keep running.
Now, make sure that the iOS simulator/the Android emulator is up and running.
Finally, you can open a third terminal window and run:
yarn test-e2e android # for android
yarn test-e2e ios # for ios
Now you should see the RNTester app being open, and the defined test being run.
Adding new tests (and project structure)
This project has 2 main folders:
-
apps, where, as you have seen above, the iOS/Android RNTester apps need to be put so that appium will pick them and install in the emulator/simulator consistently. -
tests, where the tests and referencing files all live. The substructure is as follows:screens-> in this folder, you will find*.screen.jsfiles, where each file represents a navigation screen for RNTester. So there are 3 root ones (apis,bookmarks,components) and then for subscreens, there's a folder with the same name - currently, that's onlycomponentsthat containsbuttonComponent.screen.js. The content of these files is what was earlier mentioned as "references": they provide an easy way to define all elements present in said screen, so that they can be used for tests.specs-> this folder follows a similar 1:1 mapping to the RNTester screens, but for the tests: for each screen (or subscreen) there's a dedicated*.test.jsfile (such asbuttonComponentScreen.test.js). Ideally, in this file the Jest tests are standard, leveraging the*.screen.jscounterpart for the details of defining how Appium/WDIO can reach those elements on screen.
When adding a new test, please ensure that you follow this pattern and add the relevant test in the right screen file / screen test file. Use the files mentioned above as examples.