2011-08-17 83 views
3

考慮以下條件:單元測試遺留代碼:「提取和覆蓋」與JustMock/TypeMock/moles的限制?

  • 一個很老的,大的,C#遺留代碼庫,沒有testcoverage任何
  • (幾乎)每一個類從某個接口
  • 沒有密封派生

使用Profiler-API驅動的解決方案(如JustMock和TypeMock)相比於使用提取&覆蓋+例如RhinoMocks?有沒有我不知道的情況,除了規避私人/保護,使用TypeMock/JustMock等真的需要?我特別歡迎來自切換到其中一種產品的人的一些經驗。

使用提取&覆蓋似乎可以解決處理舊的遺留代碼時的所有問題,重構看起來很簡單,引入錯誤的可能性似乎很小。編寫少量測試代碼的好處是什麼?更少的虛擬受保護的東西更美麗的類?現在,我不明白這一點,儘管我明白首先單獨測試私有方法是非常有用的,因爲公共方法在這些舊的代碼庫中可能太大了。

如果你不知道什麼提取&覆蓋是:見here

+1

太長。沒有讀。什麼是問題? –

+0

它範圍從1.1到3.5,我寧願不把自己鎖定在一個特定的版本限制,但我很好奇:這個答案如何影響答案呢?有沒有C#3.0/3.5功能,我不能存根/模擬正常? – hko

+0

啊,當我寫這個評論時,我誤解了你的問題。請忽略。 [[[這些不是你正在尋找的機器人。]]] –

回答

2

框架之間有許多不同之處,它們不考慮構建框架的技術。

例如:

  • API - 每個框架有不同的符號和默認值(例如 嚴格的違約與放鬆默認)
  • 支持 - 禮框架通常與許可證提供支持
  • 價格 - 這是不是使用的問題,而是需要預算

提取& OVERR的主要優點ide是它需要一些重構,如果你正在處理的代碼被忽略了,它提供了一個很好的機會去重構它,並將它重構成更好的代碼,而不僅僅是爲了可測試性。

使用隔離框架的主要優點是,您不需要更改測試下的代碼(如果它是一個大的代碼庫,可能需要很長時間才能重構它以獲得可測試性)。另外,隔離框架不會強制你進入特定的設計,如果遺留代碼更好地匹配現有設計,這可能會有所幫助。另一個在遺留代碼中很有用的特性是交換在測試代碼中創建的實例,通常重構實例化需要更多的努力,這可以被保存。最後一件事是僞造第三方代碼 - 使用隔離框架,你可以隔離不屬於你的代碼而不使用包裝類。

免責聲明 - 我的工作在Typemock

+0

我不明白你的「主要優勢」句子:如果我使用Extract&Override,我會盡可能少地重構它,使它更容易測試。如果我做了其他任何事情(如財產DI或建設者DI或引進工廠),這不是提取&覆蓋了。當然,如果不存在,我需要引入接口來提取和覆蓋,但是在我的代碼庫中不是這樣。 – hko

+0

我完全理解第三方問題,好點。 「通常重構實例需要更多的努力,這可以節省」:你是什麼意思與實例化,你有一個具體的例子? – hko

+0

@hko,關於第一條評論 - 你說得對,Extract&Override很簡單,但是從我的經驗來看,通常在重構代碼時,它很有誘惑力,可以做更多的事情:) 關於實例化 - 假設被測試的類是UT,它直接通過它的構造函數使用A類(只是調用新的A())。假設我想從A中隔離UT,我必須將它作爲參數傳遞,所以我需要將所有呼叫者更改爲UT。例如,使用隔離器,您可以使用Isolate.Swap.NextInstance ().with(fakeObject)並避免其他代碼更改。 – Elisha

相關問題