當前位置:編程學習大全網 - 編程語言 - 如何使用UIAutomation進行iOS自動化測試

如何使用UIAutomation進行iOS自動化測試

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. 在腳本編輯器裏,輸入下面的代碼

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控件都可以用壹個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}}

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();

  • 上一篇:gui事件處理器類可以使用以下哪些方式來實現
  • 下一篇:求壹篇社會實踐報告
  • copyright 2024編程學習大全網