65.9K
CodeProject 正在变化。 阅读更多。
Home

如何在iOS 4中执行UI自动化测试

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.63/5 (7投票s)

2010年9月6日

CPOL

3分钟阅读

viewsIcon

109016

downloadIcon

1264

iOS 4中UI自动化测试的初学者指南(分步)。

引言

这是一篇初学者级别的文章。我希望在阅读完这篇文章后,一个典型的 iPhone 开发者将能够执行自动化 UI 测试。

背景

UI 自动化测试iOS4 中一个重要的附加值。它由一个新的名为“Automation”的工具对象支持。它非常适用于生产力风格应用程序的 UI 测试。

自动化工具从脚本(用 JavaScript 编写)运行。它模拟/触发目标应用程序上的所需事件。测试脚本必须是宿主计算机上工具可访问的有效可执行 JavaScript 文件。

什么是测试脚本?

测试脚本是一组有序的命令,每个命令访问应用程序中的一个用户界面元素,以对其执行用户操作或使用与之相关的信息。

在本文中,我将借助使用 Coco Touch 框架开发的一个示例应用程序来解释 UI 自动化测试。

描述

我的示例应用程序有一个名为“登录”的屏幕。它包含两个文本字段,分别名为“用户名”和“密码”,以及一个名为“登录”的按钮。

在编写测试脚本之前,请通过将“辅助功能标签”设置为视图的唯一值(这是强制性要求),在“Interface Builder”中用名称标记您的所有 UI 控件。

现在,以调试模式编译您的应用程序。

测试脚本

正如我上面提到的,测试脚本基本上是一组有序的命令。换句话说,它将文本测试用例转换为 JavaScript,而“Automation”工具将自动执行 JavaScript。

这是示例测试脚本

// Get the handle of applications main window 
var window = UIATarget.localTarget().frontMostApp().mainWindow(); 

// Get the handle of view 
var view = window.elements()[0]; 

var textfields = window.textFields(); 
var passwordfields = window.secureTextFields(); 
var buttons = window.buttons(); 
var textviews = window.textViews(); 
var statictexts = window.staticTexts(); 
var target = UIATarget.localTarget(); 

// Check number of Text field(s) 
if(textfields.length!=1) 
{
   UIALogger.logFail("FAIL: Inavlid number of Text field(s)"); 
} 
else 
{ 
   UIALogger.logPass("PASS: Correct number of Text field(s)"); 
} 
// Check number of Secure field(s) 
if(passwordfields.length!=1) 
{ 
   UIALogger.logFail("FAIL: Inavlid number of Secure field(s)"); 
} 
else 
{ 
   UIALogger.logPass("PASS: Correct number of Secure field(s)"); 
} 

// Check number of static field(s) 
if(statictexts.length!=2) 
{ 
   UIALogger.logFail("FAIL: Inavlid number of static field(s)"); 
} 
else 
{ 
   UIALogger.logPass("PASS: Correct number of static field(s)"); 
} 

// Check number of buttons(s) 
if(buttons.length!=1) 
{ 
   UIALogger.logFail("FAIL: Inavlid number of button(s)"); 
} 
else 
{ 
   UIALogger.logPass("PASS: Correct number of button(s)"); 
} 

//TESTCASE_001 : Test Log on Screen 
//Check existence of desired TextField On UIScreen 
if(textfields["username"]==null || textfields["username"].toString() == 
	"[object UIAElementNil]") 
{ 
   UIALogger.logFail("FAIL:Desired textfield not found."); 
} 
else 
{ 
   UIALogger.logPass("PASS: Desired UITextField is available"); 
} 

//TESTCASE_1.2 :Check existence desired of PasswordField On UIScreen 
if(passwordfields[0]==null || passwordfields[0].toString() == "[object UIAElementNil]") 
{ 
   UIALogger.logFail("FAIL:Desired UISecureField not found."); 
} 
else 
{ 
   UIALogger.logPass("PASS: Desired UISecureField is available"); 
} 

//TESTCASE_1.3 :Check For Existence of Buttons On UIScreen 
if(buttons["logon"]==null || buttons["logon"].toString() == "[object UIAElementNil]") 
{ 
   UIALogger.logFail("FAIL:Desired UIButton not found."); 
} 
else 
{ 
   UIALogger.logPass("PASS: Desired UIButton is available"); 
} 

//TESTCASE_001 : Missing User Name 
/////////////////////////////////////// 

textfields["username"].setValue(""); 
passwordfields[0].setValue("password"); 
buttons["logon"].tap(); 

//target.delay(2); 

var errorVal=textviews["error"].value(); 
if(errorVal!="Invalid User Name or Password") 
{ 
   UIALogger.logFail("Did Not Get Missing UserName Error : "+errorVal); 
} 
else 
{ 
   UIALogger.logPass("Missing User Name"); 
} 

//TESTCASE_002 : Missing Password 
//////////////////////////////////////////////// 

textfields["username"].setValue("username"); 
passwordfields[0].setValue(""); 
buttons["logon"].tap(); 
target.delay(2); 

var errorVal=textviews["error"].value(); 
if(errorVal!="Invalid User Name or Password") 
{ 
   UIALogger.logFail("Did Not Get Missing Password Error : "+errorVal); 
} 
else 
{ 
   UIALogger.logPass(" Missing Password"); 
} 

//TESTCASE_003 : Successful Log On 
textfields["username"].setValue("username"); 
passwordfields[0].setValue("password"); 
buttons["logon"].tap(); 
target.delay(2); 

应用程序中的所有 UI 元素都通过由 UIAElements 类及其子类(如 UIATargetUIALogger 等)定义的对象有序层次结构表示给脚本。

有关更多信息,请参阅 Apple 开发者网站上提供的 UI 自动化参考集合。

完成脚本后,我们就可以开始执行了。以下是步骤

步骤 1

打开 Instruments(您可以在 Spotlight 中找到它)。从模板选择窗口中选择“Automation”。

第二步

它将打开 Trace Window。在这里,您必须借助“选择目标”下拉菜单选择您的应用程序的调试版本。

步骤 3

使用“脚本”下拉菜单选择测试脚本文件,然后单击“运行和录制”按钮。

它将自动启动“iPhone 模拟器”并开始执行测试脚本(此操作可能需要 4-5 秒)。

可重用测试脚本

API 提供了 #import 指令,允许您编写更小、可重用的离散测试脚本。

例如,如果您要在名为 *TestUtilities.js* 的文件中定义常用函数,您可以通过在脚本中包含以下行来使这些函数可用于您的测试脚本 *TestXYZ.js*

#import "<path-to-library-folder>/TestUtilities.js" 

尝试附件示例代码的硬件要求

Mac Mini(基于 Intel 处理器),配备 Snow Leopard 10.6(或更高版本)和 iOS SDK 4.0

  1. 解压缩附件的“*LoginWindow_src.zip*”,以调试模式编译它,并在模拟器上测试它。
  2. “用户名/密码”是有效的凭据;在相应的“用户 ID”和“密码”字段中输入这些值。

您是否遇到“意外错误 ....”?

"Unexpected error in -[UIATarget_0x5a20d20 frontMostApp], 
/SourceCache/UIAutomation_Sim/UIAutomation-37/Framework/UIATargetElements.m line 437"

如果您遇到此问题,可以通过将 com.apple.Accessibility.plist 复制到 4.0.1 来更正此问题。

复制 com.apple.Accessibility.plist 到:

~/Library/Application Support/iPhone Simulator/4.0.1/Library/Preferences

确保此文件中只有两个键,即“AccessibilityEnabled”和“ApplicationAccessibilityEnabled”。这两个键都应被选中。

© . All rights reserved.