2017-10-10 137 views
0

我的應用程序使用位置服務,並且我有代碼提醒用戶位置服務是否被禁用。這有一個按鈕,允許他們切換到設置應用程序並啓用它。這工作正常,但我想寫一個UI測試,檢測它,如果可能的話。IOS UI測試:如何確定被測試的應用程序是否切換到設置應用程序?

目前,我的UI測試正常工作,檢查是否顯示警報,並且它有一個設置按鈕。點按按鈕時,我可以通過模擬器或物理設備確認應用切換到設置。

我不確定我能否告訴設置應用程序本身通過UITest出現(這會很好!),但我可以檢查被測試的應用程序是否進入了背景(這足夠好了!)

在我的AppDelegate我有一個確認應用程序正在經歷applicationWillResignActive(...)和applicationDidEnterBackground(...)打印報表

我試過如下:

let predicate = NSPredicate(format: "self.state = XCUIApplication.State.runningBackground", argumentArray: nil) 

_ = self.expectation(for: predicate, evaluatedWith: app, handler: nil) 
waitForExpectations(timeout: 10.0, handler: nil) 

XCTAssertTrue(app.state == .runningBackground, "Doesn't look like the Settings App was launched") 

和控制檯下垂這是wai在期待 - 它每秒記錄一次。請注意,'app'是我在測試中使用的XCUIApplication()的實例。最終,期望超時並且測試因爲沒有完成而終止。此時,我的兩個打印語句(退出活動,進入後臺)出現在控制檯上。

這似乎是我的應用程序正在按預期工作,但期望並不決定應用程序狀態的變化。我試過將等待時間設置爲60秒,但結果是相同的,所以不是等待時間不夠長的情況。

沒有期望,即代碼直接從按設置按鈕檢查斷言,斷言失敗,因爲應用程序狀態是.runningForeground。我認爲執行速度太快了,因此試圖等待狀態改變。在這種情況下,斷言失敗,測試結束,然後在控制檯中顯示「Resigning active」,但不顯示「輸入背景」。

這是Xcode 9上的ios11,行爲在模擬器和物理設備中是相同的。

總之,問題是:以編程方式測試Settings應用程序啓動的最佳方式是什麼?

回答

1

所以看起來我太過於複雜了!在等待答案時,我想我會查看是否可以檢查UI元素變爲不活動狀態或類似狀態。那是當我發現:

app.wait(for: .runningBackground, timeout: 10) 

當達到該狀態時返回true!它的工作原理。很明顯,我不知道現在運行的應用程序是否爲設置,但它足夠好,因爲在該UI測試中實現該狀態的唯一原因是激活了設置URL。