这是一个系列文章,完整的合集链接:Appium 开发环境搭建合集
通过Appium 开发环境搭建(1)-- 配置源码运行环境,我们让 appium 通过源码跑了起来,但对于开发这还不够。在修改完源代码后,我们必须 运行一些基础的测试来保证我们的代码没有破坏原有的功能。下面我们来看看如何执行 appium 的中已经写好的自动化测试用例。
appium 有一个很简单且执行速度很快的单元测试。只需要一条命令就能执行:
grunt unit
如果提示没有 grunt 命令,执行下面语句:
npm install -g mocha
npm install -g grunt-cli
执行结果大致如下:
$ grunt unit
Running "exec:gulp-test-unit" (exec) task
[21:57:32] Using gulpfile ~/Develop/appiumSourceCode/appium/gulpfile.js
[21:57:32] Starting 'test-unit'...
10 -_-_-_-_-_-_,------,
0 -_-_-_-_-_-_| /\_/\
0 -_-_-_-_-_-^|__( ^ .^)
-_-_-_-_-_- "" ""
10 passing (67ms)
>> error: Permission to start activity denied.
>> error: Activity used to start app doesn't exist or cannot be launched! Make sure it exists and is a launchable activity
1 -__,------,
0 -__| /\_/\
0 -_~|_( ^ .^)
-_ "" ""
1 passing (12ms)
warn: [DEPRECATED] The name locator strategy has been deprecated and will be removed. Please use the accessibility id locator strategy instead.
18 -_-_-_-_-_-_-_-_-_-_,------,
0 -_-_-_-_-_-_-_-_-_-_| /\_/\
0 -_-_-_-_-_-_-_-_-_-^|__( ^ .^)
-_-_-_-_-_-_-_-_-_- "" ""
18 passing (49ms)
warn: Converting cap app to string, since it was an object. This might be a user error. Original value was: {"some":"object"}
warn: Converting cap stringFalseCap from string to boolean. This might cause unexpected behavior.\
warn: Converting cap stringTrueCap from string to boolean. This might cause unexpected behavior.
10 -_-_-_-_-_-_,------,
0 -_-_-_-_-_-_| /\_/\
0 -_-_-_-_-_-^|__( ^ .^)
-_-_-_-_-_- "" ""
10 passing (39ms)
warn: [DEPRECATED] The old function has been deprecated and will be removed. Please use the new function instead.
warn: [DEPRECATED] The old function has been deprecated and will be removed. Please use the new function instead.
warn: [DEPRECATED] The old function has been deprecated and will be removed. Please use the new function instead.
warn: [DEPRECATED] The YeOlde function has been deprecated and will be removed. Please use the Moderne function instead.
warn: [DEPRECATED] The old function has been deprecated and will be removed. Please use the new function instead.
warn: [DEPRECATED] You used 1 deprecated capabilities during this session. Please check the logs as they will be removed in a future version of Appium.
9 -_-_-_-_-__,------,
0 -_-_-_-_-__| /\_/\
0 -_-_-_-_-_~|_( ^ .^)
-_-_-_-_-_ "" ""
9 passing (66ms)
9 -_-_-_-_-__,------,
0 -_-_-_-_-__| /\_/\
0 -_-_-_-_-_~|_( ^ .^)
-_-_-_-_-_ "" ""
9 passing (26ms)
39 -_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-__,------,
0 -_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-__| /\_/\
0 -_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_~|_( ^ .^)
-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_ "" ""
39 passing (78ms)
info: Will try to parse the plist file as XML
info: Will try to parse the plist file as XML
warn: Could not parse app unknown_file assuming it doesn't exist
6 -_-_-_-_,------,
0 -_-_-_-_| /\_/\
0 -_-_-_-^|__( ^ .^)
-_-_-_- "" ""
6 passing (658ms)
1 -__,------,
0 -__| /\_/\
0 -_~|_( ^ .^)
-_ "" ""
1 passing (6ms)
info: Shutting down appium session
info: Found an existing session to clobber, shutting it down first...
info: Shutting down appium session
info: Old session shut down OK, proceeding to new session
info: Found an existing session to clobber, shutting it down first...
info: Shutting down appium session
info: Old session shut down OK, proceeding to new session
info: Found an existing session to clobber, shutting it down first...
info: Shutting down appium session
info: Old session shut down OK, proceeding to new session
info: Found an existing session to clobber, shutting it down first...
info: Shutting down appium session
info: Old session shut down OK, proceeding to new session
info: Found an existing session to clobber, shutting it down first...
info: Shutting down appium session
info: Old session shut down OK, proceeding to new session
info: Found an existing session to clobber, shutting it down first...
info: Shutting down appium session
info: Old session shut down OK, proceeding to new session
info: Found an existing session to clobber, shutting it down first...
info: Shutting down appium session
info: Old session shut down OK, proceeding to new session
info: Found an existing session to clobber, shutting it down first...
info: Shutting down appium session
info: Old session shut down OK, proceeding to new session
info: Found an existing session to clobber, shutting it down first...
info: Shutting down appium session
info: Old session shut down OK, proceeding to new session
info: Found an existing session to clobber, shutting it down first...
info: Shutting down appium session
info: Old session shut down OK, proceeding to new session
3 -_-__,------,
0 -_-__| /\_/\
0 -_-_~|_( ^ .^)
-_-_ "" ""
3 passing (538ms)
[21:57:35] Finished 'test-unit' after 3.53 s
Done, without errors.
简单分析一下:
Grunt是一个 javascript 任务执行器(task runner),主要用来自动化执行一些任务 (task),如部署、测试等。这里使用grunt unit
执行了名叫 unit 的任务。
所有 grunt 的 task 的作用和用法可以看 appium 的说明:https://github.com/appium/appium/blob/master/docs/en/contributing-to-appium/grunt.md
appium 也有不少自动化的功能性测试。可通过以下命令执行所有的测试
bin/test.sh
也可以自己选择要执行某个类别的测试。如:
bin/test.sh --android
bin/test.sh --ios
bin/test.sh --ios7
注意:所有功能测试执行前 必须先通过node .
打开从源码运行的 appium server, 并执行./reset.sh --dev
来下载和配置所有需要用到的测试 app。
执行
reset.sh
中有一个小问题,可能会导致TestApp
build 失败(执行结果是 success 的,但是运行 functional test 时会报错)。reset.sh
中运行 ios 的 build TestApp 的相关语句为203 echo "* Cleaning/rebuilding iOS test app: TestApp" 204 run_cmd "$grunt" buildApp:TestApp:iphonesimulator:$sdk_ver
其中
$sdk_ver
通过xcrun --sdk iphonesimulator --show-sdk-version 2>/dev/null
获取。因为此处的iphonesimulator
和$sdk_ver
之间多了一个冒号:
,所以实际上 build app 时使用的是默认的iphonesimulator
,而不是指定 sdk 的 simulator,如iphonesimulator8.1
。在我的环境下这导致了TestApp.app
无法 build 成功,最终我是手动执行grunt buildApp:TestApp:iphonesimulator8.1
来 build 这个 app 的。
20150226 update:sdk 参数直接使用iphonesimulator
等同于使用最新的 sdk。例如你的 mac 上最新的 sdk 是 8.1,那么iphonesimulator
等同于iphonesimulator8.1
。不过目前不是很清楚为啥这里会有两种用法(build WebView.app 时用的是run_cmd "$grunt" buildApp:TestApp:iphonesimulator$sdk_ver
)
参考资料:http://stackoverflow.com/questions/4314804/parameter-for-xcodebuild-for-using-latest-sdk/5596988#5596988
后面运行用例的过程中如果出现红字(failed), 且 appium server 的 log 里面说明找不到某个 app,可以使用文章末尾 Q&A 的方法解决。如果执行过程中出现其他问题,欢迎大伙跟帖提出,我会补充到 Q&A 中
为了方便大家了解大致有多少种 functional test 可以执行,这里简单列举一下 test.sh 的所有参数 (这里吐槽一下,竟然不能使用test.sh --help
这种形式获得所有参数...):
--android
--android-chrome
--selendroid
--gappium
--ios6
--ios7
--ios71
--ios8
--ios81
--ios82
--no-xcode-switch
--real-device
如果没有添加任何参数,默认运行所有测试。
如果只是想执行单独的测试,可以使用下面的命令:
DEVICE=ios81 mocha -t 60000 -R spec test/functional/ios/testapp/simple-specs.js
test/functional/ios/uicatalog
是一个文件夹):
DEVICE=ios81 mocha -t 60000 -R spec --grep "alert" test/functional/ios/uicatalog
注意:ios71
, ios6
, android
, selendroid
,但实际上测试ios81
也是可以的。所有测试用例都放在appium/test
文件夹下。大家有兴趣可以自己进去研究一下。大部分测试用例都是使用mocha框架写的。
appium/test/unit
,funtional test 的用例放在appium/test/functional
中./reset.sh
里执行的任务)都是使用grunt
来执行的,因此出错后其实我们也可以单独使用 grunt 运行对应 task。这也是为什么./reset.sh
的出错提示里会说用--force
来强制执行,但加入--force
却没有效果的原因(--force
没有传递到实际执行 task 的语句里面)。bin/test.sh --ios81
过程中很多用例出现红色的"before all" hook
,appium server 提示App paths need to be absolute...
.app
(ios) 或.apk
(android) 的应用安装文件。./reset.sh --dev
重新下载和 build 所有测试 app。如果还是不成功,请执行对应的 buildApp 任务。此处以 ios 的TestApp.app
应用为例:
执行
grunt buildApp:TestApp:iphonesimulator8.1
来编译TestApp
(此处的 simulator 版本请按照自己环境进行配置,可通过xcodebuild -showsdks
查看当前可以使用的所有 simulator 版本),然后再去执行 ios 的功能测试用例。