我的應用程序使用位置服務,並且我有代碼提醒用戶位置服務是否被禁用。這有一個按鈕,允許他們切換到設置應用程序並啓用它。這工作正常,但我想寫一個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應用程序啓動的最佳方式是什麼?