2015-12-16 151 views
14

我正在嘗試使用XCode 7的XCTest UI測試功能來創建樹步行者,該功能可以系統地探索表視圖的確定性樹到指定的深度。它幾乎可以工作,除了我無法可靠地檢測到任何給定元素上的tap是否實際觸發了到新屏幕的轉換。我有一個大部分時間都在使用的hacky方法,它檢測導航欄標籤是否已更改,或者菜單元素數量是否已更改。我的XCode UI測試如何檢測到屏幕已更改?

第一個測試有錯誤的否定,因爲連續的屏幕可以有相同的導航欄標籤(我走的代碼庫不是我的)。第二個測試有誤報,因爲有時點擊一個表格元素不會轉換到另一個表格/屏幕,而是向當前屏幕添加額外的元素。

經過一番閱讀,似乎使用輔助功能標籤可能是一種方式。因此,我在應用程序代碼(viewDidAppear)中爲導航欄的輔助功能標籤設置了UID,然後在UI測試代碼中對其進行測試。感覺這應該是有效的,但我在測試代碼中只回收了的值。

我會毫不猶豫地承認,當談到UI測試時,我是一個noob,主要是在沒有清楚地理解我在做什麼的情況下剪切/粘貼/修改其他人的代碼。所以我可能會在可訪問標籤代碼本身以及可能在概念級別上發現一些天真的錯誤,以檢測屏幕已經改變;也許有些事情我可以做得更簡單/更習慣。

中的應用:

- (void)viewDidAppear: (BOOL)animated { 

    [super viewDidAppear: animated]; 

    //... 

    UINavigationBar* navBar = self.navigationController.navigationBar; 
    if(navBar) 
    { 
     static NSInteger s_UID = 0; 
     navBar.topItem.accessibilityLabel = [NSString stringWithFormat:@"UID-%ld", s_UID++]; 
    } 
} 

在XCTest UI測試:

- (NSString*) navBarAccessibilityLabel: (XCUIApplication*) app 
{ 
    NSString* result = NULL; 

    XCUIElementQuery *navBars = app.navigationBars; 
    XCUIElement* firstElem = [navBars.staticTexts elementBoundByIndex:0]; 
    if(firstElem) 
    { 
     result = (NSString*)firstElem.accessibilityLabel; // This is always nil 
    } 

    return result; 
} 

注意firstElem被發現,而且我能夠提取例如firstElem.label非常高興。

任何幫助表示讚賞。

+0

一個偉大的文章ü沒有得到任何解決方案? @Kaitain? –

回答

0

假設你已經給你的視圖控制器正確識別符(這樣你就可以在它們之間區分),你可以將它添加到所涉及的視圖控制器:

#ifdef UITESTING 
- (void) viewDidAppear: animated 
{ 
    [super viewDidAppear: animated]; 
    // do your checking here 
} 
#endif 

在項目的測試目標,在構建設置有是一款處理器。在那裏你可以設置預處理器宏。只需將'UITESTING = 1'添加到調試和/或發佈設置即可。效果是,在測試版本中,將定義UITESTING,因此預處理器將包含#ifdef UITESTING下的所有代碼。

+0

爲了澄清,這個代碼將在UI測試程序或主應用程序代碼中進行嗎? – Kaitain

+0

這將是您的應用程序代碼的補充,以支持測試。我猜測一些正確的#ifdef可以使它不在生產代碼中。 –

+0

好的...我覺得我錯過了一些東西。什麼樣的邏輯打算進入「//在這裏做你的檢查」?爲什麼我要檢查應用程序代碼中的某些內容?我曾假設應用程序代碼需要將某種標識符標籤應用於某些內容,並且UI測試代碼將稍後利用它來檢測屏幕更改。我不能立即看到你在解決這個問題時提出的建議的有用性(或者提供解決檢測屏幕變化的更普遍問題的解決方案)。 保持生產代碼的這種邏輯不是主要關心的問題。 – Kaitain

5

您可以測試的元素都可以訪問:

一個UI測試中左鍵點擊並開始錄製,模擬器將啓動,您可以點擊模擬器裏面的元素,如果該元素是可訪問的Xcode會寫測試testExample方法中的代碼。

enter image description here

或運行模擬器您的應用程序,並打開輔助檢查,並且將鼠標懸停在爲詳細信息將出現在檢查的元素。

enter image description here

除此之外,我認爲你的情況,你可以通過添加導航項目的標題,每個屏幕即self.navigationItem.title = @"myScreen";

驗證這一點,然後用斷言驗證屏幕即

// let app = XCUIApplication() // Swift 

UIApplication *app = [UIApplication alloc] init]; // Objective-C 

XCTAssertEqual(app.navigationBars.element.identifier, "myScreen") // Don't forget to import class XCTest 
+1

這絕對有用。謝謝。但是,據我所知,這改變了屏幕上實際可見的標題。我希望可以添加某種不可見的標籤,它根本不會改變可觀測值。 (好吧,我意識到最終所有的輔助功能數據都應該可以在某種形式下觀察到,即使它是音頻。) – Kaitain

1

我會使用Facebook's Snapshot test library進行快照測試。

基於視圖的測試意味着驗證用戶看到的是您希望用戶看到的東西。這樣做意味着能夠確保您的視圖的不同版本或視圖的不同狀態 繼續保持相同。基於視圖的測試可以用來提供一個覆蓋很多圍繞對象的用例的高級測試。

你可以找到更多的細節here.

相關問題