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

2012-08-10 15:47 by 知平软件, 15839 阅读, 5 评论, 收藏,  编辑

写在前面

研究iOS的自动化测试也有些日子了,刚开始的时候,一直苦于找不到什么好的资料,只能从Apple的官网查阅相关的API文档,只可惜,Apple对开发者来说实在是不怎么友好,文档写得相当的粗略,对于初学者来说有一定的难度。

本来是打算自己动手写一篇关于iOS的UI自动化测试的入门级别的介绍性文档的,但想起来后面在具体解决一些问题的时候,收藏一篇很好的Blog,很全面地介绍了如何使用UIAutomation的JavaScript Libraries做iOS程序的自动化测试。如果作者早点看到这篇文章,应该要少走一些弯路,这里没有创意性的它他翻译成中文,希望对你们有一些帮助。

原文地址:http://blog.manbolo.com/2012/04/08/ios-automated-tests-with-uiautomation

翻译正文:

快速入门

自动化测试代码可以“在你的睡着的时候”很好地帮你测试你的应用程序。它可以让你能够快速地跟踪你程序中的回归和性能方面的问题,这样你就不用担心你新增的功能会影响到你之前已经完成开发的程序了。

随着iOS4.0的发布,苹果公司同时发布了一个名为UIAutomation的测试框架,它可以用来在真实设备和iPhone模拟器上执行自动化测试。但官方关于UIAutomation的文档相当的有限,在网络上也没有太多的资源可以查找的。本文将向你展示你如何将UIAutomation整合到你的工作流程当中去。

作为基础知识的准备,你可以先看一下苹果公司关于UIAutomation的文档,另外还有一篇快速入门的介绍苹果Instruments的文档也值得看看,当然,如果你有一个免费的Apple开发者账号的话,你可以看一下WWDC 2010 - Session 306 – 使用Instruments进行用户界面自动化测试的幻灯片或者视频。

除此之外,包括在Xcode中的OCUnit测试框架也可以用来为你的应用程序编写单元测试。

1. 第一个UIAutomation测试脚本

  • 使用iOS 模拟器
  • 使用iOS设备

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

  • UIAElement层次结构
  • 模拟用户操作

3. 经验分享(让你的生活变得更简单)

  • 类库Tune-up介绍
  • 导入外部脚本
  • 使用强大的命令行
  • 使用录制交互功能
  • 当遇到问题时,加上“UIATarget.delay(1);”

4. 高级交互

  • 处理非预期和预期的提示框(alerts)
  • 多任务
  • 屏幕方向

5. 总结

  • 有用的链接
  • 一个视频

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

UIAutomation的功能测试代码是用Javascript编写的。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. 在脚本编辑器里,输入下面的代码


1

2

3

4


var 
target = UIATarget.localTarget();

var 
app = target.frontMostApp();

var 
window = app.mainWindow();

target.logElementTree();

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

赞一个!我们就这样完成了我们的第一个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. 启动测试 (?I)

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

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

UIAElement层次结构

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

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

每一个可以被访问的UIKit控件都可以用一个Javascript对象来描述,它就是一个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}}

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


1

2


var 
textField =

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

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


1

2


var 
textField =

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

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

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


1

2


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:


1

2


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

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

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


1

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

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

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

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

模拟用户操作

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


1

2

3

4

5


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

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

// Tap the tab bar !

tabButton.tap();


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

  • 点击:

1

2

3


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

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

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


  • 缩放:

1

2


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

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


  • 拖拽与划动:

1

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秒。

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

  1. 停止Instruments (?R)
  2. 在Scripts窗口里, 移除当前的脚本
  3. 点击“Add > Import”然后选择TestAutomation/TestUI/Test-1.js(将下面的代码保存到这个路径)
  4. 点击录制按钮 (?R) 然后看看将会发生什么…

下面是Test-1.js代码:


1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29


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)方法指明你的测试脚本已经成功的完成测试了。

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


1

app.keyboard().buttons()[
"return"
].tap();

由于时间有限且原文太长,先只能翻译到这里,我会尽快的将剩下的部分翻译补上。另外,时间仓促,如有翻译得不准确的地方,也敬请担待。谢谢。

本文由知平软件的Dawson Liu翻译,转载请注明出处。

知平软件致力于移动平台自动化测试技术的研究,我们希望通过向社区贡献知识和开源项目,来促进行业和自身的发展。

时间: 2024-10-06 02:47:21

如何使用UIAutomation进行iOS 自动化测试的相关文章

Appium IOS 自动化测试初探

手机平台的自动化测试工具很多,之前研究过了安卓和苹果的原生自动化测试框架,经一些同事介绍,貌似Appium是个不错的工具. 想记录一下研究的结果,也算是篇干货的文章 在网上也看了一些视频,个人认为这个自动化测试的特点就是 1. 多编程语言支持 相对于传统的IOS UIautomation只能支持js语言,Appium起到了一个翻译的作用,它其实是一个CS架构,服务器和IOS模拟器或真机直接通讯,客户端和服务器之间用HTTP协议进行交互,所以客户端用什么语言其实不重要.下面会有一个python编程

iOS自动化测试的那些干货

如果有测试大佬发现内容不对,欢迎指正,我会及时修改. 大多数的iOS App(没有持续集成)迭代流程是这样的 也就是说,测试是发布之前的最后一道关卡.如果bug不能在测试中发现,那么bug就会抵达用户,所以测试的完整性和可靠性十分重要. 目前,大多数App还停留在人工测试阶段,人工测试投入的成本最低,能够保证核心功能的使用,而且测试人员不需要会写代码. 但是,在很多测试场景下,人工测试的效率太低,容易出错.举两个常见的例子: 一个App的核心功能,在每一次发布版本前的测试必定会跑一遍所有的测试用

Mac下appium ios自动化测试(一)

mac下ios自动化测试,可以使用appium,也可以直接用facebook-wda库. 此篇先介绍appium: 开始之前先要知道测试app的bundleId,这是ios特有的.可以采用如下命令: ideviceinstaller -l 遇到问题: Could not connect to lockdownd. Exiting. 解决办法: 打开命令行一次输入如下代码: brew uninstall ideviceinstaller -gbrew uninstall libimobiledev

[金阳光测试]IOS 自动化测试

第一讲 一 自备能力 1.熟悉js脚本(必须) 2.会常用的linux命令(必须) 3.英文能力(必须) 4.熟悉java(必须) 5.会一点点shell和python 6.会一些oc和IOS开发 二必备硬件 1.mac(必须) 2.iphone或者ipad(必须) 三 软件环境 1.Mac OS X 10.8.x 以上(必须) 2.开发者证书+密钥 (或者企业级证书) 3.Xcode5.0以上(必须) 4.python2.5-2.7版本(系统自带) 5.TuneUp(必须) https://g

初识 iOS 自动化测试框架 WebDriverAgent

微信跳一跳最近很火,外挂代练什么的也越来越多.作为一只程序猿,对外挂的原理产生了强烈的好奇心,于是埋头研究了一阶段,注意到了 WebDriverAgent 这套 Facebook 出品的自动化测试框架. 为了让大家产生兴趣,先从跳一跳外挂的实现说起. 准备工作 安装 homebrew homebrew 是 Mac OS 下最优秀的包管理工具,没有之一. xcode-select --install ruby -e "$(curl -fsSL https://raw.githubuserconte

Mac下facebook-wda ios自动化测试

1.首先pip安装facebook-wda库 2.运行测试 cd到wda目录下 # 获取设备的UDID UDID=$(idevice_id -l | head -n1) # 运行测试 xcodebuild -project WebDriverAgent.xcodeproj -scheme WebDriverAgentRunner -destination "id=$UDID" test 可以直接写成脚本运行即可.运行后会看到手机端安装webdriveragent并启动,然后马上退回桌面

移动APP自动化测试框架

简介 移动APP的UI自动化测试长久以来一直是一个难点,难点在于UI的"变", 变化导致自动化用例的大量维护.从分层测试的角度,自动化测试应该逐层进行.最大量实现自动化测试的应该是单元测试,最容易实现也最容易在早期发现问题:其次是接口级测试,以验证逻辑为目的进行自动化,由于接口的相对稳定,自动化测试成本相对也可以接受:自动化成本最大的便是UI级自动化测试,然而UI界面是直接反馈给用户的效果展示,适度的尤其是BVT级的自动化测试也是非常必要的.本文通过分析几种自动化框架的异同,使测试人员

使用Jenkins搭建iOS开发的CI服务器

目录 简介     下载并运行     Jenkins配置         安装git插件         E-mail设置     自动化构建         远程仓库设置         触发条件设置         编译设置         编译后行为设置     单元测试     最后 简介 持续集成CI(continuous integration)是一种可以增加项目可见性,降低项目失败风险的开发实践.iOS开发中CI的选择有很多,比如可以使用Apple提供的Bots来完成自动化构建和

UIAutomation---IOS自动化测试的工具

xcode中自带的Instuments工具可以用来进行APP的自动化测试, 以及用于进行内存泄露, 文件读写操作等的性能分析. 第一部分: 熟悉Instruments的UIAutomation. 首先, 选取xcode->Open Developer Tool->Instruments打开Instruments工具, 然后在左上角可以选取设备及被测APP(如下图): 在这里, 我选取了iPhone 5s的一个模拟器, 以及之前编写的一个简单的知乎日报APP. 刚开始接触UIAutomation