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






4.63/5 (7投票s)
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
类及其子类(如 UIATarget
、UIALogger
等)定义的对象有序层次结构表示给脚本。
有关更多信息,请参阅 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
- 解压缩附件的“*LoginWindow_src.zip*”,以调试模式编译它,并在模拟器上测试它。
- “用户名/密码”是有效的凭据;在相应的“用户 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
”。这两个键都应被选中。