共用方式為


操作指南:使用從使用中產生的功能進行測試驅動開發

本主題示範如何使用「 從使用量產生 」功能,此功能支援測試優先開發。

測試優先開發 是軟體設計的一種方法,您必須先根據產品規格撰寫單元測試,然後撰寫讓測試成功所需的原始程式碼。 Visual Studio 支援測試優先開發,透過在測試案例中先參考尚未定義的新類型和成員,自動在原始程式碼中生成這些類型和成員。

Visual Studio 會在不干擾您的工作流程的前提下,產生新的類型和成員。 您可以為類型、方法、屬性、欄位或建構函式建立存根,而不需將目前的位置留在程式代碼中。 當您開啟對話框以指定類型產生的選項時,焦點會在對話框關閉時立即傳回至目前的開啟檔案。

從使用產生 功能可以與 Visual Studio 整合的測試架構搭配使用。 本主題示範Microsoft單元測試架構。

備註

本文中的指示說明 Visual Studio 中可用的互動式開發體驗 (IDE) 最新版本。 您的電腦可能會顯示某些使用者介面元素的不同名稱或位置。 您可能使用不同的 Visual Studio 版本或不同的環境設定。 如需詳細資訊,請參閱 個人化 IDE

建立 Windows 類別庫項目和測試專案

  1. 在 C# 或 Visual Basic 中,建立新的 Windows 類別庫 專案。 依您使用的語言,將它 GFUDemo_VB 命名為 或 GFUDemo_CS

  2. [方案總管] 中,以滑鼠右鍵按兩下頂端的方案圖示,選擇 [新增>專案]。

  3. 建立新的 單元測試專案 (.NET Framework) 專案。

新增類別庫項目的參考

  1. 方案總管的單元測試專案下,以滑鼠右鍵按兩下 [ 參考 ] 項目,然後選擇 [ 新增參考]。

  2. 在 [ 參考管理員] 對話框中,選取 [ 專案 ],然後選取類別庫專案。

  3. 選擇 [確定 ] 以關閉 [參考管理員] 對話框。

  4. 儲存您的解決方案。 您現在已準備好開始撰寫測試。

從單元測試產生新類別

  1. 測試專案包含名為 UnitTest1 的檔案。 在方案總管中雙擊這個檔案以在程式碼編輯器中開啟它。 已產生測試類別和測試方法。

  2. 找出 類別 UnitTest1 的宣告,並將重新命名為 AutomobileTest

    備註

    IntelliSense 現在提供兩個 IntelliSense 語句完成的替代模式:完成模式建議模式。 針對在定義類別和成員之前使用類別和成員的情況,請使用建議模式。 當 IntelliSense 視窗開啟時,您可以按 Ctrl+Alt+空格 鍵在完成模式與建議模式之間切換。 如需詳細資訊,請參閱 使用 IntelliSense 。 當您在下一個步驟中輸入 Automobile 時,建議模式將提供幫助。

  3. 找出 TestMethod1() 方法並將它重新命名為 DefaultAutomobileIsInitializedCorrectly()。 在此方法中,建立名為 Automobile之類別的新實例,如下列螢幕快照所示。 波浪底線會出現,表示編譯時錯誤,然後 快速動作 提示燈泡會出現在左邊界,或者如果您將滑鼠停留在波浪底線上方,則會直接出現在底線下方。

    Visual Basic 中的快速動作

    C 中的快速動作#

  4. 選擇或點擊 快速動作 燈泡。 您會看到錯誤訊息,指出類型 Automobile 未定義。 您也會看到一些解決方案。

  5. 按兩下 [產生新類型 ] 以開啟 [ 產生類型 ] 對話框。 此對話框提供選項,包括在不同的項目中產生類型。

  6. [專案 ] 清單中,按兩下 [GFUDemo_VB ] 或 [GFUDemo_CS ],指示Visual Studio將檔案新增至類別庫專案,而不是測試專案。 如果尚未選取,請選擇 [ 建立新檔案 ],並將它命名 為Automobile.csAutomobile.vb

    [產生新類型] 對話框

  7. 按兩下 [確定 ] 關閉對話框並建立新的檔案。

  8. [方案總管] 中,查看 GFUDemo_VBGFUDemo_CS 項目節點底下,以確認新的 Automobile.vbAutomobile.cs 檔案存在。 在程式代碼編輯器中,焦點仍在AutomobileTest.DefaultAutomobileIsInitializedCorrectly,這可讓您繼續撰寫測試,僅有最少的中斷。

產生屬性存根

假設產品規格指出 Automobile 類別有兩個公用屬性,分別名為ModelTopSpeed。 這些屬性必須由預設建構函式初始化為"Not specified"-1的預設值。 下列單元測試會確認預設建構函式會將屬性設定為其正確的預設值。

  1. 將下列程式代碼行新增至 DefaultAutomobileIsInitializedCorrectly 測試方法。

    Assert.IsTrue((myAuto.Model == "Not specified") && (myAuto.TopSpeed == -1));
    
  2. 因為程式碼參考了Automobile上的兩個未定義屬性,因此波浪底線會出現在ModelTopSpeed底下。 將滑鼠停留在Model,選擇快速動作錯誤提示燈泡,然後選擇產生屬性 'Automobile.Model'

  3. 以相同方式產生 TopSpeed 屬性的屬性存根。

    Automobile 類別中,新屬性的類型會從內容正確推斷。

生成新建構函式的存根

現在我們將建立測試方法,以產生建構函式存根來初始化 ModelTopSpeed 屬性。 稍後,您將新增更多程式代碼來完成測試。

  1. 將下列其他測試方法新增至類別 AutomobileTest

    [TestMethod]
    public void AutomobileWithModelNameCanStart()
    {
        string model = "Contoso";
        int topSpeed = 199;
        Automobile myAuto = new Automobile(model, topSpeed);
    }
    
  2. 按一下紅色波浪線下的 快速動作燈泡,然後按一下 在 'Automobile' 中產生建構函式

    Automobile類別檔案中,請注意,新的建構函式已檢查建構函式呼叫中使用的局部變數名稱,尋找在Automobile類別中具有相同名稱的屬性,並在建構函式主體中提供程式碼,以將引數值儲存在ModelTopSpeed 屬性中。

  3. 產生新的建構函式之後,波浪底線會出現在DefaultAutomobileIsInitializedCorrectly預設建構函式呼叫之下。 錯誤訊息指出類別 Automobile 沒有接受零自變數的建構函式。 若要產生沒有參數的明確預設建構函式,請按兩下 [快速動作 ] 錯誤燈泡,然後按兩下 [汽車] 中的 [產生建構函式]。

產生方法的存根

假設規格中指出,如果新的AutomobileModel屬性和TopSpeed屬性被設定為非預設值,則可以進入IsRunning狀態。

  1. 將下列幾行新增至 AutomobileWithModelNameCanStart 方法。

    myAuto.Start();
    Assert.IsTrue(myAuto.IsRunning == true);
    
  2. 點擊快速動作錯誤燈泡,然後點擊產生方法 'Automobile.Start'

  3. 單擊快速動作燈泡圖示以使用IsRunning屬性,然後單擊生成屬性 'Automobile.IsRunning'

    類別 Automobile 現在包含名為 Start() 的方法,以及名為 IsRunning的屬性。

執行測試

  1. 在 [ 測試] 功能表上,選擇 [ 執行>所有測試]。

    [ 執行>所有測試] 命令會在針對目前解決方案撰寫的任何測試架構中執行所有測試。 在此情況下,有兩個測試,而且兩者都如預期般失敗。 DefaultAutomobileIsInitializedCorrectly 測試失敗是因為 Assert.IsTrue 條件返回 False。 測試 AutomobileWithModelNameCanStart 失敗,因為 Start 類別中的 Automobile 方法會擲回例外狀況。

    下圖顯示 [測試結果] 視窗。

    失敗的測試結果

  2. 在 [ 測試結果] 視窗中,按兩下每個測試結果數據列,以移至每個測試的位置。

實作原始程式碼

  1. 將下列程式代碼新增至預設建構函式,以初始化ModelTopSpeedIsRunning屬性為其正確的預設值"Not specified"-1False(或對於 C# 為false)。

    public Automobile()
    {
        this.Model = "Not specified";
        this.TopSpeed = -1;
        this.IsRunning = true;
    }
    
  2. 當呼叫 Start 方法時,只有在 ModelTopSpeed 屬性被設置為非預設值時,才會將 IsRunning 旗標設定為 true。 NotImplementedException從方法主體中移除 ,並新增下列程序代碼。

    public void Start()
    {
        if (this.Model != "Not specified" || this.TopSpeed != -1)
            this.IsRunning = true;
        else
            this.IsRunning = false;
    }
    

再次執行測試

  • 在 [ 測試] 功能表上,指向 [ 執行],然後按兩下[ 所有測試]。

    這次測試通過。 下圖顯示 [測試結果] 視窗。

    通過的測試結果