react-native/DockerTests.md
Nicholas Tate fe2ff122dc Docker Testing Environment for Android & JS
Summary:
Created a containerized environment to run unit and integration tests for both javascript and android as well as a Jenkinsfile using the new 2.0 Pipeline syntax for integration into a Jenkins CI cluster.

Here is a quick summary of the changes:

* The android image is built from two separate dockerfiles. There is a base image that handles the heavy lifting of dependencies that are infrequently changed while the secondary image extends the base and allows for much quicker incremental builds on code updates.
* The javascript image is simple and is relatively quick to build, therefore there is no base image for any react specific javascript dependencies and it is all packaged in a single docker image.
* A new `scripts/docker` has been created including some javascript files and shell scripts to aid in the running of the tests
* The instrumentation test runner script can be passed various flags to control which tests run since the entire suite takes a significant amount of time to run synchronously
* Jen
Closes https://github.com/facebook/react-native/pull/11902

Differential Revision: D4609238

Pulled By: ericvicenti

fbshipit-source-id: a317f3ac3be898180b009254a9604ca7d579a8b9
2017-02-24 10:59:53 -08:00

5.4 KiB

Dockerfile Tests

This is a high level overview of the test configuration using docker. It explains how to run the tests locally and how they integrate with the Jenkins Pipeline script to run the automated tests on ContainerShip https://www.containership.io/.

Docker Installation

It is required to have Docker running on your machine in order to build and run the tests in the Dockerfiles. See https://docs.docker.com/engine/installation/ for more information on how to install.

Convenience NPM Run Scripts

We have added a number of default run scripts to the package.json file to simplify building and running your tests.

npm run test-android-setup - Pulls down the base android docker image used for running the tests

npm run test-android-build - Builds the docker image used to run the tests

npm run test-android-run-unit - Runs all the unit tests that have been built in the latest react/android docker image (note: you need to run test-android-build before executing this, if the image does not exist it will fail)

npm run test-android-run-instrumentation - Runs all the instrumentation tests that have been built in the latest react/android docker image (note: you need to run test-android-build before executing this, if the image does not exist it will fail). You can also pass additional flags to filter which tests instrumentation tests are run. Ex: npm run test-android-run-instrumentation -- --filter=TestIdTestCase to only run the TestIdTestCase instrumentation test. See below for more information on the instrumentation test flags.

npm run test-android-run-e2e - Runs all the end to end tests that have been built in the latest react/android docker image (note: you need to run test-android-build before executing this, if the image does not exist it will fail)

npm run test-android-unit - Builds and runs the android unit tests.

npm run test-android-instrumentation - Builds and runs the android instrumentation tests.

npm run test-android-e2e - Builds and runs the android end to end tests.

Detailed Android Setup

There are two Dockerfiles for use with the Android codebase.

The Dockerfile.android-base contains all the necessary prerequisites required to run the React Android tests. It is separated out into a separate Dockerfile because these are dependencies that rarely change and also because it is quite a beastly image since it contains all the Android depedencies for running android and the emulators (~9GB).

The good news is you should rarely have to build or pull down the base image! All iterative code updates happen as part of the Dockerfile.android image build.

So step one...

docker pull containership/android-base:latest

This will take quite some time depending on your connection and you need to ensure you have ~10GB of free disk space.

Once this is done, you can run tests locally by executing two simple commands:

  1. docker build -t react/android -f ./ContainerShip/Dockerfile.android .
  2. docker run --cap-add=SYS_ADMIN -it react/android bash ContainerShip/scripts/run-android-docker-unit-tests.sh

Note: --cap-add=SYS_ADMIN flag is required for the ContainerShip/scripts/run-android-docker-unit-tests.sh and ContainerShip/scripts/run-android-docker-instrumentation-tests.sh in order to allow the remounting of /dev/shm as writeable so the buck build system may write temporary output to that location

Every time you make any modifications to the codebase, you should re-run the docker build ... command in order for your updates to be included in your local docker image.

The following shell scripts have been provided for android testing:

ContainerShip/scripts/run-android-docker-unit-tests.sh - Runs the standard android unit tests

ContainerShip/scripts/run-android-docker-instrumentation-tests.sh - Runs the android instrumentation tests on the emulator. Note that these tests take quite some time to run so there are various flags you can pass in order to filter which tests are run (see below)

ContainerShip/scripts/run-ci-e2e-tests.sh - Runs the android end to end tests

ContainerShip/scripts/run-android-docker-instrumentation-tests.sh

The instrumentation test script accepts the following flags in order to customize the execution of the tests:

--filter - A regex that filters which instrumentation tests will be run. (Defaults to .*)

--package - Name of the java package containing the instrumentation tests (Defaults to com.facebook.react.tests)

--path - Path to the directory containing the instrumentation tests. (Defaults to ./ReactAndroid/src/androidTest/java/com/facebook/react/tests)

--retries - Number of times to retry a failed test before declaring a failure (Defaults to 2)

For example, if locally you only wanted to run the InitialPropsTestCase, you could do the following:

docker run --cap-add=SYS_ADMIN -it react/android bash ContainerShip/scripts/run-android-docker-instrumentation-tests.sh --filter="InitialPropsTestCase"

Javascript Setup

There is a single Dockerfile for use with the javascript codebase.

The Dockerfile.javascript base requires all the necessary dependencies for running Javascript tests.

Any time you make an update to the codebase, you can build and run the javascript tests with the following three commands:

  1. docker build -t react/js -f ./ContainerShip/Dockerfile.javascript .
  2. docker run -it react/js yarn test --maxWorkers=4
  3. docker run -it react/js yarn run flow -- check