2012-09-20 58 views
1

我有兩個測試,它們是完全一樣的......除非兩件事情,他們叫兩個獨立的服務電話..因此,當使用即時通訊的Mockito我有兩個不同的預期和驗證線...測試氣味....這是一個好習慣嗎?

這是我這樣做:

@test 
TestA { 
    baseTest("player"); 
} 

@test 
TestB { 
    baseTest("member"); 

} 

BaseTest(type type) { 
    .... 
    ..... 
    if type(player) { 
    Mockito.when(player service call) 
    } 
    else { 
    Mockito.when(member service call) 
    } 

    // make the call in code 

    //verify 

    if(player) { 
    verify player specific service call... 
    } 
    else { 

    } 
} 

我覺得上面的是一個測試的氣味......只是不覺得不對勁......

是否有更好的方法,然後將If語句在我繃測試?

+1

@maba,我開始同意你的看法,但這個用戶很新。抱抱他會回來的希望。 – TecBrat

+0

@TecBrat我知道我們不應該評論人的AR,但在這種情況下,我無法抗拒... – maba

+0

@maba我再問一次什麼是AR?... MFA !! – user1555190

回答

3

您應該獨立開發測試代碼,並在他們有意義。

舉例說明。初始化代碼的一條經驗法則(排列/行爲/斷言的第一個A)是:

  1. 您應該在測試中寫入測試方法的所有Arrange部分。
  2. 如果您的方法與所有其他方法共享初始化,然後將其置於@Setup方法
  3. 如果某些測試方法不共享該初始化,可能是因爲它不適合該測試用例。

所以我的結論是:

  1. 寫獨立測試
  2. 如果他們共享的東西,你可以重構
  3. 但不會太大(或類似的「如果」是個奇怪的事情)! !增加複雜性,而不是重複使用。

實際上@artbristol的答案是有意義的:如果你使用if來替代行爲考慮多態性。這只是我不確定,直到哪一點對測試來說都很複雜(如果代碼正在測試類似的類層次結構,則可能是有意義的)。

0

我仍然只是單獨實施2個測試類。代碼長度和重複對於測試並不重要,代碼可讀性,完整性和正確性優先。有鑑於此,只需分別實施2個測試用例。

+2

代碼長度和重複在測試中很重要。如果你能重構掉重複的測試功能,你絕對應該這樣做。維護更少的代碼總是更容易。我讚賞OP試圖減少測試代碼的數量,即使它們沒有以最好的方式做到這一點。請參閱@ artbristol的回答,以獲取最佳方式的意見。 –

4

任何你看到重複如果這樣的陳述,你可以使用多態。您應該在超級BaseTestSuper中提供「玩家服務調用」和「會員服務調用」方法,該超級方法也將擁有現有的BaseTest方法。

+1

+1爲多態性建議。我不確定在測試中使用它,但它非常有趣。 – helios

0

一般而言,您不應該爲測試增加任何複雜性。首先,你可以在那裏犯錯(即使在簡單的情況下)。其次,您的測試不再是一個文檔,這意味着您無法輕鬆理解測試類的使用情況和行爲。

所以這是一種氣味。 :)

相關問題