2015-09-19 27 views
19

我正在開發一個iOS項目,我需要從UI測試目標訪問主機應用程序的代碼,但是我發現它顯示鏈接錯誤:undefined符號當我試圖。我發現這個目標的測試主機和軟件包加載器都是空的,所以我將它們設置爲我的主機應用程序,並可以通過鏈接錯誤。但是,在運行時,調用XCUIApplication.launch()時仍會失敗。有沒有人想過如何從這個UI測試目標訪問主機應用程序的代碼?無法做到這一點,我們不得不做所有的UI測試,這是非常片狀的。我們肯定需要在測試場景中使用非UI步驟。我正在使用Swift來處理我的項目。從Xcode 7 UI訪問主機應用程序代碼測試目標

+0

我有完全相同的問題。我使用[link](http://twobitlabs.com/2011/06/adding-ocunit-to-an-existing-ios-project-with-xcode-4/)作爲bundle loader/test host和[link]( http://savvyapps.com/blog/how-to-implement-ui-testing-in-an-existing-ios-app),其中註明要在主要目標中驗證「啓用可測試性」。我已經得到了與你完全相同的觀點。自發布此問題後的最後幾天發生任何運氣? – Chris

+0

就像@Konnor在他們的回答中所說的,你無法從UI測試中訪問你的應用程序的進程。你想做什麼?在我們的測試中,我已經成功解決了這些限制。 – kubi

+0

@kubi:我對您的解決方法感興趣。我想在單例對象中設置/讀取一個屬性。因爲這可以通過在測試應用程序中添加一個用戶界面來完成,但這有點矯枉過正。你有沒有找到更好的解決方案? –

回答

6

使用Apple在WWDC 15中引入的新UI自動化框架,無法從UI-Automation測試中訪問您的應用程序的代碼。它意在模擬用戶可以訪問的內容,這有時會令人沮喪。

+2

你有沒有關於應用程序代碼不能從ui測試中訪問的聲明來源? – singingAtom

+0

@singingAtom UI測試是與應用程序分離的模塊,因此不會像邏輯測試那樣在應用程序中運行。他們共享代碼的唯一方法是編譯所有需要在這兩個模塊之間共享的應用程序文件。希望有所幫助。 – cakes88

+0

@ cakes88你有沒有提及你最近的聲明如何工作? –

32

在運行UI測試之前,我使用以下技術在我的應用程序中設置值。有用的設置默認值或打開網絡嘲笑,等等。大多數情況下,我不需要閱讀什麼都不是應用程序。一切都反映在用戶界面中,並可以通過這種方式進行測試。很快我們將添加測試以確保應用程序進行某些網絡調用。我還不確定我們將如何在UI測試用例中測試它。

在你的UI測試設置參數

let app = XCUIApplication() 
app.launchArguments = ["ResetDefaults", "NoAnimations", "UserHasRegistered"] 
app.launch() 

在你的應用程序讀取參數

func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool { 

    var arguments = NSProcessInfo.processInfo().arguments 
    arguments.removeFirst() 
    print("App launching with the following arguments: \(arguments)") 

    // Always clear the defaults first 
    if arguments.contains("ResetDefaults") { 
     destroyUserDefaults() 
     clearKeychain() 
    } 

    for argument in arguments { 
     switch argument { 
     case "NoAnimations": 
     UIView.setAnimationsEnabled(false) 
     case "UserHasRegistered": 
     Defaults.userRegistered = true 
     default: 
     break 
    } 
    } 
} 

額外獎金:如果您使用啓動參數來配置你的應用程序,是微不足道的標誌添加到您的Xcode方案。例如,我有一個清除所有存儲數據的方案,並用成功響應對所有登錄嘗試進行存根。我現在可以通過模擬器「登錄」而不需要訪問任何服務器。

+0

哈哈,我剛剛實現了。作爲第二步,我試圖通過文件界面傳回信息。我在應用程序中寫入文件'a',並嘗試在測試中讀取它,但它不一樣。不知道爲什麼... @「/ var/mobile/Containers/Data/Application/DD4A912D-5808-40AC-9BAD-0」/ var/mobile/Containers/Data/Application/8EDD0F16-005B-49E7-B8E3-726F195989DD/Documents/a「 @ 0475842190DA/Documents/a「 –

+0

如果你想出點什麼,寫一篇博文!我相信很多人會感興趣。我認爲前進的道路可能是對本地服務器進行API調用。聽起來有點複雜,但我敢打賭它可以用30行python腳本處理。 – kubi

+0

請注意,對於要由NSUserDefaults解析的參數,鍵和值(例如'-AppleLanguages'和'(en)'需要是兩個獨立的數組元素。 –

相關問題