簡體   English   中英

我的XCode UI測試如何檢測屏幕是否已更改?

[英]How can my XCode UI test detect that the screen has changed?

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

第一個測試有假陰性,因為連續的屏幕可以有相同的導航欄標簽(我走的代碼庫不是我的)。 第二個測試具有誤報,因為有時單擊表元素不會轉換到另一個表/屏幕,而是向當前屏幕添加額外的元素。

在做了一些閱讀之后,似乎使用輔助功能標簽可能是最佳選擇。 因此,我在應用程序代碼(在viewDidAppear中)為導航欄的可訪問性標簽設置了一個UID,然后在UI測試代碼中對其進行測試。 感覺這應該工作,但我只在測試代碼中獲得nil值。

我會自由地承認,在UI測試方面我是一個菜鳥,主要是切割/粘貼/調整其他人的代碼,而不清楚我正在做什么。 所以我可能在可訪問性標簽代碼本身中做出某種天真的錯誤,並且可能在概念層面上檢測到屏幕已經改變; 也許我可以做的事情更簡單/更慣用。

在申請中:

- (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 IS被發現,並且我能夠非常愉快地從中提取例如firstElem.label

任何幫助贊賞。

您可以測試元素是否可訪問:

在UI測試中左鍵單擊並開始錄制,模擬器將啟動,您可以單擊模擬器內的元素,如果元素可訪問,Xcode將在testExample方法中為您編寫測試代碼。

在此輸入圖像描述

或者在模擬器中運行您的應用程序並打開輔助功能檢查器,並將鼠標懸停在元素上,因為詳細信息將顯示在檢查器中。

在此輸入圖像描述

除此之外,我認為在您的情況下,您可以通過為每個屏幕添加導航項標題來驗證這一點,即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

假設您已經為視圖控制器提供了正確的標識符(以便您可以區分它們),您可以將其添加到所涉及的視圖控制器中:

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

在項目的測試目標中,在構建設置下有一個部分Proprocessor。 在那里,您可以設置預處理器宏。 只需在調試和/或發布設置中添加'UITESTING = 1'即可。 結果是在測試構建中將定義UITESTING,因此預處理器將包含#ifdef UITESTING下的所有代碼。

我會使用Facebook的Snapshot測試庫進行快照測試

基於視圖的測試意味着驗證用戶看到的內容是您希望用戶看到的內容。 這樣做意味着能夠確保不同版本的視圖或視圖的不同狀態看起來保持不變。 基於視圖的測試可用於提供涵蓋對象周圍的大量用例的高級測試。

你可以在這里找到一篇更詳細的文章

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM