2015-03-30 36 views
0

對於每種情況,適當的做法是什麼?適當的單元測試理念

1:上下文:測試一個用於創建數據庫的功能,以及該數據庫生成的元數據

問題:正常情況下的單元測試用例都應該是獨立的,但如果我們要確保功能引發嘗試創建重複數據庫時發生異常,是否可以接受有序的測試用例,其中第一個用於測試函數是否有效,第二個用於測試再次調用時是否失敗。

2:大多數其他功能需要數據庫和元數據。在每個測試套件的設置中調用前面的函數來創建數據庫和元數據會更好嗎,還是最好在數據庫中硬編碼所需的信息?

回答

0

通常情況下,單元測試用例應該是獨立的,但是如果我們想要確保該函數在嘗試創建重複數據庫時引發異常,那麼可以接受第一個測試用例該函數起作用,而第二個函數測試在再次調用它時是否失敗?

不,有序的測試是不好的。沒有什麼阻止你有一個測試呼叫正好是一個考驗,雖然另一種方法:

@Test 
public void createDataBase(){ 
    ... 
} 

@Test 
public void creatingDuplicateDatabaseShouldFail(){ 
    createDataBase(); 
    try{ 
     //call create again should fail 
     //could also use ExpectedException Rule here 
     createDataBase(); 
     fail(...); 
    }catch(...){ 
    ... 
    } 
} 

大多數其他功能需要一個數據庫和元數據。在每個測試套件的設置中調用前面的函數來創建數據庫和元數據會更好嗎,還是最好在數據庫中硬編碼所需的信息?

如果您使用像DbUnit之類的數據庫測試框架,它可以在每次測試中重複使用相同的數據庫設置。

+0

如果您的測試執行基於速度和範圍,則有序測試是很好的。例如,先執行單元測試,然後再執行集成測試。 – 2015-03-30 19:02:37

+0

這與OP詢問的「訂購」不一樣。在這種情況下,排序意味着「在此之前執行此單元測試」。分離單元測試和集成測試(或基於速度的類似類別)是好的並且通常是有益的,但是這些組中的測試的執行順序應該不重要 – dkatzel 2015-03-30 19:04:36

+0

出於好奇,爲什麼有序測試本質上比上述更差使用一個測試來運行另一個測試兩次的解決方案? – 2015-03-30 19:13:43

1

你的自動測試應如下建模:

  1. 設置
  2. 練習(SUT)
  3. 驗證
  4. 拆卸

另外,每個測試應儘可能爲簡明可能的並且僅暴露正在測試的細節。應該抽象執行測試所需的所有其他基礎架構,以便將測試方法用作文檔,只顯示正在測試的輸入,以確定您想要驗證的特定測試。

每個測試都應努力從乾淨的平板開始,以便每次都能夠以相同的結果重複測試,而不管之前執行的測試結果如何。

我通常對每個集成測試或任何依賴於維護待測系統狀態並需要擦除其狀態的單例的測試執行測試設置和測試清理方法。