2017-04-20 68 views
0

我有一套測試,我正逐漸在視頻文件上寫測試不同的功能。 (我在我的資源包中包含一個測試視頻。)逐個運行這些測試時,它們會成功。但是從Xcode的測試導航運行他們都在一起時,他們開始生產負荷的錯誤,如"The requested URL was not found on this server."(使用AVAssetImageGenerator - 類似的消息「無法找到該網址」是爲其他文件加載操作生成的。)Xcode iOS - 使用相同資源的多個測試失敗 - 如何使用1資源進行多項測試?

我可以擺脫這些錯誤,並通過簡單地複製我的測試視頻併爲每個測試用例使用不同的文件,讓所有測試都能夠完美運行。我目前使用NSFileManagerAVAsset類從文件URL加載視頻,我現在最好的猜測是測試正在並行運行,並且當測試資源視頻文件被一個線程使用時被系統鎖定。

這個每個測試一個文件的場景對於視頻來說並不理想,因爲我的測試資源文件夾正在快速增長!

跨多個測試使用一種測試資源的好方法?

編輯:我的測試中跨越不同的測試文件,我得到在所有情況下的文件URL(這始終是有效的),如

testVideoURL = [[NSBundle bundleForClass:[self class]] URLForResource:@"TestVideo3" withExtension:@"MOV"]; 
+0

你能展示一個最小代碼示例 - 至少有兩個測試用例在一起運行時會失敗,以及所有setup/teardown方法嗎? – Losiowaty

回答

0

您是否嘗試過創建一個輔助方法來加載文件,然後將其視爲僞單身?

一些非常簡單的零檢查就足夠了,例如:

-(VideoClass *)loadMyVideo { 
    if (_myVideo == nil) { 
     VideoClass *loadedVideo; 
     // load video logic here 
     _myVideo = loadedVideo; 
    } 
    return _myVideo; 
} 

我最近也有類似的問題,與我自己的測試,此導航很好,在我的記憶tearDown爲零,分配屬性和將它們分配到setUp

我非常懷疑測試正在並行運行,除非你明確地設置它們,因爲默認情況下它們在主線程上同步運行。 但是,如果您擔心這一點,那麼您也可以嘗試在if語句中使用dispatch_once初始化。

+0

嗯不要認爲這會幫助我的情況 - 正如我提到的一些我正在測試的代碼使用NSFileManager,一些使用AVAsset,這些只需要文件的URL,並做自己的私人事情。 – Mete

+0

此外,如果測試沒有並行運行,那麼我不明白爲什麼代碼會從其他測試單元第二次/第三次「找到」文件URL的問題。 – Mete

+0

可能與NSFileManager和AVAsset的加載方式有關該文件,而不是測試如何運行。 如果他們這樣做了,而且我懷疑他們可能會這樣做,並且有後臺請求,那麼除非您想爲它們編寫在主線程中執行相同操作的類別,否則您的運氣並不好,這可能不是一個好主意。 我想,你可以放入某種信號標記來等待這些任務完成。但是我對這兩門課幾乎沒有任何經驗,所以我不確定如何從這裏繼續下去。 – royalmurder