UI Tests for Frappe (#3500)

* init nightwatch.js

* add nightwatch to travis

typo

nightwatch fix

kill node

launch_url

run tests on local selenium

manually run sc

sc in bg with sleep

minor

minor

run test on chromedriver

simplify travis

minor

add chrome package

implicit chromedriver

nightwatch.global.js

path fix

console statement

enable screenshot

send screenshot to telegram

path

minor

remove chromium

add binary

screenshot

url

cleanup

increase timout

minor

minor

minor

* login test

add page_objects in config

Fix login test

* bench run-ui-tests

* update package.json

* update travis

* bench reinstall before running ui tests
This commit is contained in:
Faris Ansari 2017-06-19 17:58:45 +05:30 committed by Rushabh Mehta
parent 5e581a1b69
commit a9cf952505
6 changed files with 170 additions and 6 deletions

View file

@ -4,11 +4,17 @@ dist: trusty
python:
- "2.7"
addons:
apt:
sources:
- google-chrome
packages:
- google-chrome-stable
services:
- mysql
before_install:
- export CHROME_BIN=chromium-browser
- export DISPLAY=:99.0
- sh -e /etc/init.d/xvfb start
@ -23,18 +29,19 @@ install:
- cd ~/ && bench init frappe-bench --frappe-path $TRAVIS_BUILD_DIR
- cp -r $TRAVIS_BUILD_DIR/test_sites/test_site ~/frappe-bench/sites/
script:
- set -e
- bench --verbose run-tests
before_script:
- mysql -u root -ptravis -e 'create database test_frappe'
- echo "USE mysql;\nCREATE USER 'test_frappe'@'localhost' IDENTIFIED BY 'test_frappe';\nFLUSH PRIVILEGES;\n" | mysql -u root -ptravis
- echo "USE mysql;\nGRANT ALL PRIVILEGES ON \`test_frappe\`.* TO 'test_frappe'@'localhost';\n" | mysql -u root -ptravis
- cd ~/frappe-bench
- npm install babel-core less chokidar babel-preset-es2015 babel-preset-es2016 babel-preset-es2017 babel-preset-babili
- bench use test_site
- bench reinstall --yes
- bench start &
- sleep 10
script:
- set -e
- bench --verbose run-tests
- bench reinstall --yes
- bench run-ui-tests --ci

View file

@ -326,6 +326,33 @@ def run_tests(context, app=None, module=None, doctype=None, test=(), driver=None
sys.exit(ret)
@click.command('run-ui-tests')
@click.option('--app', help="App to run tests on, leave blank for all apps")
@click.option('--ci', is_flag=True, default=False, help="Run in CI environment")
@pass_context
def run_ui_tests(context, app=None, ci=False):
"Run UI tests"
import subprocess
site = get_site(context)
frappe.init(site=site)
if app is None:
app = ",".join(frappe.get_installed_apps())
cmd = [
'./node_modules/.bin/nightwatch',
'--config', './apps/frappe/frappe/nightwatch.js',
'--app', app,
'--site', site
]
if ci:
cmd.extend(['--env', 'ci_server'])
bench_path = frappe.utils.get_bench_path()
subprocess.call(cmd, cwd=bench_path)
@click.command('serve')
@click.option('--port', default=8000)
@click.option('--profile', is_flag=True, default=False)
@ -459,6 +486,7 @@ commands = [
request,
reset_perms,
run_tests,
run_ui_tests,
serve,
set_config,
watch,

View file

@ -0,0 +1,12 @@
var chromedriver = require('chromedriver');
module.exports = {
before: function (done) {
chromedriver.start();
done();
},
after: function (done) {
chromedriver.stop();
done();
}
};

96
frappe/nightwatch.js Normal file
View file

@ -0,0 +1,96 @@
const fs = require('fs');
const ci_mode = get_cli_arg('env') === 'ci_server';
const site_name = get_cli_arg('site');
let app_name = get_cli_arg('app');
if(!app_name) {
console.log('Please specify app to run tests');
return;
}
if(!ci_mode && !site_name) {
console.log('Please specify site to run tests');
return;
}
// site url
let site_url;
if(site_name) {
site_url = 'http://' + site_name + ':' + get_port();
}
// multiple apps
if(app_name.includes(',')) {
app_name = app_name.split(',');
} else {
app_name = [app_name];
}
let test_folders = [];
let page_objects = [];
for(const app of app_name) {
const test_folder = `apps/${app}/${app}/tests/ui`;
const page_object = test_folder + '/page_objects';
if(!fs.existsSync(test_folder)) {
console.log(`No test folder found for "${app}"`);
continue;
}
test_folders.push(test_folder);
if(fs.existsSync(page_object)) {
page_objects.push();
}
}
const config = {
"src_folders": test_folders,
"globals_path" : 'apps/frappe/frappe/nightwatch.global.js',
"page_objects_path": page_objects,
"selenium": {
"start_process": false
},
"test_settings": {
"default": {
"launch_url": site_url,
"selenium_port": 9515,
"selenium_host": "127.0.0.1",
"default_path_prefix": "",
"silent": true,
// "screenshots": {
// "enabled": true,
// "path": SCREENSHOT_PATH
// },
"globals": {
"waitForConditionTimeout": 15000
},
"desiredCapabilities": {
"browserName": "chrome",
"chromeOptions": {
"args": ["--no-sandbox", "--start-maximized"]
},
"javascriptEnabled": true,
"acceptSslCerts": true
}
},
"ci_server": {
"launch_url": 'http://localhost:8000'
}
}
}
module.exports = config;
function get_cli_arg(key) {
var args = process.argv;
var i = args.indexOf('--' + key);
if(i === -1) {
return null;
}
return args[i + 1];
}
function get_port() {
var bench_config = JSON.parse(fs.readFileSync('sites/common_site_config.json'));
return bench_config.webserver_port;
}

19
frappe/tests/ui/login.js Normal file
View file

@ -0,0 +1,19 @@
module.exports = {
beforeEach: browser => {
browser
.url(browser.launch_url + '/login')
.waitForElementVisible('body', 5000)
},
'Login': browser => {
browser
.assert.title('Login')
.assert.visible('#login_email', 'Check if login box is visible')
.setValue("#login_email", "Administrator")
.setValue("#login_password", "admin")
.click(".btn-login")
.waitForElementVisible("#body_div", 15000);
},
after: browser => {
browser.end();
},
};

View file

@ -20,9 +20,11 @@
"babel-preset-es2016": "^6.24.1",
"babel-preset-es2017": "^6.24.1",
"chokidar": "^1.7.0",
"chromedriver": "^2.30.1",
"cookie": "^0.3.1",
"express": "^4.15.3",
"less": "^2.7.2",
"nightwatch": "^0.9.16",
"redis": "^2.7.1",
"socket.io": "^2.0.1",
"superagent": "^3.5.2"