2010-01-09 93 views
4

你在哪裏把私人函數的單元測試放在C#類中?你在哪裏把私人方法的單元測試?

article in Wikipedia提示:

  • 把測試在同一個班,他們正在測試
  • 使用部分類

個人成員,這些方法都似乎是適當的,和我更願意將單元測試放在一個單獨的項目中。

對此有何看法?

(我知道有關於是否私有方法應該在所有被測試的辯論相當數量的。我想聽到爭論的雙方。)

+1

我認爲把測試代碼放在生產代碼中是一個壞主意。 – Benny 2010-01-09 18:25:38

+0

您使用哪種測試框架(如果有)? – 2010-01-09 21:38:28

回答

14

私有方法不一定需要直接測試。您可以根據利用這些私人方法的公共方法的測試來確定其有效性。

然而,你應該小心,以確保您的公共方法可以輕鬆地將模擬依賴到你的私有方法,以方便測試和模擬所有合理的方案。

編輯:至於你的其他測試應該在哪裏,我建議在你的項目中的一個單獨的子目錄來處理你的測試。在爲PHP應用程序編寫測試時,我的項目根目錄中有測試目錄,其目錄結構與我的真實應用程序目錄結構相同。其中,我爲每個真實課堂都有一門測試課。

只是不釋放到生產時你的項目的其餘部分編譯你的測試類(或類似PHP的語言interpretted的情況下,不部署測試類生產Web服務器)。

+2

+1表示很好。 :) – 2010-01-09 17:54:04

+0

那麼你是說私人函數中的代碼應該沒有任何依賴,這些依賴沒有被該類的構造函數或公共方法接收到參數中? – Jonathan 2010-01-09 17:55:47

+0

同意使注入依賴,能夠替換任何依賴簡化了測試。通過構造函數或屬性接收它們是標準的,適合容器。當它只是出於可測試性目的時,您還可以考慮使用內部方法或屬性。 – Mathias 2010-01-09 18:14:46

1

您的問題標題和第一句是不同的。 :)

我不確定放置測試的位置。這將取決於語言和C#不是我熟悉的,但我想你的代碼的很大一部分是私有方法。如果沒有測試,我會感到不舒服。代碼覆蓋率會下降很多。

+0

對此感到抱歉,我編輯了標題。 – Jonathan 2010-01-10 03:43:51

9

不要單元測試私有方法。單元測試用於測試類的可見(如此公共和受保護的)接口。私有方法是實現細節,爲它們編寫單元測試是不必要的(它們的行爲應該通過對可見方法的測試隱式測試),導致脆弱的測試(因爲實現細節可能會改變),並且是重構的障礙。

如果你有,你覺得你需要進行單元測試的私有方法,這是一個很大的提示,也許它應該被分解成另一個類的公共方法。

你在哪裏把私人函數在C#類的單元測試?

無處。他們不存在。

一般來說,我的單元測試是在單獨的項目中。

+4

這指出了測試的目的:測試說「你的對象工作正常」,它是:「你的對象的公共接口工作正常」。如果事實上你的私有方法的原因是公共方法,那麼它們必須只存在於爲公共方法實現某些東西。所以如果你測試公共方法,你正在測試私有方法。測試驅動開發說:如果你想做一些事情寫下測試,然後執行它。這樣你只需要編程公衆就可以了。私人方法將遵循相同的政策。 – helios 2010-01-09 18:01:05

+0

是隻有一個構造函數和私有方法沒有用於單元測試的類? – 2010-03-25 14:08:29

+0

感覺「我需要測試這個私有方法」可能表明代碼需要重構,私有方法中的功能應該移到其他類中,並以公共方法公開。 – 2013-06-18 08:21:50

1

我們在Visual Studio中使用私有訪問器來測試私有方法。這意味着測試類可以存在於一個單獨的項目中。

然而,我們儘量要真正限制這些,因爲數字:

  • ,可以獨立的私有方法可以在其他類中拉出的公共方法
  • 私人沒有方法做任何特別有用的課外活動都可以通過該課程的公開方法進行測試。
9

我也個人喜歡在單獨的項目中進行單元測試。 如果你想單元測試一個私有方法,你可以改爲私有方法。然後,您可以看到內部方法,你的單元測試通過直接添加以下到AssemblyInfo.cs中呼籲:

[assembly: InternalsVisibleTo("MyAssembly.UnitTests")] 
+0

+1,但我認爲最好只測試公共I/F。 – kenny 2010-01-09 18:40:59

2

我同意私有方法不應該被測試,一般來說,因爲你應該只測試公共接口。

話雖這麼說,是有原因的,你可能想測試私有方法:

  1. 您正在使用TDD,你必須制定一個複雜的私有方法。爲私有方法創建測試方法可能是必要的,以保持您的寫測試代碼 - 測試周期的正確粒度。

  2. 您可能是團隊的一員,其他人可能需要修改私有方法,並且希望測試確保更改不會產生問題。

一些解決方案:

  1. 聲明一些方法,這些方法公衆代表對私有方法和只用於測試目的。這些可以作爲例如前綴。與TestFoo1,TestFoo2等

  2. 使用內部

http://msdn.microsoft.com/en-us/library/7c5ka91b(VS.80).aspx

3

你應該爲你做什麼工作;這裏是什麼適合我:

我的單位是一類:這就是我想要測試。不是一種方法。我試圖做面向對象編程,所以我把注意力放在對象上。

如果我發現自己試圖測試一個私有方法,我需要重構。我只想直接測試一個私有方法,因爲它和測試之間的代碼太多了,而且私有方法本身足夠複雜,需要測試注意。所以,我通常會通過提取類來將該私有方法和其他相關成員拉入新類。

我的班級傾向於相當。他們很容易閱讀和理解。當然,我的方法也很小,很容易理解。

轉換到這種工作方式需要我重新思考許多關於編程的假設和習慣。曾經看起來很激進的現在看來很平常。

+0

+1,如果您想要測試私有方法,您(可能)需要重構。 – 2010-01-09 18:24:32