QA tool to run scenarii tests and compare screenshots for UI regression using Nightwatch integration with Browserstack integrated with Slack.
- AWS S3: Storage of images for UI regression
- Browserstack: multiple devices tests
- Slack: tests notifications
# in your project (better if you want to use some of our code for tests)
npm i @habx/nightwatchx
# globaly, you handle tests writing on your own
npm i -g @habx/nightwatchx
# build tests
npx nightwatchx build
# build local tests
npx nightwatchx build local
# run your tests
npx nightwatchx test
# run specific tests
npx nightwatchx test --only=login
# run on a local chromium
npm run test:local --only=login
If you want to run tests on browser stack using npx nightwatchx test
, you'll need the following environement variables:
BROWSERSTACK_ACCESS_KEY=***
AWS_SECRET_ACCESS_KEY=***
SLACK_TOKEN=***
AWS_ACCESS_KEY_ID=***
SLACK_HOOK=***
SLACK_HOOK_ERROR_ONLY=***
AWS_ACCOUNT_ID=***
AWS_REGION=***
BROWSERSTACK_USERNAME=***
param | description |
---|---|
only | run only specified test suites |
silent | do not send slack message |
local | use the local config that uses a local chromium |
There are 4 levels of configuration
├─ test suites/folders
│ ├─ runs <--- defined in `manifest.json` per test
│ │ ├─ environments <--- list of options defined in `environments.ts` (in our case it contains the url [prod/staging/dev])
│ │ │ ├─ devices <--- list of options defined in `devices.ts`
Each test suite should be associated with a manifest.json
file. The later contains the configuration for the tests to be run with browserstack. The whole configuration is passed down to the globals of nightwatch
{
"runs": {
"default": {
"environments": [ // All the environements that should be run for this test
"prod",
"dev"
]
"devices": [ // All the devices that should be run for this test
"win10_edge",
"mac10.14_chrome70",
"win10_firefox"
],
"frequencyMinutes": 1440 // The frequency
},
},
}
option | type | default | description |
---|---|---|---|
environments | array | ["default"] | environments to run the test on |
devices | array | ["default"] | devices to run the test on |
frequencyMinutes | number (in minutes) | 0 | frequency of the test |
threshold | float | 0.2 |
All the environments options should be described in the file config/environments.json
. You could also configure specific parameters by environment for tests.
{
"default": {
"url": "https://www.habx.fr"
},
"prod": {
"url": "https://www.habx.fr"
},
"prod_en": {
"url": "https://www.habx.com/en"
}
}
All the devices settings used by browserstack should be described in the file config/devices.json
. You could also configure specific parameters by device for tests.
See how to configure a device for browserstack
{
"default": {
"env": "chrome",
"desiredCapabilities": {
"browser": "chrome",
"resolution": "1024x768",
"browser_version": "74.0",
"os": "Windows",
"os_version": "10"
}
}
}
Some devices are already defined in the library:
- win10_chrome74
- win10_firefox66
- win10_edge18
- win10_ie11
- android_samsungS9
- ios_iphoneX
A slack message is sent at each run. It contains a summary of the run and its potential errors or warnings
- We show which device(s) failed with a
⚠️ - The first screenshot which exceeded the comparison threshold is attached to the message
- We show which device(s) failed with a ❗️
- A screenshot of the screen just after the test failed is attached to the message
Use the folowing github workflow config to run your tests every hour 🎉
name: Run tests
on:
schedule:
- cron: '0 * * * *'
jobs:
build:
runs-on: ubuntu-latest
strategy:
matrix:
node-version: [8.x]
steps:
- uses: actions/checkout@v1
- name: Use Node.js ${{ matrix.node-version }}
uses: actions/setup-node@v1
with:
node-version: ${{ matrix.node-version }}
- name: npm install, build, and test
env:
SLACK_HOOK: https://hooks.slack.com/services/*****
SLACK_HOOK_ERROR_ONLY: https://hooks.slack.com/services/*****
AWS_ACCESS_KEY_ID: ****
AWS_ACCOUNT_ID: ****
AWS_REGION: eu-west-1
AWS_SECRET_ACCESS_KEY: ${{ secrets.AWS_SECRET_ACCESS_KEY }}
BROWSERSTACK_ACCESS_KEY: ${{ secrets.BROWSERSTACK_ACCESS_KEY }}
BROWSERSTACK_USERNAME: ${{ secrets.BROWSERSTACK_USERNAME }}
SLACK_TOKEN: ${{ secrets.SLACK_TOKEN }}
BUCKET_NAME: ${{ secrets.BUCKET_NAME }}
run: |
npm install
npm run build
npm run test
browser.compareScreenshot(fileName: string, { threshold: number, waitBetweenScreenshots: number }