2009-10-01 74 views
1

我正在學習單元測試的最佳實踐(特別感謝這篇文章:What makes good unit-test?),因爲在我的項目中,我們開始以無秩序的方式進行單元測試。所以現在我必須從一開始就採用幾乎所有的測試方法。我是否必須進行沒有特定功能的單元測試類?

引用帖子沒有回答的一個問題是,我是否必須測試所有類,即使是沒有特定功能的類?

編輯:「沒有功能」我的意思是一個沒有公共方法的類。例如,只有2個自動實現的名稱和姓氏屬性的Person類。

+3

你能詳細說明你的「沒有特定功能的類」是什麼嗎?只要它們包含代碼,我會假定它們具有特定的功能...... – 2009-10-01 11:27:54

+0

事實上,「S. DePouw」指出的正是我考慮進行單元測試的那種情況。 某些類只包含自動實現的屬性,這意味着沒有特定的功能。 – Ucodia 2009-10-01 13:55:46

回答

2

沒有功能的類的例子是類似於域對象的東西嗎?

public class DomainObjectFoo 
{ 
    public int Id { get; set; } 
    public string Name { get; set; } 
    public DateTime DateCreated { get; set; } 
} 

如果您的所有類都包含自動實現的屬性,字段等,那麼確實沒有任何要測試的東西。但是,這個時候,你添加了一些像

public override string ToString() 
{ 
    return Name; 
} 

那麼它值得單元測試。在這種情況下單元測試可能很簡單,但沒關係。它將描述ToString應該返回的內容(在這種情況下,Name)。您甚至可以爲此方法編寫邊界案例:如果Name爲空,該怎麼辦?如果名稱爲空,該怎麼辦?一般來說,.NET的東西(比如自動實現的屬性)不需要單元測試,以確保getter和setter的工作。然而,即使是最簡單的功能(在這個例子中,ToString())也應該被測試。

+0

這與我正在考慮進行單元測試的情況完全吻合。 – Ucodia 2009-10-01 13:52:35

6

可以說,你不應該有沒有特定功能的類(見single responsibility rule),但答案是肯定的。理想情況下,您應該在您編寫的任何課程上單元測試全部公共方法/屬性。

理想:

  • 首先編寫測試。
  • 創建類/方法等,使測試編譯。
  • 實現測試通過所需的最小代碼(如果需要,甚至返回硬編碼值以匹配測試)。
  • 重構刪除重複(即更改代碼,使其「正常」工作,而不是返回硬編碼的「正確」值)。
  • 進行小的更改,以便測試繼續通過,並且您知道恰好爲測試開始失敗後,失敗的原因是什麼。
  • 稍後,沖洗,重複。

我從Kent Beck TDD book得到了這個過程。

0

任何類別都應該測試。測試自動化是減少軟件缺陷的人爲因素的唯一途徑。這可以通過簡單的測試(分而治之;)和優秀的軟件設計來實現。

如果你的類實現了幾個任務,然後拆分它。如果它實現了一個任務的情況,但其中一些任務非常龐大,那麼將一些代碼移到底層類中,這些類將在需要時調用。但是不要執行那些設計不好的東西,因爲這意味着它沒有正確定義 - 這導致分析不佳。

0

就你而言,我不知道是否值得測試公共自動生成的屬性。但是,如果您期望得到非空值,您應該考慮。

例如:

public IList<Thing> Things {get; set;} 

如果你設置之前得到這個屬性,你會得到一個空,也許你希望(我經常這樣做)與零個元素的列表。

問候!

+0

那就是那種讓我懷疑測試與否的情況。 我會混淆那裏的所有想法,那就是要做到這一點。謝謝大家 ! – Ucodia 2009-10-01 20:16:15

0

我打賭你的課程確實有功能。例如,我敢打賭,如果構造函數通過不正確的輸入,它應該拋出一個異常。另外,我敢打賭,你們大概可以相互比較一下,並且如果它們都封裝相同的值,那麼期望它們是平等的。

如果它確實沒有任何功能,並且在概念上更像是一個結構,那麼我看不到任何實際測試的需要。

相關問題