如何在Visual C++ 2010中實踐測試驅動開發

發表于:2011-02-23來源:作者:點擊數: 標簽:軟件開發開發者目標極限傳統
一個高效的軟件 開發 過程對軟件開發人員來說是至關重要的,決定著開發是痛苦的掙扎,還是不斷進步的喜悅。國人對軟件藍領的不屑,對繁瑣冗長的傳統開發過程的不耐,使大多數開發人員無所適從,而測試驅動開發(Test-Driven Development)就是為了改善傳統的以

  一個高效的軟件開發過程對軟件開發人員來說是至關重要的,決定著開發是痛苦的掙扎,還是不斷進步的喜悅。國人對軟件藍領的不屑,對繁瑣冗長的傳統開發過程的不耐,使大多數開發人員無所適從,而測試驅動開發(Test-Driven Development)就是為了改善傳統的以實現為目標的軟件開發流程,利用測試來驅動軟件程序的設計和實現,從測試的角度提出的一種全新的開發方式。測試驅動開發可以有效的避免過度設計帶來的浪費,同時也可以讓開發者在開發中擁有更全面的視角,避免過度實現帶來的浪費。因此,測試驅動開發成為極限編程中比較流行的一種開發方式,受到很多開發者的青睞。

  測試驅動開發的整個過程跟傳統的軟件開發過程有很大的區別,它的基本過程如下:

  1) 明確當前要完成的功能??梢杂涗洺梢粋€ TODO 列表。

  2) 快速完成針對此功能的測試用例編寫。

  3) 測試代碼編譯不通過。

  4) 編寫對應的功能代碼。

  5) 測試通過。

  6) 對代碼進行重構,并保證測試通過。

  7) 循環完成所有功能的開發。

  為了保證這一過程能夠快捷方便地進行,通常我們會采用很多開發工具來支持這一過程。在應用最為廣泛的開發工具Visual Studio中,因為有.NET Framework的支持,我們可以很輕松方便地進行C#和Visual Basic語言的測試,所以使用這兩種語言實踐測試驅動開發也很方便。但是,作為Visual Studio中最重要的開發語言的C++,在以往的Visual Studio的版本中也沒法方便地進行測試。如果要實踐面向C++語言的測試驅動開發,我們不得不借助第三方測試工具,比如CPPUnit來幫助進行測試。在整個過程中,我們要使用CPPUnit進行測試,而開發又是在Visual Studio中進行,兩個工具的銜接協作,給測試驅動開發帶來了很多不便。使用測試驅動開發流程的開發人員熱切地盼望有一個面向C++的開發工具可以把測試驅動開發過程中最重要的兩個過程:“測試”和“開發”結合起來,兩者能夠做到無縫銜接,讓測試真正地驅動開發。

  幸運的是,開發人員的這一夢想在Visual Studio 2010中成為了現實。全新的Visual Studio 2010已經不僅僅是一個開發工具,它也集成了大量的測試工具,成為一個完整的開發平臺。在Visual Studio 2010中,我們可以創建面向C++的測試項目來完成測試驅動開發流程中的測試環節,從而讓整個測試驅動開發過程都在Visual Studio中進行,讓測試和開發做到了無縫銜接,而測試也真正地驅動了開發。

  光說不練假把式。為了讓大家更加了解如何在Visual Studio中進行面向C++的測試驅動開發,我們來看一個實際的例子,在例子中體會這一過程是多么簡單方便。例如,我們要編寫一個計算工資的類Salary,它可以根據員工的入職年份和現在的年份計算整個員工應該得到的工資。

  按照測試驅動開發的過程,我們首先設計完成這個Salary類需要實現的功能,為了簡便,我們讓這個類只需要完成兩個簡單的功能:

  1) 能夠給定員工的入職年份,并根據現在的年份給出應得的工資

  2) 能夠對錯誤的輸入年份返回相應的錯誤代碼

  既然是測試驅動開發,當然是“開發未動,測試先行”了。按照下面的步驟,首先創建一個測試項目并編寫測試對設計中的功能進行測試:

  1) 啟動Visual Studio 2010并創建一個新的“Visual Studio空白解決方案”,方案名字叫做SalarySys。接下來的所有測試和開發都會在這個解決方案中進行。

  2) 向剛剛創建的解決方案中添加一個Visual C++測試項目SalaryTest。因為我們的測試需要使用C++/CLI進行編寫以便使用.NET的單元測試框架,所以我們同時要修改測試項目屬性,讓它使用公共語言運行時(/clr)支持。

  3) 向測試項目SalaryTest中添加一個單元測試。默認情況下,Visual Studio會為我們創建一個UnitTest1.cpp文件,在其中我們就可以編寫針對將要實現的工資計算類測試了。

  4) 在UnitTest1.cpp文件中找到“#pragma region Additional test attributes”,在這個區域中,我們編寫一個測試來對Salary的基本功能進行測試。

  // 創建測試類的智能指針

  // 測試功能設計中的“能夠給定員工的入職年份”

  std::unique_ptr pClass(new Salary(2003));

  // 測試功能設計中的“根據現在的年份給出應得的工資”

  // 判斷函數返回結果是否符合預期

  Assert::AreEqual(1900, pClass->GetSalary(2006));

  這里我們首先創建了一個Salary類的實例智能指針,其中構造函數的參數2003表示入職年份,然后調用其GetSalary()函數計算工資,其參數2006表示現在的年份。按照設計的計算規則,其結果應該是1300,這里我們使用Assert::AreEqual函數對測試結果進行判斷,如果這個斷言函數通過,則表示這個Salary類的測試通過。

  除了使用Assert::AreEqual斷言函數對結果進行判斷之外,Visual C++還提供了多種斷言函數,以滿足對不同類型的返回結果進行判斷的需要。更人性化的是,我們還可以在斷言函數中添加對測試結果的說明,這樣我們更容易以測試的結果來驅動開發。例如:

  // 判斷不相等

  Assert::AreNotEqual(0, (DWORD_PTR) pClass, "pClass指針不應該為空指針");

  // 判斷相等

  Assert::AreEqual(0, (DWORD_PTR) pClass, "pClass指針應該為空指針");

  // 判斷比較結果是否為true

  Assert::IsTrue(pClass == nullptr, "pClass指針應該為空指針");

  // 判斷StringValue()返回的字符串是否與期望的結果相等

  Assert::AreEqual("期望的結果", gcnew String(pClass->StringValue());

原文轉自:http://www.anti-gravitydesign.com

国产97人人超碰caoprom_尤物国产在线一区手机播放_精品国产一区二区三_色天使久久综合给合久久97