本主題示範如何使用「 從使用量產生 」功能,此功能支援測試優先開發。
測試優先開發 是軟體設計的一種方法,您必須先根據產品規格撰寫單元測試,然後撰寫讓測試成功所需的原始程式碼。 Visual Studio 支援測試優先開發,透過在測試案例中先參考尚未定義的新類型和成員,自動在原始程式碼中生成這些類型和成員。
Visual Studio 會在不干擾您的工作流程的前提下,產生新的類型和成員。 您可以為類型、方法、屬性、欄位或建構函式建立存根,而不需將目前的位置留在程式代碼中。 當您開啟對話框以指定類型產生的選項時,焦點會在對話框關閉時立即傳回至目前的開啟檔案。
從使用產生 功能可以與 Visual Studio 整合的測試架構搭配使用。 本主題示範Microsoft單元測試架構。
備註
本文中的指示說明 Visual Studio 中可用的互動式開發體驗 (IDE) 最新版本。 您的電腦可能會顯示某些使用者介面元素的不同名稱或位置。 您可能使用不同的 Visual Studio 版本或不同的環境設定。 如需詳細資訊,請參閱 個人化 IDE。
建立 Windows 類別庫項目和測試專案
在 C# 或 Visual Basic 中,建立新的 Windows 類別庫 專案。 依您使用的語言,將它
GFUDemo_VB
命名為 或GFUDemo_CS
。在 [方案總管] 中,以滑鼠右鍵按兩下頂端的方案圖示,選擇 [新增>專案]。
建立新的 單元測試專案 (.NET Framework) 專案。
新增類別庫項目的參考
在 方案總管的單元測試專案下,以滑鼠右鍵按兩下 [ 參考 ] 項目,然後選擇 [ 新增參考]。
在 [ 參考管理員] 對話框中,選取 [ 專案 ],然後選取類別庫專案。
選擇 [確定 ] 以關閉 [參考管理員] 對話框。
儲存您的解決方案。 您現在已準備好開始撰寫測試。
從單元測試產生新類別
測試專案包含名為 UnitTest1 的檔案。 在方案總管中雙擊這個檔案以在程式碼編輯器中開啟它。 已產生測試類別和測試方法。
找出 類別
UnitTest1
的宣告,並將重新命名為AutomobileTest
。備註
IntelliSense 現在提供兩個 IntelliSense 語句完成的替代模式:完成模式 和 建議模式。 針對在定義類別和成員之前使用類別和成員的情況,請使用建議模式。 當 IntelliSense 視窗開啟時,您可以按 Ctrl+Alt+空格 鍵在完成模式與建議模式之間切換。 如需詳細資訊,請參閱 使用 IntelliSense 。 當您在下一個步驟中輸入
Automobile
時,建議模式將提供幫助。找出
TestMethod1()
方法並將它重新命名為DefaultAutomobileIsInitializedCorrectly()
。 在此方法中,建立名為Automobile
之類別的新實例,如下列螢幕快照所示。 波浪底線會出現,表示編譯時錯誤,然後 快速動作 提示燈泡會出現在左邊界,或者如果您將滑鼠停留在波浪底線上方,則會直接出現在底線下方。選擇或點擊 快速動作 燈泡。 您會看到錯誤訊息,指出類型
Automobile
未定義。 您也會看到一些解決方案。按兩下 [產生新類型 ] 以開啟 [ 產生類型 ] 對話框。 此對話框提供選項,包括在不同的項目中產生類型。
在 [專案 ] 清單中,按兩下 [GFUDemo_VB ] 或 [GFUDemo_CS ],指示Visual Studio將檔案新增至類別庫專案,而不是測試專案。 如果尚未選取,請選擇 [ 建立新檔案 ],並將它命名 為Automobile.cs 或 Automobile.vb。
按兩下 [確定 ] 關閉對話框並建立新的檔案。
在 [方案總管] 中,查看 GFUDemo_VB 或 GFUDemo_CS 項目節點底下,以確認新的 Automobile.vb 或 Automobile.cs 檔案存在。 在程式代碼編輯器中,焦點仍在
AutomobileTest.DefaultAutomobileIsInitializedCorrectly
,這可讓您繼續撰寫測試,僅有最少的中斷。
產生屬性存根
假設產品規格指出 Automobile
類別有兩個公用屬性,分別名為Model
和TopSpeed
。 這些屬性必須由預設建構函式初始化為"Not specified"
和-1
的預設值。 下列單元測試會確認預設建構函式會將屬性設定為其正確的預設值。
將下列程式代碼行新增至
DefaultAutomobileIsInitializedCorrectly
測試方法。因為程式碼參考了
Automobile
上的兩個未定義屬性,因此波浪底線會出現在Model
和TopSpeed
底下。 將滑鼠停留在Model
,選擇快速動作錯誤提示燈泡,然後選擇產生屬性 'Automobile.Model'。以相同方式產生
TopSpeed
屬性的屬性存根。在
Automobile
類別中,新屬性的類型會從內容正確推斷。
生成新建構函式的存根
現在我們將建立測試方法,以產生建構函式存根來初始化 Model
和 TopSpeed
屬性。 稍後,您將新增更多程式代碼來完成測試。
將下列其他測試方法新增至類別
AutomobileTest
。按一下紅色波浪線下的 快速動作燈泡,然後按一下 在 'Automobile' 中產生建構函式。
在
Automobile
類別檔案中,請注意,新的建構函式已檢查建構函式呼叫中使用的局部變數名稱,尋找在Automobile
類別中具有相同名稱的屬性,並在建構函式主體中提供程式碼,以將引數值儲存在Model
和TopSpeed
屬性中。產生新的建構函式之後,波浪底線會出現在
DefaultAutomobileIsInitializedCorrectly
預設建構函式呼叫之下。 錯誤訊息指出類別Automobile
沒有接受零自變數的建構函式。 若要產生沒有參數的明確預設建構函式,請按兩下 [快速動作 ] 錯誤燈泡,然後按兩下 [汽車] 中的 [產生建構函式]。
產生方法的存根
假設規格中指出,如果新的Automobile
的Model
屬性和TopSpeed
屬性被設定為非預設值,則可以進入IsRunning
狀態。
將下列幾行新增至
AutomobileWithModelNameCanStart
方法。點擊快速動作錯誤燈泡,然後點擊產生方法 'Automobile.Start'。
單擊快速動作燈泡圖示以使用
IsRunning
屬性,然後單擊生成屬性 'Automobile.IsRunning'。類別
Automobile
現在包含名為Start()
的方法,以及名為IsRunning
的屬性。
執行測試
在 [ 測試] 功能表上,選擇 [ 執行>所有測試]。
[ 執行>所有測試] 命令會在針對目前解決方案撰寫的任何測試架構中執行所有測試。 在此情況下,有兩個測試,而且兩者都如預期般失敗。
DefaultAutomobileIsInitializedCorrectly
測試失敗是因為Assert.IsTrue
條件返回False
。 測試AutomobileWithModelNameCanStart
失敗,因為Start
類別中的Automobile
方法會擲回例外狀況。下圖顯示 [測試結果] 視窗。
在 [ 測試結果] 視窗中,按兩下每個測試結果數據列,以移至每個測試的位置。
實作原始程式碼
將下列程式代碼新增至預設建構函式,以初始化
Model
、TopSpeed
和IsRunning
屬性為其正確的預設值"Not specified"
、-1
和False
(或對於 C# 為false
)。當呼叫
Start
方法時,只有在Model
或TopSpeed
屬性被設置為非預設值時,才會將IsRunning
旗標設定為 true。NotImplementedException
從方法主體中移除 ,並新增下列程序代碼。
再次執行測試
在 [ 測試] 功能表上,指向 [ 執行],然後按兩下[ 所有測試]。
這次測試通過。 下圖顯示 [測試結果] 視窗。