Skip to content

Commit 4c06fdf

Browse files
ghillertoodamien
authored andcommitted
gh-648 Provide infrastructure for local E2E/Unit Testing against SauceLabs
- Update Readme - Add support for SauceLabs-based E2E testing - Add support for SauceLabs-based Unit testing - Add support for BrowserStack-based E2E testing - Add support for BrowserStack-based Unit testing In order to run the tests, developers must provide SauceLabs credentials, e.g.: $ export SAUCE_USERNAME=your-username $ export SAUCE_ACCESS_KEY=your-access-key and BrowserStack credentials, e.g.: $ export BROWSER_STACK_USERNAME=your-username $ export BROWSER_STACK_ACCESS_KEY=your-access-key Important, for E2E tests, developers should refrain from using `localhost`. Instead, add `dataflow.local` to your local DNS hosts file.
1 parent 04760df commit 4c06fdf

10 files changed

+329
-3
lines changed

README.md

+65-2
Original file line numberDiff line numberDiff line change
@@ -60,15 +60,78 @@ The following instructions can be used to do this:
6060
* **pom.xml** Maven config file
6161
* ui/**package.json** Node dependencies
6262

63-
# Running Tests
63+
# Running Tests - Locally
6464

6565
## Unit Tests
6666

67-
$ ng test --browsers PhantomJS --single-run
67+
```bash
68+
$ ng test --single-run
69+
```
6870

6971
## E2E Tests
7072

73+
```bash
7174
$ npm run e2e
75+
```
76+
77+
# Running Tests - SauceLabs
78+
79+
Before you can run tests using SauceLabs, please setup your username and password:
80+
81+
```bash
82+
$ export SAUCE_USERNAME=your-username
83+
$ export SAUCE_ACCESS_KEY=your-access-key
84+
```
85+
86+
## Unit Tests
87+
88+
```bash
89+
$ npm run test-saucelabs-local
90+
```
91+
92+
## E2E Tests
93+
94+
For E2E tests, developers should refrain from using `localhost`. Instead, add `dataflow.local` to your local DNS hosts file.
95+
96+
```bash
97+
$ npm run e2e-saucelabs-local
98+
```
99+
100+
## Thank You
101+
102+
![SauceLabs Logo](master-ui-assets/images/saucelabs-logo-600x315.png)
103+
104+
Cross-browser Testing provided by [SauceLabs](https://saucelabs.com).
105+
106+
# Running Tests - BrowserStack
107+
108+
Before you can run tests using BrowserStack, please setup your username and password:
109+
110+
```bash
111+
$ export BROWSER_STACK_USERNAME=your-username
112+
$ export BROWSER_STACK_ACCESS_KEY=your-access-key
113+
```
114+
115+
## Unit Tests
116+
117+
```bash
118+
$ npm run test-browserstack-local
119+
```
120+
121+
## E2E Tests
122+
123+
For E2E tests, developers should refrain from using `localhost`. Instead, add `dataflow.local` to your local DNS hosts file.
124+
125+
```bash
126+
$ npm run e2e-browserstack-local
127+
```
128+
129+
## Big Thanks
130+
131+
![BrowserStack Logo](master-ui-assets/images/browserstack-logo-600x315.png)
132+
133+
134+
Cross-browser Testing Platform provided by [BrowserStack](https://browserstack.com).
72135

73136
# Development
74137

Loading
Loading
Loading

ui/e2e/streams/streams.po.ts

+1-1
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@ export class StreamsPage {
1313
*/
1414
navigateTo() {
1515
browser.waitForAngularEnabled(false);
16-
return browser.get('#/streams/definitions', 60000);
16+
return browser.get('#/streams');
1717
}
1818

1919
/**

ui/karma-browserstack.conf.js

+45
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,45 @@
1+
// Karma configuration file, see link for more information
2+
// https://karma-runner.github.io/1.0/config/configuration-file.html
3+
4+
module.exports = function (config) {
5+
6+
const customLaunchers = {
7+
'bs_chrome': {
8+
base: 'BrowserStack',
9+
browser: 'firefox',
10+
browser_version: '59',
11+
os: 'Windows',
12+
os_version: '10'
13+
}
14+
};
15+
16+
config.set({
17+
basePath: '',
18+
frameworks: ['jasmine', '@angular/cli'],
19+
20+
plugins: [
21+
require('karma-jasmine'),
22+
require('karma-browserstack-launcher'),
23+
require('karma-jasmine-html-reporter'),
24+
require('@angular/cli/plugins/karma')
25+
],
26+
client:{
27+
clearContext: false // leave Jasmine Spec Runner output visible in browser
28+
},
29+
angularCli: {
30+
environment: 'dev'
31+
},
32+
browserStack: {
33+
name: 'Data Flow Dashboard Unit Tests'
34+
},
35+
captureTimeout: 120000,
36+
customLaunchers: customLaunchers,
37+
browsers: Object.keys(customLaunchers),
38+
singleRun: true,
39+
40+
reporters: ['progress', 'BrowserStack'],
41+
colors: true,
42+
logLevel: config.LOG_DEBUG,
43+
browserNoActivityTimeout: 1000000
44+
});
45+
};

ui/karma-saucelabs.conf.js

+59
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,59 @@
1+
// Karma configuration file, see link for more information
2+
// https://karma-runner.github.io/1.0/config/configuration-file.html
3+
4+
module.exports = function (config) {
5+
6+
const customLaunchers = {
7+
'SL_Edge': {
8+
base: 'SauceLabs',
9+
browserName: 'MicrosoftEdge',
10+
//version: '48.0',
11+
platform: 'Windows 10',
12+
timeout: 360,
13+
idleTimeout: 5000,
14+
maxDuration: 1800,
15+
commandTimeout: 600
16+
},
17+
'SL_Chrome': {
18+
base: 'SauceLabs',
19+
browserName: 'chrome',
20+
version: '64.0',
21+
'chromedriverVersion':'2.35',
22+
timeout: 360,
23+
idleTimeout: 5000,
24+
maxDuration: 1800,
25+
commandTimeout: 600
26+
}
27+
};
28+
29+
config.set({
30+
basePath: '',
31+
frameworks: ['jasmine', '@angular/cli'],
32+
33+
plugins: [
34+
require('karma-jasmine'),
35+
require('karma-sauce-launcher'),
36+
require('karma-jasmine-html-reporter'),
37+
require('@angular/cli/plugins/karma')
38+
],
39+
client:{
40+
clearContext: false // leave Jasmine Spec Runner output visible in browser
41+
},
42+
angularCli: {
43+
environment: 'dev'
44+
},
45+
sauceLabs: {
46+
testName: 'Data Flow Dashboard Unit Tests'
47+
},
48+
captureTimeout: 1000000,
49+
browserDisconnectTimeout: 1000000,
50+
concurrency: 1,
51+
customLaunchers: customLaunchers,
52+
browsers: Object.keys(customLaunchers),
53+
singleRun: true,
54+
reporters: ['progress', 'saucelabs'],
55+
colors: true,
56+
logLevel: config.LOG_DEBUG,
57+
browserNoActivityTimeout: 1000000
58+
});
59+
};

ui/package.json

+7
Original file line numberDiff line numberDiff line change
@@ -7,8 +7,12 @@
77
"start": "ng serve --proxy-config proxy.conf.json",
88
"build": "ng build",
99
"test": "ng test",
10+
"test-saucelabs-local": "ng test --config karma-saucelabs.conf.js",
11+
"test-browserstack-local": "ng test --config karma-browserstack.conf.js",
1012
"lint": "ng lint",
1113
"e2e": "ng e2e --proxy-config proxy.conf.json",
14+
"e2e-saucelabs-local": "ng e2e --proxy-config proxy.conf.json --host dataflow.local --config protractor-saucelabs.conf.js -prod",
15+
"e2e-browserstack-local": "ng e2e --proxy-config proxy.conf.json --host dataflow.local --config protractor-browserstack.conf.js -prod",
1216
"install": "napa pivotal-cf/pivotal-ui:pivotal-ui-git-clone",
1317
"doc": "./node_modules/.bin/compodoc -p tsconfig.json -n \"Spring Cloud Data Flow Dashboard Documentation\"",
1418
"mavenbuild": "node ./node_modules/@angular/cli/bin/ng test --code-coverage true --watch false --browsers ChromeHeadless && node ./node_modules/@angular/cli/bin/ng build --prod --output-path ./../src/main/resources/public/dashboard --base-href /dashboard/",
@@ -57,6 +61,8 @@
5761
"jasmine-spec-reporter": "4.2.1",
5862
"karma": "2.0.0",
5963
"karma-chrome-launcher": "2.2.0",
64+
"karma-sauce-launcher": "1.2.0",
65+
"karma-browserstack-launcher": "1.3.0",
6066
"karma-coverage-istanbul-reporter": "1.4.2",
6167
"karma-jasmine": "1.1.1",
6268
"karma-jasmine-html-reporter": "0.2.2",
@@ -66,6 +72,7 @@
6672
"typescript": "2.5.3",
6773
"@compodoc/compodoc": "1.0.4",
6874
"@types/d3": "4.12.0",
75+
"browserstack-local": "1.3.0",
6976
"napa": "2.3.0",
7077
"webpack-bundle-analyzer": "2.9.0"
7178
},

ui/protractor-browserstack.conf.js

+78
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,78 @@
1+
// Protractor configuration file, see link for more information
2+
// https://github.com/angular/protractor/blob/master/lib/config.ts
3+
4+
const { SpecReporter } = require('jasmine-spec-reporter');
5+
const browserstack = require('browserstack-local');
6+
7+
exports.config = {
8+
jasmineNodeOpts: {
9+
defaultTimeoutInterval: 5000000
10+
},
11+
seleniumAddress: 'http://hub-cloud.browserstack.com/wd/hub',
12+
commonCapabilities: {
13+
name: 'Data Flow Dashboard E2E Tests',
14+
'browserstack.user': process.env.BROWSER_STACK_USERNAME,
15+
'browserstack.key': process.env.BROWSER_STACK_ACCESS_KEY,
16+
'browserstack.local': true,
17+
'browserstack.debug': true
18+
},
19+
multiCapabilities: [
20+
{
21+
os: 'Windows',
22+
os_version: '10',
23+
browserName: 'Chrome',
24+
browser_version: '62.0',
25+
resolution: '1024x768'
26+
},
27+
{
28+
os: 'Windows',
29+
os_version: '10',
30+
browserName: 'Edge',
31+
browser_version: '16.0'
32+
}
33+
],
34+
35+
allScriptsTimeout: 160000,
36+
specs: [
37+
'./e2e/**/*.e2e-spec.ts'
38+
],
39+
directConnect: false,
40+
baseUrl: 'http://localhost:4200/',
41+
framework: 'jasmine',
42+
// Code to start browserstack local before start of test
43+
beforeLaunch: function(){
44+
console.log("Connecting local");
45+
return new Promise(function(resolve, reject){
46+
exports.bs_local = new browserstack.Local();
47+
exports.bs_local.start({'key': exports.config.commonCapabilities['browserstack.key'] }, function(error) {
48+
if (error) return reject(error);
49+
console.log('Connected. Now testing...');
50+
51+
resolve();
52+
});
53+
});
54+
},
55+
56+
// Code to stop browserstack local after end of test
57+
afterLaunch: function() {
58+
return new Promise(function(resolve, reject){
59+
exports.bs_local.stop(resolve);
60+
});
61+
},
62+
jasmineNodeOpts: {
63+
showColors: true,
64+
defaultTimeoutInterval: 30000,
65+
print: function() {}
66+
},
67+
onPrepare() {
68+
require('ts-node').register({
69+
project: 'e2e/tsconfig.e2e.json'
70+
});
71+
jasmine.getEnv().addReporter(new SpecReporter({ spec: { displayStacktrace: true } }));
72+
}
73+
};
74+
75+
// Code to support common capabilities
76+
exports.config.multiCapabilities.forEach(function(caps){
77+
for(var i in exports.config.commonCapabilities) caps[i] = caps[i] || exports.config.commonCapabilities[i];
78+
});

ui/protractor-saucelabs.conf.js

+73
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,73 @@
1+
// Protractor configuration file, see link for more information
2+
// https://github.com/angular/protractor/blob/master/lib/config.ts
3+
4+
const { SpecReporter } = require('jasmine-spec-reporter');
5+
6+
exports.config = {
7+
jasmineNodeOpts: {
8+
defaultTimeoutInterval: 5000000
9+
},
10+
sauceUser: process.env.SAUCE_USERNAME,
11+
sauceKey: process.env.SAUCE_ACCESS_KEY,
12+
multiCapabilities: [
13+
{
14+
name: 'E2E Safari/Mac',
15+
browserName: 'safari',
16+
platform: 'macOS 10.13',
17+
},
18+
{
19+
name: 'E2E Edge/Win10',
20+
browserName: 'MicrosoftEdge',
21+
platform: 'Windows 10',
22+
}
23+
],
24+
25+
allScriptsTimeout: 160000,
26+
specs: [
27+
'./e2e/**/*.e2e-spec.ts'
28+
],
29+
directConnect: false,
30+
baseUrl: 'http://localhost:4200/',
31+
framework: 'jasmine',
32+
beforeLaunch: function() {
33+
const q = require('q');
34+
const deferred = q.defer();
35+
startSauceConnect(deferred);
36+
return deferred.promise;
37+
},
38+
jasmineNodeOpts: {
39+
showColors: true,
40+
defaultTimeoutInterval: 30000,
41+
print: function() {}
42+
},
43+
onPrepare() {
44+
require('ts-node').register({
45+
project: 'e2e/tsconfig.e2e.json'
46+
});
47+
jasmine.getEnv().addReporter(new SpecReporter({ spec: { displayStacktrace: true } }));
48+
}
49+
};
50+
51+
function startSauceConnect(deferred) {
52+
var sauceConnectLauncher = require('sauce-connect-launcher');
53+
console.log('Launching Sauce Connect...')
54+
sauceConnectLauncher(
55+
{
56+
username: process.env.SAUCE_USERNAME,
57+
accessKey: process.env.SAUCE_ACCESS_KEY,
58+
// verbose: true,
59+
// logger: console.log,
60+
// tunnelIdentifier: 'npm-build',
61+
// doctor: false
62+
}, function (err, sauceConnectProcess) {
63+
if (err) {
64+
console.error('Error', err.message);
65+
}
66+
deferred.resolve();
67+
console.log("Sauce Connect ready");
68+
// sauceConnectProcess.close(function () {
69+
// console.log("Closed Sauce Connect process");
70+
// })
71+
}
72+
);
73+
};

0 commit comments

Comments
 (0)