Tool to run Titanium mobile tests in Appium.
appium-doctor
; that's it.npm install
.appium-doctor
: [sudo] npm install -g appium-doctor
.appium-doctor
to ensure your machine is properly setup for appium testing.node run.js
tests
directory.node run.js --suites <suites>
node run.js --suites Slider/ios.js -> run only the iOS Slider test suite
node run.js --suites Slider/ios.js,Slider/android.js -> run both the iOS and Android slider test suites.
node run.js --suites <suites> --use-sdk <ti_sdk>
ti_sdk
.node run.js --suites <suites> --more-logs
Below is the complete list of flags:
Options:
-h, --help output usage information
--suites <suites> comma-delimited string of valid test suites; otherwise, run all tests
--use-sdk <ti_sdk> build all test apps with the specified Titanium SDK
--more-logs enables more logging; this becomes very noisy
All test suites live in the tests
directory and should have the following folder structure:
tests/
|--- suite_name/
|--- test_app/
|--- platform.js
|--- platform2.js
...
Info:
suite_name
should be an API supported by Titanium SDK or Hyperloop e.g. Slider
.test_app
should be a Titanium Classic, Alloy, or Hyperloop enabled project.platform.js
is a mocha file that will execute test cases (via Appium) in the test_app
on the designated mobile platform.platform.js
file name is a valid platform (ios.js
or android.js
), since it tells this tool which mobile platform to use when: installing the test_app
and running the tests.The test_config.js
file (which lives at the root of this project) contains information about all the test suites and which Appium server to connect to.
High-level notes:
module.exports = {
// this will connect to the local running appium server; you can leave as-is
server: {
host: 'localhost',
port: 4723
},
// this tracks all the test suites (per platform) in the 'tests' directory
tests: {
ios: {
// these are properties straight from appium and more are defined here:
// https://github.com/appium/appium/blob/master/docs/en/writing-running-appium/default-capabilities-arg.md
desiredCapabilities: {
automationName: 'XCUITest' // leave as-is for ios
},
// the suite_name folder should exist in the 'tests' directory
suite_name: {
proj: 'SAMPLE', // name of the 'test_app'
// list of simulators you want the test app to run against
testDevices: [
{
deviceName: 'iPhone 7 Plus', // the simulator created in xcode
platformVersion: '10.2' // the platform version associated with the simulator
},
...
]
},
suite_name2: { ... }
...
},
android: {
desiredCapabilities: {
automationName: 'Appium' // leave as-is for android
},
suite_name: {
proj: 'SAMPLE',
// these two properties are needed when testing against android
appPackage: 'com.company.name',
appActivity: '.SomeActivity',
// list of genymotion emulators you want the test app to run against
testDevices: [
{
deviceName: 'Custom Phone - 6.0.0 - API 23 - 768x1280', // the genymotion emulator created in the genymotion app
platformVersion: '6.0' // the platform version associated with the emulator
},
...
]
}
}
// other platforms can be added in the future
}
};
Actual:
module.exports = {
server: {
host: 'localhost',
port: 4723
},
tests: {
ios: {
desiredCapabilities: {
automationName: 'XCUITest',
noReset: true
},
Slider: {
proj: 'KitchenSink',
testDevices: [
{
deviceName: 'iPhone 7 Plus',
platformVersion: '10.2'
},
{
deviceName: 'iPhone 7',
platformVersion: '10.1'
}
]
}
},
android: {
desiredCapabilities: {
automationName: 'Appium',
noReset: true
},
Slider: {
proj: 'KitchenSink',
appPackage: 'com.appcelerator.kitchensink',
appActivity: '.KitchensinkActivity',
testDevices: [
{
deviceName: 'Custom Phone - 6.0.0 - API 23 - 768x1280',
platformVersion: '6.0'
},
{
deviceName: 'Custom Phone - 7.0.0 - API 24 - 768x1280',
platformVersion: '7.0'
}
]
}
}
}
};
To write the Appium test cases, you will need to be familiar with mocha and Promises. Look at https://github.com/appcelerator/qe-appium/tree/master/test for examples.
Couple notes about those examples vs these test suites:
driver
and webdriver
property is exposed to the test suite through the global
variable.
global
variable contains curDevice
property. This has information about the current running device (name
) and which version (ver
).run.js
is the entry point file and contains the main loop, which does the following:
runAppium()
- launches the local Appium server.buildTestApps()
- if --use-sdk
flag is passed, then build all the test apps before moving onto the next task.createTests()
- create a data structure from --suites
and loop through the data structure. While looping:
launchGeny()
- if the test app needs to be tested on an Android platform, launch the designated Genymotion emulator first. iOS simulators will be launched in the next step by Appium.startClient()
- after the simulator/genymotion is launched, install the test app to the device and connect to the Appium local server.new Mocha().addFile().run()
- run the associated mocha test suite.stopClient()
- after a mocha test suite is finished running, disconnect the mobile device from the Appium local server. Depending on the desiredCapabilities
, iOS simulators can be left running or killed.quitGeny()
- if a Genymotion emulator is launched, gracefully kill the process.killAppium()
- after all the test suites are executed, kill the Appium local server.