2011-11-22 64 views
4

在處理最終一致的數據存儲(如MongoDB)時編寫測試用例的最佳做法是什麼?最終一致性和測試用例

我目前的設置是Mongodb,它有一個3節點主/從/從設置,slave-ok設置爲true。這意味着主節點用於只寫,而兩個從節點用於只讀。

數據在從站上一致的時間相對較短,並且取決於操作和數據大小。例如,對於1000個對象,刪除操作的時間約爲3毫秒,批量插入的時間約爲200毫秒。

我的目標是測試我的道操作。它們可能很簡單,比如getById,刪除,插入,或者像findByExample這樣的複雜類。我需要驗證它們是否正常工作,最終一致性可以接受。

這是我目前的測試刪除操作,例如:

@Test 
    public void deleteTest() throws InstantiationException, 
       IllegalAccessException { 
     MyObject obj = new MyObject(); 
     obj.setName("test object"); 
     obj.save(obj); 
     MyObject found = dao.findById(obj.getId()); 
     logger.info ("before: " + found); 
     Assert.assertEquals(obj, found); 

     dao.delete(obj.getId()); 
     MyObject deleted = null; 
     long start = System.nanoTime(); 
     do { 
       //TBD: need to add escape condition/timeout, else may be infinite loop.... 
       deleted = dao.findById(obj.getId()); 
       logger.info ("While: " + deleted); 
     } while (deleted!=null); 
     logger.info("It took " + ((System.nanoTime()-start)/1000000.00) + " ms for delete to be consistent"); 
     Assert.assertEquals(null, d1); 
    } 
+0

你想測試什麼?您的應用程序如何處理「陳舊」數據?或者您的MongoDB安裝需要多長時間才能傳播更改? – Thilo

+1

我正在測試我的Dao上的操作。它們可能很簡單,比如getById,刪除,插入,或者像findByExample這樣的複雜類。我需要驗證它們是否正常工作,最終一致性可以接受。 – ltfishie

+0

在這種情況下,讓他們在查詢奴隸之前讓他們睡在可接受的限度內(如果這樣做不必要的時間過長,讓他們每秒鐘醒來)。 – Thilo

回答

1

一對夫婦的想法浮現在腦海

  1. 在生產中,如果你是從從準備,你永遠不知道你是否獲得最新的數據。這是MongoDB中讀取從機的權衡。我的經驗是,在正常的工作條件下,奴隸是最新的。如果您必須獲取最新的數據,請查詢主數據。
  2. 我肯定會開始使用mms來追蹤您的副本滯後。這將告訴你,你的奴隸背後有多遠,以便你能感覺到數據有多快可用
  3. 至於最初的測試問題,它取決於你的目標。無論是複製還是獨立,您的DAO都應該能夠讀寫它們。您只需確保您的應用程序瞭解它所查詢的數據可能不是最新的數據。
1

對於你正在做的事情,你可以依靠這樣一個事實:對於一個副本集,mongo將始終寫入主節點。因此,我想刪除測試改變這樣的事情:

/* 
* get this from the DAO, 
* or use the instance injected into the DAO, etc. 
*/ 
DBCollection collection = something(); 
DBCursor itemsRemaining = collection.find(); //find everything 
itemsRemaining.setReadPreference(ReadPreference.PRIMARY); //force query to the master 
Assert.assertEquals(0, itemsRemaining.count()); 

通過DBCollection做測試允許用戶直接強制測試查詢使用主。我會測試findById(anyOldId)將返回null,當項目不在一個單獨的測試集合中。