2017-04-11 96 views
0

我正在爲我的sqlite數據庫類編寫單元測試用例。我在這個班有五個公共API。執行整個測試套件時,單元測試用例失敗

我的測試用例是這樣的東西如下:

+ (void)setUp { // Note, this is class method and hence called only once during start of this test suite. 
    // Code to delete the existing sqlite DB file. 
} 

- (void)testDBManagerSingletonInstance { 
    DBManager *dbMgr = [DBManager getSharedInstance]; 
    DBManager *dbMgr1 = [[DBManager alloc] init]; 
    XCTAssertEqualObjects(dbMgr, dbMgr1); 
} 

- (void)testSaveAndDeleteNicknameAPI { 
    // Multiple Assert statements in this test. 
} 

- (void)testAllAccountStatusAPIs { 
    // Multiple Assert statements in this test. 
} 

每一個單元測試沒有任何錯誤被執行。但是當整個測試套件被執行時它會失敗。

也許,我知道根本原因失敗。這是因爲當整個測試套件被執行時,所有測試並行執行,並且同時發生更新 - 刪除操作。因此,當所有的單元測試運行時都會失敗。

但我不知道我該如何解決這個問題,因爲這不是異步,因此我不能使用XCExpectation類。

需要幫助解決&瞭解問題。

+0

你已經說過答案..如果測試都使用相同的數據庫,那麼它的內容都處於不斷變化的狀態,正如你所說......解決方案是讓每個單元測試看看單獨的數據庫或單獨的實例或分開表格......或強制順序執行。測試時的規則是你必須知道數據庫的內容..在這種情況下,你永遠不會知道,因爲它正在被多個進程同時設置和測試。 – Spoon

回答

0

基於XCTests的測試不會並行運行 - 它們將按順序運行。引用the docs

測試是同步執行的,因爲每個測試都是獨立調用的。

既然您已經顯示了很少的代碼,很難說什麼是真正的問題。很可能你的假設很接近 - 你應該改善你的setUp(也許切換到實例版本的類版本)和tearDown方法或引入模擬,並儘可能在模擬數據庫上執行測試。

0

你不應該在你想測試的代碼庫中使用單例。我認爲你的代碼在內部使用DBManager的sharedSingleton實例。每個unitest將改變該實例的內部狀態,因此所有跟隨的unitest因此被破壞。在拆解每個測試用例之後,您需要重置所有更改。

但我的建議是通過依賴注入來避免你的基本代碼中的單例。在創建類的實例時,注入DBManager的單例實例。這使得單元測試更容易。如果你注入一個協議而不是一個對象,你甚至可以使用協議假實現來測試你的代碼。