如何使用UIAutomation进行iOS 自动化测试(Part II)
接着上一篇《如何使用UIAutomation进行iOS 自动化测试(Part I)》
3. 经验分享(让你生活变得更简单)
类库Tune-up介绍
现在你应该基本上知道如何编写测试代码了。但你慢慢地会发现,你会经常写到一些重复的,冗余的,黏糊糊的代码,像下面一样:
var target = UIATarget.localTarget();
var app = target.frontMostApp();
var window = app.mainWindow();
这也是为什么我们会用到一个小的Javascript类库来简化我们写的UIAutomation测试的原因。你可以去 https://github.com/alexvollmer/tuneup_js获取这个类库,然后将它复制到你的测试目录下面。现在让我们使用Tune-Up类库来重新编写我们的Test1.js:
#import "tuneup/tuneup.js"test("Test 1", function(target, app) {var window = app.mainWindow();app.logElementTree();//-- select the elementsUIALogger.logMessage( "Select the first tab" );var tabBar = app.tabBar();var selectedTabName = tabBar.selectedButton().name();if (selectedTabName != "First") {tabBar.buttons()["First"].tap();}//-- tap on the text fielsUIALogger.logMessage( "Tap on the text field now" );var recipeName = "Unusually Long Name for a Recipe";window.textFields()[0].setValue(recipeName);target.delay( 2 );//-- tap on the text fielsUIALogger.logMessage( "Dismiss the keyboard" );app.logElementTree();app.keyboard().buttons()["return"].tap();var textValue = window.staticTexts()["RecipeName"].value();assertEquals(recipeName, textValue);
});
Tune-Up可以避免你编写重复的代码,同时还给你提供了各种好用的断言方法:
ssertTrue(expression, message),
assertMatch(regExp, expression, message),
assertEquals(expected, received, message),
assertFalse(expression, message),
assertNull(thingie, message),
assertNotNull(thingie, message),
assertNull(thingie, message),
assertNotNull(thingie, message)
等等
你也可以很容易的扩展这个类库:例如,你可以通过将方法加入到uiautomation-ext.js:里面来为UIATarget类加一个logDevice方法:
extend(UIATarget.prototype, {logDevice: function(){UIALogger.logMessage("Dump Device:");UIALogger.logMessage(" model: " + UIATarget.localTarget().model());UIALogger.logMessage(" rect: " + JSON.stringify(UIATarget.localTarget().rect()));UIALogger.logMessage(" name: "+ UIATarget.localTarget().name());UIALogger.logMessage(" systemName: "+ UIATarget.localTarget().systemName());UIALogger.logMessage(" systemVersion: "+ UIATarget.localTarget().systemVersion());}
});
然后当你调用target.logDevice()就可以看到:
Dump Device:
model: iPhone Simulator
rect: {"origin":{"x":0,"y":0},"size":{"width":320,"height":480}}
name: iPhone Simulator
导入外部脚本
你也可以看到如何在一个脚本文件里引用另一个脚本,即通过#import指令。因此,你可以创建多个测试文件,然后将它们通过导入到单个文件的方式来链接并调用它们:
#import "Test1.js"
#import "Test2.js"
#import "Test3.js"
#import "Test4.js"
#import "Test5.js"
使用强大的命令行
如果你想让你的测试代码自动的运行起来,你还可以通过命令行来启动测试。其实,我比较推荐这种方式,而不是使用Instruments的图形界面程序。因为,Instruments的图形界面程序比较慢,而且即使你的测试代码跑完了它也还是会一直运行着。而通过命令行来启动和运行测试代码更快,它会在跑完测试后自动的停止。
为了可以在命令行终端运行你的脚本,你需要知道你设备的UDID和类型:
instruments -w your_ios_udid -t
/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/Library/Instruments/PlugIns/AutomationInstrument.bundle/Contents/Resources/Automation.tracetemplate
name_of_your_app -e UIASCRIPT absolute_path_to_the_test_file
例如,使用我自己的机子,就这么写的:
instruments -w a2de620d4fc33e91f1f2f8a8cb0841d2xxxxxxxx -t
/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/Library/Instruments/PlugIns/AutomationInstrument.bundle/Contents/Resources/Automation.tracetemplate
TestAutomation -e UIASCRIPT
/Users/jc/Documents/Dev/TestAutomation/TestAutomation/TestUI/Test-2.js
如果你使用的Xcode版本低于4.3的话,你需要这样写:
instruments -w your_ios_device_udid -t /Developer/Platforms/iPhoneOS.platform/Developer/Library/Instruments/PlugIns/AutomationInstrument.bundle/Contents/Resources/Automation.tracetemplate TestAutomation -e UIASCRIPT /Users/jc/Documents/Dev/TestAutomation/TestAutomation/TestUI/Test-2.js
一个小提示,不要忘了关闭你设备的密码验证,否则你会看到这样的日志信息的:remote exception encountered : ’device locked : Failed to launch process with bundle identifier ’com.manbolo.testautomation’. 的确,因为UIAutomation根本不知道你的密码啊。
命令行终端同样可以在模拟器上使用,但你需要知道待测应用程序在文件系统中的绝对路径。模拟器将目录~/Library/Application Support/iPhone Simulator/5.1/ “模拟”成了设备的文件系统。在这个目录下,你可以找到一个包含装在模拟器上的所有应用程序的沙盒的Applications文件夹。定位到TestAutomation程序的目录,然后:
instruments -t /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/Library/Instruments/PlugIns/AutomationInstrument.bundle/Contents/Resources/Automation.tracetemplate "/Users/jc/Library/Application Support/iPhone Simulator/5.1/Applications/C28DDC1B-810E-43BD-A0E7-C16A680D8E15/TestAutomation.app" -e UIASCRIPT /Users/jc/Documents/Dev/TestAutomation/TestAutomation/TestUI/Test-2.js
最后,如果你没有指定日志输入到哪里的话,你的测试结果会被放到你命令行当前指定(工作)的目录下。你可以通过加入 -e UIARESULTSPATH results_path 参数来指定日志输入目录。
我没有成功的将多个测试脚本并行着在命令行中运行起来。但是你可以将你的测试脚本串连进来,有一整晚去跑它,这样就真正的实现了“在你睡着的时候”,就完成了对应用程序的测试。
使用录制交互功能
除了手动的编写脚本,你还可以直接在设备上或者模拟器上录制脚本,然后替换掉原来的。下面是步骤:
1. 启动Instruments (⌘I)
2. 创建一个新的脚本
3. 选择脚本编辑器
4. 在脚本编辑器的底端,你是否看到了一个红色的按钮?点击它!
5. 现在,你可以操作你的应用程序;你将看到录制的交互操作出现在脚本窗口(甚至旋转事件)。点击方形按钮来停止录制。
当遇到问题时,加上“UIATarget.delay(1);”
当你在编写脚本的时候,你总是在与时间,动画打交道。UIAutomation有很多方式去获取控件元素,然后等待它们变为可用状态,即使有时候它们还没有显示出来,但根据这篇文档里提到的,最好的建议是:
当遇到问题时,加上UIATarget.delay(1);!
4. 高级交互
处理非预期和预期的提示框(alerts)
在写自动化测试过程中,处理提示框是很难的一件事情:你已经很认真的写好了你的测试用例,然后在你准备睡觉之前将它跑起来,然后,到第二天早上,你发现你的测试用例被一个未知消息提示框给毁了。然而,UIAutomation帮助你处理了这种情况。
通过下面代码来实现:
UIATarget.onAlert = function onAlert(alert){var title = alert.name();UIALogger.logWarning("Alert with title ’" + title + "’ encountered!");return false; // use default handler
}
它返回一个false,UIAutomation会自动的帮你销毁UIAlertView窗口,因此提示框就不会再影响你的测试了。你的测试脚本就永远不会有提示框弹出了。但是提示框可能是你应用程序的一部分,涉及到你测试的流程,所以,有时候,你不希望它被自动的处理掉。这时,你可以根据提示框的标题来决定,点击某个按钮,然后返回true。通过返回true,你向UIAutomation指定这个提示框必须作为测试的一部分来考虑。
例如,如果你想当提示框的标题为“Add Something”时,点击“Add”按钮,你可以这么写:
UIATarget.onAlert = function onAlert(alert) {var title = alert.name();UIALogger.logWarning("Alert with title ’" + title + "’ encountered!");if (title == "Add Something") {alert.buttons()["Add"].tap();return true; // bypass default handler}return false; // use default handler
}
容易吧?
多任务
测试你的应用程序的多任务是非常容易的事:假设你想测试每次启动一个疯狂的后台进程,将程序放到后台执行,并进入(void)applicationWillEnterForeground:(UIApplication *)application选择器代码段,你可以通过下面的代码来将它推至后台,然后等待10秒后自动返回活动状态。.
UIATarget.localTarget().deactivateAppForDuration(10);
deactivateAppForDuration(duration) 方法会暂停测试脚本的执行,模拟用户点击Home按钮,(即将程序放到后台),等待,然后为你重新激活程序和测试脚本,就这么一行代码而已!
屏幕方向
最后,你可以模拟你的iPhone的旋转方向。也是很直观很简单:
var target = UIATarget.localTarget();
var app = target.frontMostApp();
// set landscape left
target.setDeviceOrientation(UIA_DEVICE_ORIENTATION_LANDSCAPELEFT);
UIALogger.logMessage("Current orientation is " + app.interfaceOrientation());
// portrait
target.setDeviceOrientation(UIA_DEVICE_ORIENTATION_PORTRAIT);
UIALogger.logMessage("Current orientation is " + app.interfaceOrientation());
5. 总结
有用的链接
这篇文章有点儿长,但我希望你们能见识到UIAutomation是很强大的,且你的应用程序是可以得到质量的保障的。网上没有太多的UIAutomation的资料,但我还是列出了很多链接,也许能帮到你。
- http://cocoamanifest.net/articles/2011/05/uiautomation-an-introduction.html,http://cocoamanifest.net/articles/2011/07/ui-automation-part-2-assertions-and-imports.html 和 http://cocoamanifest.net/articles/2011/11/changes-to-ui-automation-in-ios-5.html: 非常好的UIAutomation系列的文章
- http://mobilecoder.wordpress.com/2010/11/08/iphoneipodipad-automation-basics: 非常不错的UIAutomation教程,值得阅读!
- http://www.juddsolutions.com/downloads/UnitAndFunctionalTestingForiOSPlatform.pdf: 很高深的单元测试和UI自动化测试的介绍。第70页里提到的“当遇到问题时,加上UIATarget.delay(1);!”会让你收获很大的。
- http://guerratopia.com/en/introduction-to-automating-ui-testing-in-ios: 非常好的介绍教程
- http://jojitsoriano.wordpress.com/2011/06/03/references-on-unit-testing-ui-automation-for-ios-applications: 很多关于单元测试和UI自动化测试的链接
当然还有:
- Apple documentation on UIAutomation
- UIAutomation in Apple Instruments documentation
- WWDC 2010 - Session 306 - Automating User Interface Testing with Instruments
你需要一个免费的开发者账号去访问这些资源。
一个视频
在介绍完UIAutomation之后,我不反对向你们展示我们是如何使用在Meon中使用 UIAutomation的一段小视频。我们使用了各种测试,在这个视频中,我们测试了玩家可以从0级玩到120级。帮帮我,我的iPhone还活着呢!
http://player.vimeo.com/video/39888743?title=0&byline=0&portrait=0
jc
本文由知平软件的Dawson Liu翻译,转载请注明出处。
知平软件致力于移动平台自动化测试技术的研究,我们希望通过向社区贡献知识和开源项目,来促进行业和自身的发展。
转载于:https://www.cnblogs.com/vowei/archive/2012/08/17/2644158.html
如何使用UIAutomation进行iOS 自动化测试(Part II)相关推荐
- 如何使用UIAutomation进行iOS 自动化测试(初学者)
写在前面 研究iOS的自动化测试也有些日子了,刚开始的时候,一直苦于找不到什么好的资料,只能从Apple的官网查阅相关的API文档,只可惜,Apple对开发者来说实在是不怎么友好,文档写得相当的粗略, ...
- 如何使用IOS自动化测试工具UIAutomation
这篇文章主要介绍了UIAutomation使用实例.应用技巧.基本知识点总结和需要注意事项,具有一定的参考价值 第一部分: 熟悉Instruments的UIAutomation. 第二部分: 控件的获 ...
- 最新出炉--IOS自动化测试环境搭建(Python Java)
一.前言 IOS的App自动化测试与Android的一样,也可以用appium来进行.但是IOS自动化依赖苹果的osx系统.Xcode构建等,且封闭的系统需要苹果开发者账号才可以驱动真机.Appium ...
- iOS自动化测试辅助工具--Reveal配置及使用
iOS自动化测试中,最关键的问题就是UI控件元素的识别,Xcode中的UIAutomation可以辅助做这个工作,但是使用时,需要启动Instrument,并启动录制脚本,比较麻烦. 下面为大家介绍另 ...
- iOS自动化测试第一季-金阳光-专题视频课程
iOS自动化测试第一季-14288人已学习 课程介绍 iOS自动化测试初级 课程收益 适合人群 1.想了解iOS自动化测试的人员 2.从事 无线测试.移动互联网测试.手机测试 ...
- iOS自动化测试的那些干货
前言 如果有测试大佬发现内容不对,欢迎指正,我会及时修改. 大多数的iOS App(没有持续集成)迭代流程是这样的 也就是说,测试是发布之前的最后一道关卡.如果bug不能在测试中发现,那么bug 就会 ...
- iOS自动化测试(一)-技术方案、环境配置与疯狂踩坑
移动端的自动化测试,最常见的就是Android自动化测试,IOS相较于Android要安全稳定的多,但是IOS也是一个需要测试的方向,作为测试,不认真测一下心里还是过意不去,只是我个人觉得Androi ...
- Windows实现appium+iOS自动化测试
在前面的文章介绍了Windows上安装配置tidevice,环境搭建好后就实现了在Windows运行iOS自动化的第一步,接下来本文重点介绍在Windows上如何运行iOS自动化测试. 如果没有安装好 ...
- 芈珺:iOS自动化测试工具总览
2019独角兽企业重金招聘Python工程师标准>>> 芈珺:iOS自动化测试工具总览 从实用性的角度,剖析常见的iOS自动化测试工具,在学会使用自动化测试工具的同时,学会工具的设计 ...
- 【Mac + Appium + Python3.6学习(四)】之常用的IOS自动化测试API总结
环境: Appium:1.9.1 Appium-desktop:1.7.1 Xcode:10.0 IOS:iPhone5S(10.3.3) Mac:10.13.6 ①获取手机屏幕size:长.宽 &l ...
最新文章
- pandas to_json转换时强制中文而不是unicode
- 什么是SQL 注入?
- IE6-IE11兼容性问题列表及解决办法
- U-Boot-2009-03移植笔记(移植准备)
- 为了帮粉丝完成毕业设计,我发现了一款私活神器
- thinkphp mysql exp_thinkphp备份数据库的方法分享
- 超低代码拓荒记 | 工业互联网新边疆
- Django之ModelForm详解
- sql 2008 清空数据库日志
- 信号与系统实验感想 matlab,信号与系统实验(信号与系统matlab实验报告)
- tail关键字查询日志
- 家庭数据中心-私有云服务器定义和选择
- java输入一个整数对应英文星期_C语言实验——输入数字星期,输出英文(switch语句)...
- 程序员工作三年晒出工资条,直言加班太累了,网友评论炸锅
- iOS 通讯录-获取联系人属性
- CH343芯片应用—硬件设计指南
- 揭秘青提WiFi分销小程序到底有多赚钱?商家的宝贝代理的吸金利器
- 圣诞节要来了,程序员女友用Python画圣诞树的浪漫代码作为最好的礼物
- Gruobi多目标规划
- 基于Android9.0,了解启动流程
热门文章
- kafka--Struct Streaming--hdfs案例
- OSChina 周一乱弹 —— 有钱人的故事真让人心动
- div水平居中和垂直居中
- Java-20180419
- Android各版本代号、版本号、API/NDK级别、发布时间及市场份额
- Oracle结构化查询语言(Structured Query Language)
- asp fso的神奇功能
- 【源码阅读】Java集合之一 - ArrayList源码深度解读
- 752. [BJOI2006] 狼抓兔子
- [转载] Comet:基于 HTTP 长连接的“服务器推”技术