@trezor/suite-web uses Cypress to run e2e tests. It also uses trezor-user-env which is daily built into a docker image providing all the necessary instrumentation required to run tests (bridge and emulators).
Note: All paths below are relative to the root of trezor-suite repository, if not specified otherwise.
- Run
xhost +
to add yourself to the X access control list. - Run
docker/docker-suite-install.sh
. - Run
docker/docker-suite-test.sh
.- A Cypress window should open.
- Wait until the project is built (a warning about "http://localhost:8000/ is not available", should disappear on the retry button click).
- Start a test by clicking its name in the Cypress window.
- It should open a browser window.
- If the Suite web app is not loading even after two retries. Stop tests, open a new tab, navigate to http://localhost:8000/, refresh the page until the app is loaded. Close the tab and run tests again.
Error while fetching server API version: ('Connection aborted.', FileNotFoundError(2, 'No such file or directory'))
- On NixOS: Make sure that docker is enabled in your configuration.nix:
virtualisation.docker.enable = true;
- On NixOS: Make sure that docker is enabled in your configuration.nix:
Error while fetching server API version: ('Connection aborted.', PermissionError(13, 'Permission denied'))
- Check the docker.sock permissions:
sudo chmod 666 /var/run/docker.sock
- Run XQuartz. Wait till it is launched. Leave it running in the background.
- In XQuartz settings go to Preferences -> Security and enable "Allow connections from network clients".
- Open a new terminal window (not in XQuartz) and add yourself to the X access control list:
xhost +127.0.0.1
- You will probably need to logout/login after XQuartz installation to have
xhost
command available.
- Run Docker and go to Preferences -> Resources -> Advanced and increase RAM to at least 4GB. Otherwise, the app during tests does not even load.
- In terminal window run
docker/docker-suite-install.sh
- In the terminal window, set two environment variables:
export HOSTNAME=`hostname`
export DISPLAY=${HOSTNAME}:0
- In terminal window run
docker/docker-suite-test.sh
- A Cypress window should open.
- Wait until the project is built (a warning about "http://localhost:8000/ is not available", should disappear on the retry button click).
- Start a test by clicking its name in the Cypress window.
- It should open a browser window.
- If the Suite web app is not loading even after two retries. Stop tests, open a new tab, navigate to http://localhost:8000/, refresh the page until the app is loaded. Close the tab and run tests again.
[...ERROR:browser_main_loop.cc(1434)] Unable to open X display.
- Make sure the XQuartz app is launched and you can see its terminal.
- Check that environment variables are properly set:
echo $HOSTNAME # e.g. name.local
echo $DISPLAY # e.g. name.local:0
- Do not mix native terminal window with terminal window in your IDE (e.g. Visual Studio Code).
- currently, it is not possible to run E2E tests only within a Docker container on ARM mac. With
Trezor-user-env
run in Docker, it is possible to runSuite
andCypress
locally.
- Docker
- XQuartz (to share your screen with Docker)
- Trezor user env
- No other instance of
Suite
ortrezord
service is running
Steps:
- Run XQuartz. Wait till it is launched. Leave it running in the background.
- In XQuartz settings go to Preferences -> Security and enable "Allow connections from network clients".
- Open a new terminal window (not in XQuartz) and add yourself to the X access control list:
xhost +127.0.0.1
- You will probably need to logout/login after XQuartz installation to have
xhost
command available.
- Run Docker and go to Preferences -> Resources -> Advanced and increase RAM to at least 4GB. Otherwise, the app during tests does not even load.
- In the terminal window, set two environment variables:
export HOSTNAME=`hostname`
export DISPLAY=${HOSTNAME}:0
- In terminal window, navigate to
trezor-user-env
repo root and run./run.sh
. - In another window, run web
Suite
withyarn suite:dev
. - In a third window, run
npx cypress open --project packages/suite-web/e2e --config 'baseUrl=http://localhost:8000'
.
Cypress could not verify that this server is running ...
- make sure that the localhost is actually running and is accessible via browser
tests fail at the very beginning on screen with "Use trezor here" button
- make sure that no other instance of
Suite
ortrezord
is running
- make sure that no other instance of
It is possible to run tests with image snapshots to test for visual regressions. To enable snapshots, use env variable:
CYPRESS_SNAPSHOT=1 docker/docker-suite-test.sh
When you need to update image snapshots you have 2 options:
- use CI job. This will generate new snapshots in artifacts together with a handy script that updates your snapshots locally. Check the log output.
- use
docker/docker-suite-snapshots.sh
. This does the same asdocker/docker-suite-test.sh
, the only difference is it won't fail on non-matching snapshots but generate new snapshots.
The run_tests.js script is the entry point for e2e tests. It:
- picks tests files to be run (see @tags)
- retries tests if needed (see @retry)
- reports tests results
Each test should be assigned a tag at the top of the test file. These allow you to add more fine-grained control in run_tests.js.
At the moment, there are the following tags:
- @group:[string]
- @retry=[number]
Assigning a @group allows run_tests.js script to sort the test files into groups and run them in parallel on CI. At the moment these groups exist:
@group:metadata
@group:device-management
@group:suite
@group:onboarding
@group:settings
If there is a test that you for any reason need to retry if it fails you may provide @retry=2
tag. In this
case, test will be run 3 times in total and count as failed only if all runs fail.
There is a tool to track tests runs and their results, temporarily hosted here https://track-suite.herokuapp.com/ Repo here: https://github.com/mroz22/track-suite