使用FLASH BUILDER 4和FLEXUNIT進行測試驅動開發
https://www.adobe.com/devnet/flex/articles/flashbuilder4_tdd.html
要求
必備知識
所需產品 示例檔案
建議您構建Flex應用程式的經驗。
Flash Builder (下載試用版) flashbuilder_tdd_source.zip (6317 KB)
使用者級別
所有
在本文中,我將介紹使用Flash Builder 4和FlexUnit開始測試驅動開發(TDD)的一些基礎知識。
隨著Flash應用程式變得更加動態和複雜,它們變得更難以維護和擴充套件,尤其是在整個開發過程中業務需求發生變化時。這些挑戰非常重要,它們在所有型別的開發中都很常見,包括移動,Web和桌面應用程式。
考慮一種場景,您需要對大型應用程式進行更改以滿足新的業務需求。您如何知道您所做的小改動是否打破了應用程式的其他部分?如何確保程式碼是防彈的,特別是如果您不是編寫程式碼的人?
對於軟體工程師來說,這個問題既不是新問題,也不侷限於特定平臺。Java和ASP開發人員面臨著同樣的問題,並且發現測試驅動開發(TDD)是一種用於建立易於維護的應用程式的有用技術。
Flash已經從一個小型動畫工具中走了很長一段路。Adobe Flash Platform現在包含符合ECMAScript的程式語言以及構建大型動態應用程式所必需的其他程式語言的通用方法。事實上,Adobe和許多其他公司已經發現TDD解決了開發人員每天在開發週期中面臨的許多挑戰。
我注意到雖然許多開發人員都聽說過TDD,但他們不願意使用TDD,因為他們不熟悉TDD,並擔心使用TDD會增加開發時間。
根據我的個人經驗,我發現正確使用TDD不會增加開發時間,因為它適用於適合的專案。實際上,TDD可以縮短開發時間並簡化應用程式維護。我還發現我可以在現有應用程式上使用FlexUnit,並以某種方式將TDD方法應用於任何框架。
值得注意的是,即使有單獨的質量保證(QA)部門執行正式測試,TDD也適用。TDD幫助開發人員提供更加可靠的程式碼,使QA能夠專注於其他任務,包括測試使用者介面和建立他們需要測試的用例。
測試驅動開發概述
那麼什麼是TDD呢?測試驅動開發是一種軟體開發技術,程式設計師編寫失敗的測試,在編寫實際程式碼之前定義功能。
在極限程式設計團隊中,團隊負責開發具有不斷變化的需求的動態專案,以及包含TDD的開發週期,用於在程式碼本身之前編寫測試。請注意,TDD不是完整的開發週期; 它只是極限程式設計(XP)開發範例的一部分。在編寫程式碼之前準備測試有助於開發團隊以小步驟展示他們的工作,而不是讓客戶或其他利益相關者等待完整的結果。
以小增量移動還可以更輕鬆地滿足不斷變化的需求,並有助於確保您的程式碼能夠完成所需的操作,僅此而已。值得一提的是,TDD技術的重點是生成程式碼而不是建立測試平臺。測試能力是一個額外的好處。
TDD基於這樣的想法,即您構建的任何內容都應該進行測試,如果您無法測試它,您應該三思而後行,是否真的要構建它。
使用FlexUnit 4應用TDD技術
檔案
圖1.測試驅動開發週期
TDD過程包括六個簡單步驟(參見圖1):
新增測試 -第一步是瞭解業務需求,考慮所有可能的方案,並根據這些方案新增測試。如果要求不夠清楚,您可以立即提出問題,而不是在軟體完成時提出問題,並且需要更多的努力來進行更改。
寫入失敗的單元測試 -此階段確保測試單元本身正常工作。它不會通過,因為您還沒有編寫任何程式碼。
編寫程式碼 -在此階段,您將以最簡單,最有效的方式編寫程式碼,以確保測試通過。無需包含任何設計模式,考慮應用程式的其餘部分或清理程式碼。您的目標只是通過測試。
測試通過 -一旦您編寫了所有程式碼和測試通過,您就會知道您的測試符合所有業務要求,您可以與客戶或團隊的其他成員共享工作。
重構 -現在測試已經完成,並且您確認它符合業務要求,您可以通過替換任何臨時引數,新增設計模式,刪除重複程式碼以及建立類來高效地完成工作來確保程式碼已準備好進行生產。 。理想情況下,一旦重構階段完成,程式碼將經過程式碼審查,這對於確保程式碼處於良好狀態並符合公司的編碼標準至關重要。在重構和程式碼審查之後,應該再次執行測試以確保過程中沒有任何內容被破壞。
重複 -單元測試完成後,您可以轉到下一個單元測試並與客戶或團隊的其他成員共享程式碼。
使用FlexUnit測試Flex和ActionScript專案
FlexUnit是Flex和ActionScript 3.0應用程式和庫的單元測試框架。它提供類似於JUnit的功能,JUnit是一個Java單元測試框架。FlexUnit用於許多內部Adobe專案,並且是開源的。
Flash Builder 4提供了整合的FlexUnit支援,允許您自動建立測試單元的腳手架,節省您的時間,無需一遍又一遍地建立相同的類,並確保使用最佳實踐。
FlexUnit有兩個版本:FlexUnit 0.9(也稱為FlexUnit 1)和FlexUnit 4(也稱為FlexUnit 4)。本文介紹FlexUnit 4。
要在以前版本的Flex Builder中使用FlexUnit,您必須下載FlexUnit SWC檔案並將其包含在專案中。建立測試後,Flash Builder 4會自動包含五個SWC。以下SWC將新增到專案的Referenced Libraries下:
flexunit_0.9.swc
hamcrest-1.0.2.swc
的FlexUnit核-FLEX-4.0.0.2-sdk3.5.0.12783.swc
flexunitextended.swc
FlexUnitTestRunner_rb.swc
這些SWC包括FlexUnit 0.9,FlexUnit 4,測試執行器和其他庫的所有API。SWC作為Flex 4 SDK的一部分進行維護,因此無需下載FlexUnit或手動新增它們。新增測試後,它們將自動新增。
在Flash Builder 4中建立測試套件和測試用例
在本節中,您將使用Flex Builder 4和FlexUnit 4來建立測試套件和測試用例。
建立一個測試套件類
為了說明如何在Flash Builder中使用FlexUnit,我將使用一個計算數字的簡單應用程式。請按照以下步驟建立應用程式並新增測試套件:
選擇“檔案”>“新建”>“Flex專案”以建立專案。
對於“專案名稱”,鍵入CalculatorApplication。
單擊完成。
要建立測試套件,請選擇File> New> Test Suite Class(參見圖2)。
檔案
圖2.在Flash Builder 4中建立新的Test Suite類
在“新建測試套件類”對話方塊中,將類命名為CalculatorTestSuite。
選擇New FlexUnit 4 Test(參見圖3)。
單擊完成。
檔案
圖3.建立名為CalculatorTestSuite的新Test Suite類
測試套件是測試的組合。它執行一組測試用例。在開發期間,您可以建立一個打包到測試套件中的測試集合,一旦完成,您可以執行測試套件以確保您的程式碼在更改後仍能正常工作。
Flash Builder 4在flexUnitTests資料夾下添加了以下類:
package flexUnitTests
{
[Suite]
[RunWith(“org.flexunit.runners.Suite”)]
public class CalculatorTestSuite
{
}
}
該Suite元資料標籤指示類是一套。該RunWith標籤指示的測試執行器來執行它後面使用一個特定的類中的測試。FlexUnit 4是一組跑步者,可以執行一整套測試。您可以定義每個執行器以實現特定介面。例如,您可以指定一個不同的類來執行測試,而不是FlexUnit 4中內建的預設執行器。
新增測試用例類
建立Test Case類:
選擇檔案>新建>測試用例類。
選擇New FlexUnit 4 Test。
鍵入flexUnitTests作為包。
鍵入CalculatorLogicTester作為名稱。
點選下一步。
檔案
圖4.建立一個新的Test Case類
注意:在FlexUnit 1中,您可以選擇生成setUp()和tearDown()存根。當測試用例開始(setUp)和結束(tearDown)時,會自動呼叫這些存根。它們可用於在測試開始之前設定資訊和事件,並清除資訊和事件以確保您沒有任何記憶體洩漏。在FlexUnit 4中,您可以定義使用元資料標籤,這些方法[Before]和[After],因為您將在本文後面看到。
寫一個失敗的單元測試
您已準備好開始編寫測試程式碼。在FlexUnit 1中,您建立的每個方法都必須以“test”開頭,以使測試執行器能夠識別該方法。結果,方法名稱更改為testAdditionMethod。在FlexUnit 4中,方法名稱不需要以“test”開頭; 相反,它們被[test]元資料識別,因此可以隨意重構方法名稱。這是生成的程式碼:
package flexUnitTests
{
public class CalculatorLogicTester
{
[Before]
public function setUp():void
{
}
[After]
public function tearDown():void
{
}
[BeforeClass]
public static function setUpBeforeClass():void
{
}
[AfterClass]
public static function tearDownAfterClass():void
{
}
}
}
我們現在可以編寫第一種方法了。我們正在建立一個計算器,因此我們需要建立計算器幫助實用程式將用於執行所有計算的方法,我們將從add方法開始。從[Test]元資料開始建立測試方法,而不是放置程式碼。我建立的程式碼在我實現該方法之前不會通過測試,見下文:
[Test]
public function testAdditionMethod():void
{
Assert.fail(“Test method not yet implemented”);
}
最後,請記住將要測試的測試用例新增到CalculatorTestSuite測試套件中。將以下粗體新增到CalculatorTestSuite.as:
package flexUnitTests
{
[Suite]
[RunWith(“org.flexunit.runners.Suite”)]
public class CalculatorTestSuite
{
public var calculatorLogic:CalculatorLogicTester;
}
}
建立專案。要執行應用程式,請按照下列步驟操作:
單擊編譯圖示並選擇FlexUnit Tests(參見圖6)或選擇Run> Run> FlexUnit Tests。
檔案
圖6.執行FlexUnit測試
2.在Run FlexUnit Tests對話方塊中,選擇測試用例(參見圖7)
3.單擊“確定”。
檔案
圖7.選擇所有可用的TestCases和TestSuite
4.應用程式完成後,在瀏覽器中檢視測試狀態結果。(見圖8)。
檔案
圖8.瀏覽器中的FlexUnit測試結果
5.關閉瀏覽器視窗。
6.在FlexUnit Results檢視中檢查測試結果(參見圖9)。
如您所見,測試失敗,因為您有以下程式碼CalculatorLogicTester.as:
Assert.fail(“Test method Not yet implemented”);
檔案
圖9. FlexUnit Results檢視
更新testAdditionMethod存根以生成失敗結果:
var result:Number = CalculatorLogicHelper.additionMethod(5,5);
Assert.assertEquals(result,10);
我們在實際程式碼之前編寫測試。在我們的例子中,我們發現我們有一個靜態方法,它將計算新增兩個數字,而不是我們應該能夠斷言以確保執行加法計算。儲存文件後,您會收到編譯時錯誤。請參見圖11.這是一件好事,因為編譯器會為您提供下一步需要執行的操作的說明,即建立幫助程式類和方法。
檔案
圖10.顯示失敗方法的FlexUnit Results檢視
引擎蓋下發生了什麼?
在應用程式資料夾結構下,您可以找到檔案CalculatorLogicTester.as,CalculatorTestSuite.as和FlexUnitCompilerApplication.mxml(參見圖11)。
檔案
圖11. CalculatorApplication資料夾結構
看一下FlexUnitApplication.mxml: