Skip to content

Commit e060808

Browse files
author
Zdravko
authored
Merge pull request #152 from NativeScript/dtodorov/add-e2e-tests
Add e2e Appium tests
2 parents bed4e54 + 94d536c commit e060808

File tree

8 files changed

+349
-9
lines changed

8 files changed

+349
-9
lines changed

.travis.yml

Lines changed: 101 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,19 @@
11
branches:
22
only:
33
- master
4+
env:
5+
global:
6+
- ANDROID_PACKAGE_JS='seed-js.apk'
7+
- ANDROID_PACKAGE_FOLDER_JS=$TRAVIS_BUILD_DIR/demo/outputs
8+
- ANDROID_PACKAGE_NG='seed-ng.apk'
9+
- ANDROID_PACKAGE_FOLDER_NG=$TRAVIS_BUILD_DIR/demo-angular/outputs
10+
- ANDROID_SAUCE_STORAGE="https://saucelabs.com/rest/v1/storage/$SAUCE_USER"
11+
- IOS_PACKAGE_JS='seed-js.zip'
12+
- IOS_PACKAGE_FOLDER_JS=$TRAVIS_BUILD_DIR/demo/outputs
13+
- IOS_PACKAGE_NG='seed-ng.zip'
14+
- IOS_PACKAGE_FOLDER_NG=$TRAVIS_BUILD_DIR/demo-angular/outputs
15+
- IOS_SAUCE_STORAGE="https://saucelabs.com/rest/v1/storage/$SAUCE_USER"
16+
417
matrix:
518
include:
619
- stage: "Lint"
@@ -11,27 +24,64 @@ matrix:
1124
- stage: "Build and Test"
1225
env:
1326
- BuildAndroid="28"
27+
- Type="TypeScript"
1428
language: android
1529
os: linux
1630
jdk: oraclejdk8
1731
before_install: nvm install 10
1832
script:
19-
- cd src && npm run postclone gitHubUsername=TheGitHubUser pluginName=ThePlugin initGit=y includeTypescriptDemo=y includeAngularDemo=n && npm run tsc && cd ../demo
20-
- travis_wait travis_retry tns build android
33+
- cd src && npm run postclone gitHubUsername=TheGitHubUser pluginName=ThePlugin initGit=y includeTypeScriptDemo=y includeAngularDemo=n
34+
- npm run tsc
35+
- cd ../demo
36+
- travis_wait travis_retry tns build android --copy-to "$ANDROID_PACKAGE_FOLDER_JS/$ANDROID_PACKAGE_JS"
37+
- "curl -u $SAUCE_USER:$SAUCE_KEY -X POST -H 'Content-Type: application/octet-stream' $ANDROID_SAUCE_STORAGE/$ANDROID_PACKAGE_JS?overwrite=true --data-binary @$ANDROID_PACKAGE_FOLDER_JS/$ANDROID_PACKAGE_JS"
38+
- os: osx
39+
env:
40+
- BuildiOS="12.0"
41+
- Type="TypeScript"
42+
osx_image: xcode10.2
43+
language: node_js
44+
node_js: "10"
45+
jdk: oraclejdk8
46+
script:
47+
- cd src && npm run postclone gitHubUsername=TheGitHubUser pluginName=ThePlugin initGit=y includeTypeScriptDemo=y includeAngularDemo=n
48+
- npm run tsc
49+
- cd ../demo
50+
- travis_wait travis_retry tns build ios --copy-to "./outputs/demo.app"
51+
- cd $IOS_PACKAGE_FOLDER_JS && zip -r $IOS_PACKAGE_JS demo.app
52+
- "curl -u $SAUCE_USER:$SAUCE_KEY -X POST -H 'Content-Type: application/octet-stream' $IOS_SAUCE_STORAGE/$IOS_PACKAGE_JS?overwrite=true --data-binary @$IOS_PACKAGE_FOLDER_JS/$IOS_PACKAGE_JS"
53+
- os: linux
54+
env:
55+
- BuildAndroid="28"
56+
- Type="Angular"
57+
language: android
58+
jdk: oraclejdk8
59+
before_install: nvm install 10
60+
script:
61+
- cd src && npm run postclone gitHubUsername=TheGitHubUser pluginName=ThePlugin initGit=y includeTypeScriptDemo=n includeAngularDemo=y
62+
- npm run tsc
63+
- cd ../demo-angular
64+
- travis_wait travis_retry tns build android --copy-to "$ANDROID_PACKAGE_FOLDER_NG/$ANDROID_PACKAGE_NG"
65+
- "curl -u $SAUCE_USER:$SAUCE_KEY -X POST -H 'Content-Type: application/octet-stream' $ANDROID_SAUCE_STORAGE/$ANDROID_PACKAGE_NG?overwrite=true --data-binary @$ANDROID_PACKAGE_FOLDER_NG/$ANDROID_PACKAGE_NG"
2166
- os: osx
2267
env:
2368
- BuildiOS="12.0"
24-
- Xcode="10.0"
69+
- Type="Angular"
2570
osx_image: xcode10.2
2671
language: node_js
2772
node_js: "10"
2873
jdk: oraclejdk8
2974
script:
30-
- cd src && npm run postclone gitHubUsername=TheGitHubUser pluginName=ThePlugin initGit=y includeTypescriptDemo=y includeAngularDemo=n && npm run tsc && cd ../demo
31-
- travis_wait travis_retry tns build ios
75+
- cd src && npm run postclone gitHubUsername=TheGitHubUser pluginName=ThePlugin initGit=y includeTypeScriptDemo=n includeAngularDemo=y
76+
- npm run tsc
77+
- cd ../demo-angular
78+
- travis_wait travis_retry tns build ios --copy-to "./outputs/demo-angular.app"
79+
- cd $IOS_PACKAGE_FOLDER_NG && zip -r $IOS_PACKAGE_NG demo-angular.app
80+
- "curl -u $SAUCE_USER:$SAUCE_KEY -X POST -H 'Content-Type: application/octet-stream' $IOS_SAUCE_STORAGE/$IOS_PACKAGE_NG?overwrite=true --data-binary @$IOS_PACKAGE_FOLDER_NG/$IOS_PACKAGE_NG"
3281
- os: linux
3382
language: android
3483
env:
84+
- UnitTests="Android"
3585
- TestVersion="latest"
3686
jdk: oraclejdk8
3787
before_install:
@@ -46,14 +96,59 @@ matrix:
4696
- travis_wait travis_retry npm run test.android
4797
- os: osx
4898
env:
99+
- UnitTests="iOS"
49100
- TestVersion="latest"
50101
language: node_js
51102
node_js: "10"
52103
jdk: oraclejdk8
53104
osx_image: xcode10.2
54105
before_script:
55106
- cd seed-tests && npm i
56-
script: travis_wait travis_retry npm run test.ios
107+
script:
108+
- travis_wait travis_retry npm run test.ios
109+
- stage: "UI Tests"
110+
env:
111+
- Android="24"
112+
- Type="TypeScript"
113+
language: node_js
114+
os: linux
115+
node_js: "10"
116+
script:
117+
- npm i -g appium
118+
- cd seed-tests && npm i
119+
- travis_wait travis_retry npm run e2e -- --runType android24 --sauceLab --appPath $ANDROID_PACKAGE_JS
120+
- os: linux
121+
env:
122+
- Android="24"
123+
- Type="Angular"
124+
language: node_js
125+
os: linux
126+
node_js: "10"
127+
script:
128+
- npm i -g appium
129+
- cd seed-tests && npm i
130+
- travis_wait travis_retry npm run e2e -- --runType android24 --sauceLab --appPath $ANDROID_PACKAGE_NG
131+
- os: linux
132+
env:
133+
- iOS="12.0"
134+
- Type="TypeScript"
135+
language: node_js
136+
node_js: "10"
137+
script:
138+
- npm i -g appium
139+
- cd seed-tests && npm i
140+
- travis_wait travis_retry npm run e2e -- --runType sim12iPhoneX --sauceLab --appPath $IOS_PACKAGE_JS
141+
- os: linux
142+
env:
143+
- iOS="12.0"
144+
- Type="Angular"
145+
language: node_js
146+
node_js: "10"
147+
script:
148+
- npm i -g appium
149+
- cd seed-tests && npm i
150+
- travis_wait travis_retry npm run e2e -- --runType sim12iPhoneX --sauceLab --appPath $IOS_PACKAGE_NG
151+
57152

58153
android:
59154
components:
Lines changed: 128 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,128 @@
1+
{
2+
"android19": {
3+
"platformName": "Android",
4+
"platformVersion": "4.4",
5+
"deviceName": "Emulator-Api19-Default",
6+
"avd": "Emulator-Api19-Default",
7+
"lt": 60000,
8+
"newCommandTimeout": 720,
9+
"noReset": false,
10+
"fullReset": false,
11+
"app": ""
12+
},
13+
"android21": {
14+
"platformName": "Android",
15+
"platformVersion": "5.0",
16+
"deviceName": "Emulator-Api21-Default",
17+
"avd": "Emulator-Api21-Default",
18+
"lt": 60000,
19+
"newCommandTimeout": 720,
20+
"noReset": false,
21+
"fullReset": false,
22+
"app": ""
23+
},
24+
"android23": {
25+
"platformName": "Android",
26+
"platformVersion": "6.0",
27+
"deviceName": "Emulator-Api23-Default",
28+
"avd": "Emulator-Api23-Default",
29+
"lt": 60000,
30+
"newCommandTimeout": 720,
31+
"noReset": false,
32+
"fullReset": false,
33+
"app": ""
34+
},
35+
"android24": {
36+
"platformName": "Android",
37+
"platformVersion": "7.0",
38+
"deviceName": "Android GoogleAPI Emulator",
39+
"lt": 60000,
40+
"newCommandTimeout": 720,
41+
"noReset": true,
42+
"fullReset": false,
43+
"app": "",
44+
"idleTimeout": 120,
45+
"automationName": "Appium"
46+
},
47+
"android25": {
48+
"platformName": "Android",
49+
"platformVersion": "7.1",
50+
"deviceName": "Emulator-Api25-Google",
51+
"avd": "Emulator-Api25-Google",
52+
"lt": 60000,
53+
"newCommandTimeout": 720,
54+
"noReset": false,
55+
"fullReset": false,
56+
"app": ""
57+
},
58+
"android26": {
59+
"platformName": "Android",
60+
"platformVersion": "8.0",
61+
"deviceName": "Emulator-Api26-Google",
62+
"avd": "Emulator-Api26-Google",
63+
"lt": 60000,
64+
"newCommandTimeout": 720,
65+
"noReset": false,
66+
"fullReset": false,
67+
"app": ""
68+
},
69+
"android27": {
70+
"platformName": "Android",
71+
"platformVersion": "27",
72+
"deviceName": "Emulator-Api27-Google",
73+
"avd": "Emulator-Api27-Google",
74+
"lt": 60000,
75+
"newCommandTimeout": 720,
76+
"noReset": false,
77+
"fullReset": false,
78+
"app": ""
79+
},
80+
"android28": {
81+
"platformName": "Android",
82+
"platformVersion": "28",
83+
"deviceName": "Emulator-Api28-Google",
84+
"avd": "Emulator-Api28-Google",
85+
"lt": 60000,
86+
"newCommandTimeout": 720,
87+
"noReset": false,
88+
"fullReset": false,
89+
"app": ""
90+
},
91+
"sim.iPhone7": {
92+
"platformName": "iOS",
93+
"platformVersion": "/12.*/",
94+
"deviceName": "iPhone 7",
95+
"noReset": false,
96+
"fullReset": false,
97+
"app": ""
98+
},
99+
"sim.iPhone8": {
100+
"platformName": "iOS",
101+
"platformVersion": "/12*/",
102+
"deviceName": "iPhone 8",
103+
"noReset": false,
104+
"fullReset": false,
105+
"app": ""
106+
},
107+
"sim12iPhoneX": {
108+
"platformName": "iOS",
109+
"platformVersion": "12.0",
110+
"deviceName": "iPhone X",
111+
"appium-version": "1.9.1",
112+
"app": "",
113+
"noReset": true,
114+
"fullReset": false,
115+
"density": 3,
116+
"offsetPixels": 87,
117+
"idleTimeout": 120,
118+
"automationName": "Appium"
119+
},
120+
"sim.iPhoneXS": {
121+
"platformName": "ios",
122+
"platformVersion": "/12*/",
123+
"deviceName": "iPhone XS",
124+
"noReset": false,
125+
"fullReset": false,
126+
"app": ""
127+
}
128+
}

seed-tests/e2e/config/mocha.opts

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
--timeout 800000
2+
--recursive e2e
3+
--reporter mocha-multi
4+
--reporter-options mochawesome=-,mocha-junit-reporter=test-results.xml
5+
--exit

seed-tests/e2e/setup.ts

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
import { startServer, stopServer, ITestReporter, nsCapabilities, LogImageType } from "nativescript-dev-appium";
2+
const addContext = require('mochawesome/addContext');
3+
4+
const testReporterContext = <ITestReporter>{};
5+
testReporterContext.name = "mochawesome";
6+
/**
7+
* This folder should be the one provided in mocha.opts.
8+
* If omitted the default one is "mochawesome-report".
9+
* This is necessary because we need the logged images to be relatively
10+
* positioned according to mochawesome.html in the same folder
11+
*/
12+
testReporterContext.reportDir = "mochawesome-report";
13+
testReporterContext.log = addContext;
14+
testReporterContext.logImageTypes = [LogImageType.screenshots];
15+
nsCapabilities.testReporter = testReporterContext;
16+
17+
before("start server", async function () {
18+
nsCapabilities.testReporter.context = this;
19+
await startServer();
20+
});
21+
22+
after("stop server", async function () {
23+
await stopServer();
24+
});

seed-tests/e2e/tests.e2e.ts

Lines changed: 56 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,56 @@
1+
import { AppiumDriver, createDriver, SearchOptions, Direction, nsCapabilities } from "nativescript-dev-appium";
2+
import { isSauceLab, runType } from "nativescript-dev-appium/lib/parser";
3+
import { expect } from "chai";
4+
import "mocha";
5+
import { ok } from "assert";
6+
const fs = require('fs');
7+
const addContext = require('mochawesome/addContext');
8+
const rimraf = require('rimraf');
9+
const isSauceRun = isSauceLab;
10+
11+
12+
describe("sample scenario", () => {
13+
let driver: AppiumDriver;
14+
15+
before(async function(){
16+
nsCapabilities.testReporter.context = this;
17+
driver = await createDriver();
18+
driver.defaultWaitTime = 20000;
19+
let dir = "mochawesome-report";
20+
if (!fs.existsSync(dir)) {
21+
fs.mkdirSync(dir);
22+
}
23+
rimraf('mochawesome-report/*', function () { });
24+
});
25+
26+
after(async function () {
27+
if (isSauceRun) {
28+
driver.sessionId().then(function (sessionId) {
29+
console.log("Report: https://saucelabs.com/beta/tests/" + sessionId);
30+
});
31+
}
32+
await driver.quit();
33+
console.log("Driver successfully quit");
34+
});
35+
36+
afterEach(async function () {
37+
if (this.currentTest.state && this.currentTest.state === "failed") {
38+
let png = await driver.logScreenshot(this.currentTest.title);
39+
fs.copyFile(png, './mochawesome-report/' + this.currentTest.title + '.png', function (err) {
40+
if (err) {
41+
throw err;
42+
}
43+
console.log('Screenshot saved.');
44+
});
45+
addContext(this, './' + this.currentTest.title + '.png');
46+
}
47+
});
48+
49+
it("should find an element by text", async function () {
50+
const alertTitle = await driver.findElementByText("Alert", SearchOptions.contains);
51+
expect(alertTitle).to.exist;
52+
53+
const okBtn = await driver.findElementByText("OK", SearchOptions.contains);
54+
await okBtn.click();
55+
});
56+
});

seed-tests/e2e/tsconfig.json

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
{
2+
"compilerOptions": {
3+
"module": "commonjs",
4+
"target": "es6",
5+
"experimentalDecorators": true,
6+
"emitDecoratorMetadata": true,
7+
"importHelpers": false,
8+
"types": [
9+
"mocha",
10+
"chai",
11+
"node"
12+
],
13+
"lib": [
14+
"es2015",
15+
"dom"
16+
],
17+
"baseUrl": "."
18+
}
19+
}

0 commit comments

Comments
 (0)