首页 > 读书学房产知识

uiautomation(uiautomation 被放弃)

如何获得uiautomation的xml文件

一、软件安装

首先通过appstore下载安装Xcode开发工具,当前编写文档时最新版本为4.5.1

二、通过Xcode工具编写运行测试脚本

说明:如果是在IOS模拟器上运行测试用例,需要有被测试应用的源代码才有权限把应用安装到模拟器中,当前示例中使用了自己编写的一个简单Iphone应用,大家也可以直接在网上搜索一个开源的应用即可。

1、当你有了一个应用的源代码之后,在Xcode工具中,首先选中被测应用,然后点击菜单栏中的“Product-Profile”,则会弹出Instruments工具,在弹出的工具中选择IOS Simulator-》Automation,然后点击Profile

2、在弹出的Automation工具中选择需要测试的项目,同时在Add-》Create添加测试脚本,点击Create后,在中间区域会出现编写测试脚本的区域,在中间添加以下脚本

//获取当前window对象

var target= UIATarget.localTarget();

var app= target.frontMostApp();

var window= app.mainWindow();

//打印除当前界面的控件数信息

target.logElementTree();

具体的API参考官方文档

3、点击左上角的Record按钮则开始运行测试用例,运行完成后在工具的中间位置,原来编写代码的地方会出现运行结果的log日志,我们在刚才的代码中

编写了target.logElementTree(),这句API会打印出当前页面的控件信息,可以在日志中看到树形结构的控件,点击可以查看控件的一

些属性,这个API在编写代码的过程中也会比较有用。

另外如果想切换到编写代码的页面,可以点击图中红框处的进行切换。

注意:通过点击Record来运行测试用例时,代码执行完成后不会自动停止,所以需要手工的点击一下左上角的Stop按钮来停止运行。

4、录制回放功能

如果你是第一次编写自动测试脚本,可能很多API都不知道,这时候你可以先使用一下UIAutomation的录制回访功能,参考一下大概是怎么来编写测试用例的,当然你也会发现通过录制回访会有很多重复的代码,当你熟悉之后就可以不用录制回访来编写脚本了。

首先你切换到编写脚本的界面,这时候会看到中间的下方会有一个红色按钮,你点击一下就开始录制了,这时候会自动帮你在模拟器中启动起来被测应用,然后你在模拟器上继续点击*作的步骤都会被记录下来。

中间红色区域就是自动生成的代码,你可以点击代码中的箭头能看到不同的API,因为查找到一个元素可以使用不同的路径,对你属性了解API会有些帮助。

录制完成后点击红色按钮旁边的方块形停止按钮,录制就停止了,

想要运行的话还是点击左上角的Record按钮就再次运行录制结果了。

三、编写测试用例进阶篇

通过上面你应该了解了大概怎么来使用UIAutomation工具以及编写简单的测试脚本,当时编写的也不算是一个测试用例,最起码的断言*作都没有,那么这一篇我们来将一下如何来编写一个真正的测试用例。

1、元素识别

如果要编写测试用例,我们首先想到要*作的控件元素应该如何去识别找到它呢,第二节我们简单说了一下通过脚本输出控件Log是一种方式可以识别到控件,还有另外一种方式是使用设备自带的Accessibility Inspector功能

在模拟器上,你还可以激活Accessibility的检测器。启动模拟器,找到“Settings> General> Accessibility> Accessibility Inspector”,然后将它设为“打开”状态。

此时在模拟器上会出现一个覆层,你进入需要测试的应用,鼠标点击相应的控件,如下图所示会看到一些信息,Label就是这个控件的id属性,Traits

就是这个控件的类型,Frame就是这个控件的位置以及大小{{36,295},{43,21}},其中第一个位置{36,295}是该控件的左上角的坐

标,{43,21}则是这个控件的宽度和高度,通过这两个参数可以算出控件的具体坐标位置。

2、编写测试用例

var testName=”FirstTest”;

UIALogger.logStart(testName);

var target= UIATarget.localTarget();

var app= target.frontMostApp();

var window= app.mainWindow();

app.logElementTree();

window.tableViews()[0].cells()[0].tap();

target.delay(3);

var date= window.elements()[“date”];

UIALogger.logMessage( date);

if(date){

UIALogger.logPass( testName);

}

else{

UIALogger.logFail( testName);

}

上面是使用了UIAutomation自带的一些API完成了一个自动测试用例的编写,包括了元素查找以及断言*作,但是如果你编写多个测试用例的话会发现一些问题,比如一些代码会有重复,用例组织不是很好,断言*作不方便。

3、tuneup介绍

下面为大家介绍一个开源的基于UIAutomation扩展的JS库tuneup,这个js扩展库是方便大家来编写测试用例。

Tuneup开源地址

如何来使用,首先你可以在电脑上新建一个测试用例目录,比如文件夹名称就叫Demo,下面可以新建一个lib子文件夹,存放需要用到的一个扩展库,你下载的tuneup目录内容可以都放到lib目录下,在demo文件夹下新建一个测试用例的js文件,测试代码中只需要把tuneup使用import引用进来就可以使用了,通过tuneup编写的测试用例如下。

#import”lib/tuneup/tuneup.js”

var target= UIATarget.localTarget();

var app= target.frontMostApp();

/* Second是测试用例的注释,可以填写用例的用途,以及编写人等信息*/

test(“Second”, function(target, app){

var window= app.mainWindow();

app.logElementTree();

window.tableViews()[0].cells()[0].tap();

var date= window.elements()[“date”];

assertNotNull(date,”进入日期详情页面,date属性没找到!”);});

四、通过命令行运行测试用例

为了能够实现自动定时运行测试脚本,编写完成的测试用例我们希望是能够通过命令行的方式来启动运行的,那么下面我们介绍一下如何通过命令行来启动运行我们编写好的测试用例。

instruments-t/Applications/Xcode.app/Contents/Applications/Instruments.app/Contents/PlugIns/ AutomationInstrument.bundle/Contents/Resources/Automation.tracetemplate”/Users/ios/Library/Application Support/iPhone Simulator/6.0/Applications/D02EF837-94F7-457A-989A-A654FC034803/ DemoSBTableViewTest.app”-e UIASCRIPT/AutoTest/workspace/IosDemo/test.js-e UIARESULTSPATH/AutoTest/workspace/IosDemo/lib/

上面是通过命令行来运行测试用例的脚本,

-t后面的参数为Automation.tracetemplate的路径,不用修改,Xcode4.5以后的版本路径都是这个,如果是Xcode4.5以前的路径会不一样

“/User***.app”这个参数为被测程序的绝对路径,模拟器中安装的应用都可以在本地硬盘中找到

-e UIASCRIPT指定执行的js脚本

-e UIARESULTSPATH指定输出结果存放的路径

五、后续基于UIAutomation扩展需要的改进点

1、输出的用例运行结果存在给定的xml文件中,后续需要解析xml文件,解析成testng的格式,方便后续和Jenkins等持续集成平台整合

2、查找定位元素,只能按照控件层级,一级一级往下找,使用起来有些不方便,需要再次封装一下

3、需要加入外围的一些控制,使整个自动化测试运行完全自动化,另外还需要加入一些失败重跑机制,UI的自动化一般都会存在一些不稳定的因素

如何使用UIAutomation进行iOS 自动化测试

1.1 UI Automation的运行

先通过简单的测试脚本的运行来认识UI Automation。本文使用的例子是Apple官方实例程序Recipes。可以通过XCode的帮助文档找到iPhoneCoreDataRecipes这个项目并将其打开。

选择打开以后,程序源码会被自动的下载到当前用户的Downloads目录下。使用XCode打开Recipes项目并长按运行程序按钮就会看到,如下图所示,点击“Profile”命令即可。

还可以通过单击XCode中Product菜单,在其中点击“Profile”命令。当然也可以通过“command+ i”快捷方式来运行程序。“Profile”运行以后,Instruments会启动运行。在其中选择“Automation”选项后,单击“choose”按钮确定。

点击“choose”命令后,稍等片刻即可看到已经运行了。

如何才能编写或运行测试脚本呢?现在我们就来看看入门级别的教程,也就是UI Automation的“Hello world”。会看到默认有一句代码,这就是UI Automation的j*ascript脚本。那么我们在下面添加一句话,即可完成这个“Hello world”程序。

之后就可以点击运行,来执行这个脚本了。

如果当前脚本正在运行,那么当前红色圆形按钮,为黑色正方形时,先点击黑色正方形按钮停止执行脚本,再点击红色圆形按钮运行即可。接下来我们可以看到一些输出的log。也就是刚才的脚本执行结果,打印当前的控件树。虽然第一个脚本很简单,确是非常有用的一个功能,以后的自动化测试脚本都要以这个脚本的运行结果为基础。

1.2 UI Autmation界面简要介绍

(1)标示为1的区域,第一个按钮在未运行状态,功能是“运行”脚本,当脚本在运行状态时,功能是“停止”脚本。第二个按钮的功能为“暂停”脚本执行。

(2)标示为2的区域,主要负责展示Instruments的运行状态,左侧显示了当前Instruments运行加载的Library数量,右侧显示当前Library的一些简介信息和运行的时间。

(3)标记为3的区域,主要是一些Instruments运行的设置,

(4)标记为4的区域,日志显示和脚本显示的地方。

1.3 UI Autmation脚本开发之前

运行UI Automation时有一些规则需要遵循,如果不遵循规则,它会在不同层面上限制自动化测试脚本的运行。

自动化测试脚本的运行限制主要来自两个层面。

(1)系统级别的运行限制,不是所有的应用程序都可以用UI Automation进行自动化测试的,UI Automation本身会对程序的签名有一定的要求(模拟器上运行除外)。

(2)应用程序级别的限制主要来自控件的识别方面,如果一个应用程序的大部分控件无法得到有效的识别,那么这个应用程序就无法拥有强大的自动化测试脚本,或者无法直接拥有任何功能的自动化测试脚本。

为了让测试更好的运行,必须遵循以下的规则。

(1)被测试的应用程序必须是Developer签名的应用程序或者运行在模拟器里面的应用程序。从App store下载的应用程序都不是Developer签名,都不可直接被用于UI Automation测试,如果想测试可以通过重签名工具,重新签名后,才可以使用。当然最简单的方法就是拿着源码后配置上Developer签名,直接通过XCode安装到设备上即可使用UIAutomation测试。

(2)在被测试应用程序开发的过程中,需要处理控件的可访问性。使用在storyboard中或利用代码设置View的AccessibilityLabel属性。

做好以上的设置,就可以开始UI Automation之旅了。

如果对自动化测试有其他的疑问,可访问*sogouqa*。

如何使用UIAutomation进行iOS自动化测试

1.你的第一个UIAutomation测试脚本

UIAutomation的功能测试代码是用J*ascript编写的。UIAutomation和Accessibility有着直接的关系,你将用到通过标签和值的访问性来获得UI元素,同时完成相应的交互*作。

下面让我们来编写我们的第一段测试代码。

使用iOS模拟器

1.下载示例应用程序TestAutomation.xcodeproj,并打开它。这个项目是一个很简单的包含2个tab的tabbar应用程序。

2.确保选中如下图所示的“TestAutomation> iPhone 5.0 Simulator”模式(或许你已经切换成5.1了,因此它可能是iPhone5.1模拟器)。

3.启动Instruments(Product> Profile),或者通过⌘I。

4.选择左边的iOS Simulator,然后再选择Automation模板,然后点击“Profile”。

5. Instruments就已经启动好后,然后直接开始录制了。这里先停止录制,(红包按钮或者⌘R)。

6.在左边的Scripts窗口,点击“Add> Create”创建新的脚本。

7.在脚本编辑器里,输入下面的代码

var target= UIATarget.localTarget();

var app= target.frontMostApp();

var window= app.mainWindow();

target.logElementTree();

clip_image007[4]

8.重新运行这段脚本⌘R(不需要保存)。脚本跑起来后,你可以在日志打完后停止它。

clip_image009[4]

赞一个!我们就这样完成了我们的第一个UIAutomation测试用例。

使用iOS设备

你除了将你的测试用例运行模拟器上,也可以将它运行在一个真实的设备上。不过,自动化测试用例只能运行在支持多任务的:iPhone 3GS,iPad,iOS> 4.0等设备上。遗憾的是不管iPhone 3G的系统版本是什么,都不支持。

下面是如何*作:

1.通过USB接口连接上你的iPhone。

2.选择“TestAutomation> iOS Device”模式。

3.确保Developper profile设置成Release模式(而不是Ad-Hoc Distribution profile)。默认情况下,profiling是设置成Release模式的(因为没有必要将profile设置成Debug模式)。

4.启动测试

5.后面的步骤请参考前面模拟器部分。

2.处理UIAElement和元素可访问性(Accessibility)

UIAElement层次结构

Accessibility和UIAutomation有密切的联系:如果一个控件的Accessibility是可以被访问的,你就可以设置和读取它的值,作相关的*作,而当一个控件的Accessibility不可见时,你就没有办法通过automation访问它。

你可以通过Interface Builder,或者通过在程序里设置isAccessibilityElement属性的方式来设置一个控件的Accessibility或者可被自动化。当你设置container view(即:一个视图包含其它的UIKit元素)的accessibility时,你必须注意。你设置了整个View的accessibility将会“隐藏”它的子视图的accessibility,例如:在示例项目中,你不能将outlet视图设置成可访问的,否则它所有的子控件将都不可以访问了。在任何时候,logElementTree都是你忠实的朋友:它将当前界面的所有可被访问的元素都打印在日志里。

每一个可以被访问的UIKit控件都可以用一个J*ascript对象来描述,它就是一个UIAElement。UIAElement有几个属性:name, value, elements, parent。你的主窗口包含很多的控件,它们是以UIKit层次的方式定义的,这些UIKit层次结构对应的是UIAElement的层次树。例如:前面的测试代码中,通过调用logElementTree,我们可以得到如下面所示的树结构:

+- UIATarget: name:iPhone Simulator rect:{{0,0},{320,480}}

|+- UIAApplication: name:TestAutomation rect:{{0,20},{320,460}}

||+- UIAWindow: rect:{{0,0},{320,480}}

|||+- UIAStaticText: name:First View value:First View rect:{{54,52},{212,43}}

|||+- UIATextField: name:User Text value:Tap Some Text Here! rect:{{20,179},{280,31}}

|||+- UIAStaticText: name:The text is: value:The text is: rect:{{20,231},{112,21}}

|||+- UIAStaticText: value: rect:{{145,231},{155,21}}

|||+- UIATabBar: rect:{{0,431},{320,49}}

||||+- UIAImage: rect:{{0,431},{320,49}}

||||+- UIAButton: name:First value:1 rect:{{2,432},{156,48}}

||||+- UIAButton: name:Second rect:{{162,432},{156,48}}

clip_image001[6]

你可以通过下面的代码来访问文本框:

var textField=

UIATarget.localTarget().frontMostApp().mainWindow().textFields()[0];

你可以选择通过从0开始的索引或者这个元素的名称来访问这个元素,例如:你也可以通过下面的代码来访问文本控件。

var textField=

UIATarget.localTarget().frontMostApp().mainWindow().textFields()[“User Text”];

后一种方式更加清晰明了,应该多使用。你可以通过Interface Builder设置UIAElement的name属性,

clip_image002[6]

或者通过编写代码的方式:

myTextField.accessibilityEnabled= YES;

myTextField.accessibilityLabel=@”User Text”;

你现在可以看到,通过accessibility属性可以被UIAutomation用来找到不同的控件。这非常的清晰,因为,第一,你只要学习一个测试框架;第二,通过编写自动化测试代码,你同时还可以保证你的程序是可以被访问的。因此,每一个UIAElement对象的子控件可以通过下面的方法进行访问:

buttons(), images(), scrollViews(),textFields(), webViews(), segmentedControls(), sliders(), staticTexts(), switches(), tabBar(),tableViews(), textViews(), toolbar(), toolbars()等等……

你可以通过如下代码在tabbar上访问第一个tab:

var tabBar= UIATarget.localTarget().frontMostApp().tabBar();

var tabButton= tabBar.buttons()[“First”];

UIAElement结构层次非常的重要,你以后会常常用到它。而且你还要记住,你可以在随时通过调用UIAAplication的logElementTree来获得它的结构。

UIATarget.localTarget().frontMostApp().logElementTree();

在模拟器上,你还可以激活Accessibility的检测器。启动模拟器,找到“Settings> General> Accessibility> Accessibility Inspector”,然后将它设为“打开”状态。

这个彩色的小框框就是Accessibility检测器了。当它收起来的时候,Accessibility就被关闭了,当它展开的时候,Accessibility就是打开的。你只要点击上面的箭头按钮就可以激活或者屏蔽Accessibility。现在,打开我们的示例程序,激活检测器。

然后,点击文本框,检查UIAElement的name和value属性(其实就是accessibilityLabel和accessibilityValue对应的NSObject类型的值)。这个检测器可以帮助你调试和编写你的测试代码。

模拟用户*作

让我们更进一步,模拟一些用户的交互*作。你可以简单地调用按钮的tap()来作一个点击*作:

var tabBar= UIATarget.localTarget().frontMostApp().tabBar();

var tabButton= tabBar.buttons()[“First”];

// Tap the tab bar!

tabButton.tap();

你还可以调用UIAButtons的doubleTap(), twoFingerTap()。如果你不想*作具体的某个元素,你也可以直接根据屏幕上指定的坐标点进行*作,你可以这么用:

UIATarget.localTarget().tap({x:100, y:200});

UIATarget.localTarget().doubleTap({x:100, y:200});

UIATarget.localTarget().twoFingerTap({x:100, y:200});

UIATarget.localTarget().pinchOpenFromToForDuration({x:20, y:200},{x:300, y:200},2);

UIATarget.localTarget().pinchCloseFromToForDuration({x:20, y:200},{x:300, y:200},2);

拖拽与划动:

UIATarget.localTarget().dragFromToForDuration({x:160, y:200},{x:160,y:400},1);

UIATarget.localTarget().flickFromTo({x:160, y:200},{x:160, y:400});

注意,当你指定*作的时间间隔的时候,它是有特定的范围的,即:拖拽*作的时间间隔必须大于或者等于0.5秒,小于60秒。

现在,让我们来练习一下:

停止Instruments(⌘R)

在Scripts窗口里,移除当前的脚本

点击“Add> Import”然后选择TestAutomation/TestUI/Test-1.js(将下面的代码保存到这个路径)

点击录制按钮(⌘R)然后看看将会发生什么…

下面是Test-1.js代码:

var testName=”Test 1″;

var target= UIATarget.localTarget();

var app= target.frontMostApp();

var window= app.mainWindow();

UIALogger.logStart( testName);

app.logElementTree();

//– select the elements

UIALogger.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 fiels

UIALogger.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 fiels

UIALogger.logMessage(“Dismiss the keyboard”);

app.logElementTree();

app.keyboard().buttons()[“return”].tap();

var textValue= window.staticTexts()[“RecipeName”].value();

if(textValue=== recipeName){

UIALogger.logPass( testName);

}

else{

UIALogger.logFail( testName);

}

这段脚本先启动待测程序,然后,如果第一个tab没有被选的话就切换到第一个tab,并将上面的文本框的值设成“Unusually Long Name for a Recipe”,接着收起虚拟键盘。这里有一些新的方法值得注意的:UIATarget的delay(Number timeInterval)方法允许你在两个*作之间做一些等待,UIALogger的logMessage( String message)方法用来将你想打印的信息输出到日志上去,UIALogger的logPass(String message)方法指明你的测试脚本已经成功的完成测试了。

你还知道了如何访问键盘上的按钮,然后作点击*作:

app.keyboard().buttons()[“return”].tap();

本文链接:http://www.kkyx8.com/html/87961411.html

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件举报,一经查实,本站将立刻删除。