1. 程式人生 > >iOS UI Test 自動化測試開發

iOS UI Test 自動化測試開發

關於iOSUI自動化測試,是從Xcode7之後才支援的比較好,使用XCTest.frameworkXcode可以自動錄製UI測試的動作流,還有就是可以使用XCTest UI testing API

本文主要講的是如何進行自動化測試的開發,即XCTest UI testing API的使用

首先建立工程的時候,選擇如下:

Unit Tests選項,顧名思義,就是測試業務邏輯等單元測試

UI Tests選項,才是我們要重點講的UI 自動化測試

在建立專案的時候,這兩個建議都勾選上。

專案的基本構成如圖所示:

Xcode自動生成的一個測試檔案,也可以自己建立測試實現檔案,如圖所示:

接下來就要說如何進行開發工作:

1.認識核心的三個類

  • XCUIApplication
  • XCUIElement
  • XCUIElementQuery

1.1 XCUIApplication類是Application的代理,就像我們專案工程中的AppDelegate,這個物件用來啟動或者是終止UI測試程式,還可以在啟動的時候設定一些啟動引數,在獲取程式中的UI元素的時候,就是通過這個類的例項。這個類繼承自XCUIElement

1.2  XCUIElement類是XCTest.framework對應用中的所有UI 控制元件的抽象,在UI測試中,沒有UIKit中的UI型別,只是用這個類的例項表示所有的

UI 控制元件,以及相應的互動方法,例如:執行手勢(tappressswipe),滑動控制元件互動,拾取器互動,這個類採取了 XCUIElementAttributes協議(描述UI元素的屬性:IdentityValueInteraction StateSize),XCUIElementTypeQueryProvider協議(為指定型別的子代元素提供ready-made查詢, 子代元素查詢包含button,具體實現是:@property(readonly, copy) XCUIElementQuery *buttons; 等一系列對UIKit中元素的對映)

1.3 XCUIElementQuery類是定位

UI 元素的查詢,這個類使用類似key-value的機制得到XCUIElement的例項,使用Type(XCUIElementType列舉)Predicate Identifier建立query,使用elementAtIndex:, elementMatchingPredicate,elementMatchingType: identifier:方法訪問匹配到的UI元素,此類採用XCUIElementTypeQueryProvider協議

2.實際測試需要完成的工作

Interface Builder中的設定如下圖:

程式碼手動設定控制元件,如下:

    subViewButton1.accessibilityIdentifier = @"Button111";
    subViewButton1.accessibilityLabel = @"Button11";
    [subViewButton1 setTitle:@"Button1" forState:UIControlStateNormal];

錄製UI測試流的操作是在指定的某個測試case類檔案中,先定義好測試方法名,然後操作如下圖:

當你在與UI元素互動的時候,這個方法會邊生成自動測試的程式碼

如果進行手動編碼的話,使用XCTest框架查詢UI元素的操作方法的程式碼如下:

    // if element property isAccessibilityElement is YES, identifier previllage is top then the label, then the staticText, last is MatchingType:,otherwise title staticText is top,then ccessablitityIdentifier, then accessablitityLabel, then matchType:
    [[[XCUIApplication alloc] init].buttons[@"Button111"] tap]; // 方法一
    XCUIElement *button11Button = [[XCUIApplication alloc] init].buttons[@"Button11"]; // 方法二
    [button11Button tap];
    [[[XCUIApplication alloc] init].buttons[@"Button1"] tap]; // 方法三
    XCUIApplication *app = [[XCUIApplication alloc] init];
    [[[[[[[[app.otherElements containingType:XCUIElementTypeNavigationBar identifier:@"Login"] childrenMatchingType:XCUIElementTypeOther].element childrenMatchingType:XCUIElementTypeOther].element childrenMatchingType:XCUIElementTypeOther].element childrenMatchingType:XCUIElementTypeOther].element childrenMatchingType:XCUIElementTypeButton] elementBoundByIndex:1] tap]; // 方法四(注意,這個地方的呼叫層數跟元素巢狀是有關係的,具體可以看程式碼)

以上就完成了一個UI測試Case類的自動化工作。接下來就是根據專案測試的需要建立更多的測試case類。

問題一,在實際開發中,UI變化之後,之前自動生成的測試程式碼就可能失效了,需要再一次錄製或者是手動開發,自動化還需要能更加節省成本。