In this folder we have a the setup for running E2E testing in RNTester via the usage of Appium and WebDriverIO and Jest.
The first step you need to do is to ensure to install the tooling:
npm install [email protected] -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 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
- 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 install
thenbundle exec pod install
oryarn setup-ios-hermes
for RNTester with Hermes. In order to use JSC instead of Hermes engine, run:USE_HERMES=0 bundle exec pod install
orsetup-ios-jsc
instead. - 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-folder
with 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/apps
or manually.
- Run
- To build with Xcode, open the generated
RNTester.xcworkspace
and 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
-
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 start
Note: 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.apk
to the following directory~/react-native/packages/rn-tester-e2e/apps
-
Change its name to:
rn-tester.apk
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.
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-android-e2e # for android
yarn test-ios-e2e # for ios
Now you should see the RNTester app being open, and the defined test being run.
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.js
files, 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 onlycomponents
that 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.js
file (such asbuttonComponentScreen.test.js
). Ideally, in this file the Jest tests are standard, leveraging the*.screen.js
counterpart 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.