我有一個以.NET 2.0編寫的舊WinForm應用程序。該應用程序不遵循任何模式或圖層模式。我的客戶現在想引入單元測試框架。由於它是實時應用程序,所以重新編寫整個代碼非常危險。我應該遵循什麼方法?將.NET應用程序轉換爲測試驅動的應用程序
由於提前
我有一個以.NET 2.0編寫的舊WinForm應用程序。該應用程序不遵循任何模式或圖層模式。我的客戶現在想引入單元測試框架。由於它是實時應用程序,所以重新編寫整個代碼非常危險。我應該遵循什麼方法?將.NET應用程序轉換爲測試驅動的應用程序
由於提前
有一本我見過的關於這個確切主題的書,我沒有看過它,但它似乎適合您的問題,但我不知道它是WinForms這個事實是否複雜。
「修改代碼的工作」
在的WinForms真的很難進行單元測試,因爲後面的代碼是緊密相連的GUI本身。一些自動化測試可能是最好的,你可以在WinForms應用程序上得到最好的結果,而不用改變程序。
如果你的客戶想要一個可測試的解決方案,我會建議在WPF中製作它,並使用像Caliburn.Micro這樣強調單元測試的MVVM框架。
不幸的是,這意味着重寫整個應用程序。
簡短的回答
要麼重寫應用程序,或者也懶得多與單元測試。
由於WinForms的應用程序通常具有強烈再加上潛在的「數據模型」,某種形式的自動化UI測試的用戶界面可能是你最好的選擇 - 即外部應用程序模擬用戶的點擊和與UI的其他交互,並在此之後檢查您的程序是否處於預期狀態。
你可能想看一看:
http://smartbear.com/products/qa-tools/automated-testing/supported-testing-types/functional-testing/
要做到這在UI測試(因爲它是一個基於.NET),你可以使用淨重量輕測試自動化功能。這裏的詳細信息http://msdn.microsoft.com/en-us/magazine/cc163864.aspx 您不必使用外部工具進行自動化。但是,爲了測試底層或業務邏輯,你必須擴展測試用例。
我會建議你把最關鍵的部分移到正常的C#類和單元測試那些。然後只對GUI的複雜部分進行UI測試。我從事過一個遺留項目,但使用ASP.NET Webforms而不是Windows窗體,我注意到系統的某些部分經常變化,並且很適合重構和單元測試,而其他部分從未更改過,只是不值得測試的努力。
如果這是一個大項目,那麼這可能需要很長時間。這項工作的一大部分是使代碼可測試並引入某種MVP(Model-View-Presenter)模式,以便能夠將GUI代碼與業務邏輯分開。
我強烈建議您按照Eoin Carroll的建議有效使用遺留代碼。它描述了使用遺留代碼的技術,並通過展示它可以完成的動作(可能會遇到一些困難時期)提供動力。
這取決於你想測試什麼,以及如何編寫應用程序。
GUI很難測試,但請查看一些其他答案。正如我懷疑的那樣,如果您只想測試業務層,那就更簡單了:
如果應用程序的業務與GUI解耦,那麼您可以輕鬆使用NUnit,可以通過將其集成到IDE中的項目中,或者以NUnit自己的方式,然後編寫測試以涵蓋業務層向GUI公開的功能。
如果應用程序未解耦,並且GUI中有很多邏輯,那麼您確實需要重構和解耦。如果沒有這樣做,您將被限制在通過GUI進行測試,這很困難,而且不是完全可以證明的,這意味着GUI的微小變化可能會使您的業務邏輯測試失效。
+1:我已經閱讀過,而任何試圖改進和向現有代碼庫添加測試的人都應該閱讀它。 –