首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> .NET 網頁程式設計 >> 關於.NET

Visual Studio 2010 實作測試驅動開發(TDD)完整實驗指南

     編輯:關於.NET

概述

測試驅動開發(Test Driven Development,TDD)是一種先編寫單元測試,再編寫實際代碼以通過測試的開發方法。單元測試可視為系統行為的微型規格,先行撰寫測試能引導開發者僅編寫足夠通過測試的代碼,確保系統精簡、輕量且專注於既定需求。

TDD 的核心節奏是「紅燈、綠燈、重構」:紅燈代表測試失敗(尚未實作代碼),綠燈代表編寫最少量代碼使測試通過,重構則在測試保護下優化代碼結構。此循環在開發過程中不斷重複。

注意:本實驗旨在展示 Visual Studio 2010 對 TDD 的工具支援,而非教授 TDD 方法論。若想深入了解 TDD,建議參閱《Test Driven Development in Microsoft .NET》(James Newkirk、Alexei Voronstov 著)及《Pragmatic Unit Testing in C# with NUnit》(Andy Hunt 等著)。

高效的 TDD 節奏仰賴正確的思維與工具。Visual Studio 2010 引入多項增強功能,協助開發者減少按鍵次數、加速方案導航,並支援替換測試框架。接下來將以「測試優先」方式實作一個堆疊類別,示範如何利用測試驅動設計與實作。

建立專案
圖 1:建立專案

目標

  • 善用智能標記自動生成代碼片段,減少按鍵操作。
  • 使用 Quick Search 快速導航代碼庫。

系統需求

  • Microsoft Visual Studio 2010 Beta 2
  • .NET Framework 4.0

安裝與配置

以系統管理員權限執行 CheckDependencies.cmd 啟動 Configuration Wizard,安裝缺失的先決條件並完成精靈。該腳本同時會安裝本實驗所需的 Visual Studio 代碼片段。

練習架構

  1. 練習 1:紅燈、綠燈…… — 撰寫測試並使其從失敗轉為通過,體驗智能標記、測試執行器增強與導航特性。
  2. 練習 2:重構! — 在測試通過的基礎上重構代碼,賦予其實際功能並確保所有測試持續通過。

預估完成時間:60 分鐘。本實驗同時提供 C# 與 VB.NET 範例,截圖以 C# 為主,VB.NET 操作類似。

練習 1:紅燈、綠燈……

任務 1:建立新專案

  1. 啟動 Visual Studio 2010,在起始頁點選「新增專案」。
  2. 選擇 Visual C# 或 VB 專案類型,目標框架設為 .NET Framework 4.0,選取「類別庫」範本,專案命名為 SimpleDataStructures,勾選「建立解決方案目錄」。
  3. 刪除預設產生的 Class1.cs(或 Class1.vb)。
  4. 刪除預設檔案
    圖 2:刪除預設檔案
  5. 在方案總管中右鍵點擊解決方案,選擇「加入」→「新增專案」,選取「測試專案」,命名為 SimpleDataStructures.Tests。
  6. 刪除測試專案中預設產生的 UnitTest1.cs。
  7. 刪除預設測試檔案
    圖 3:刪除預設測試檔案

任務 2:為測試定義上下文

  1. 在測試專案中加入新類別 SimpleStackTests。
  2. 新增 SimpleStackTests.cs
    圖 4:新增 SimpleStackTests.cs
  3. 將類別標記為 public 並加上 [TestClass] 屬性。Visual Studio 會提示缺少 using Microsoft.VisualStudio.TestTools.UnitTesting;,按 Ctrl+. 使用智能標記自動添加。
  4. 智能標記添加 using
    圖 5:使用智能標記添加缺失的 using 陳述式
  5. 將測試類別重命名為更具描述性的 WhenAStackIsCreated,以清晰表達測試上下文(堆疊建立時的預設狀態)。

任務 3:撰寫第一個測試 — 設計與定義 SimpleStack

  1. 新增測試方法 ThenItShouldBeEmpty,驗證新建堆疊的 IsEmpty 屬性為 true。
  2. 在測試中實例化 SimpleStack,此時類別尚不存在。按 Ctrl+. 選擇「Generate class for 'SimpleStack'」,VS 會在測試專案中產生存根類別。
  3. 未定義類別的智能標記
    圖 6:未定義類別的智能標記選項
    SimpleStack 存根
    圖 7:SimpleStack 類別的測試存根

    提示:智能標記的「Generate other...」選項可自訂生成位置。TDD 實踐者傾向於最後才決定代碼所屬組件,以延後設計決策並掌控依賴關係。本實驗中我們稍後會將 SimpleStack 移至主專案。

  4. 回到測試,添加斷言 Assert.IsTrue(theStack.IsEmpty);。再次觸發智能標記為 IsEmpty 生成屬性存根。
  5. 生成屬性存根
    圖 9:生成屬性存根的智能標記
  6. 修改 SimpleStack 中的 IsEmpty 為唯讀屬性並直接回傳 true(最簡實作)。
  7. 使用 Quick Search(Ctrl+,)快速跳回測試方法,重新執行測試 — 應顯示綠燈通過。
  8. Quick Search 導航
    圖 11:使用 Quick Search 直接導航到特定方法
    測試通過
    圖 12:測試通過!

任務 4:添加更多測試驅動功能

  1. 新增測試 ThenShouldBeAbleToPushAnItemOntoTheStack,呼叫尚不存在的 Push 方法。
  2. 透過智能標記生成 Push 方法存根,執行測試確認失敗(紅燈)。
  3. 生成方法存根
    圖 13:使用智能標記生成方法存根
  4. 將 Push 方法本體清空(移除 NotImplementedException),測試即轉綠。雖然此時 Push 無實際作用,但符合「最簡實作」原則。
  5. 使用 Quick Search(輸入大寫字母 TSBA)快速定位測試方法。
  6. Quick Search 大寫過濾
    圖 14:使用 Quick Search 進行篩選與導航

練習 2:重構!

任務 1:從通過測試轉向構建功能

  1. 開啟方案檔 SimpleDataStructures.sln(位於 %TrainingKitInstallFolder%\Labs\TestDrivenDevelopment\Source\Ex02-Refactor\begin\)。
  2. 修改測試 ThenShouldBeAbleToPushAnItemOntoTheStack,加入斷言 Assert.IsFalse(theStack.IsEmpty); 驗證推入元素後堆疊不為空。執行測試 — 失敗,因 IsEmpty 仍固定回傳 true。
  3. 重構 SimpleStack:引入 ArrayList _items 儲存狀態,IsEmpty 檢查 _items.Count == 0,Push 將元素加入列表。別忘記初始化 _items(建構函式中 new ArrayList()),並透過智能標記匯入 System.Collections。
  4. 未初始化欄位提示
    圖 15:綠色波浪線提示未初始化的欄位
  5. 測試通過。但目前 Push 存入的是常數 0,需進一步完善。
  6. 最簡實作
    圖 16:最簡實作通過測試
  7. 新增測試 ThenShouldBeAbleToPushAndPopAnItemFromTheStack,驗證推入後彈出的元素正確。智能標記生成 Pop 方法存根(VS 自動推斷回傳型別為 int)。
  8. 生成 Pop 存根
    圖 17:智能標記生成方法存根並推斷正確回傳型別
  9. 實作 Pop 從列表取出並移除首個元素,修正 Push 存入實際參數值。三個測試全數通過。

任務 2:重組代碼結構

  1. 在方案總管中將 SimpleStack.cs 從測試專案剪下,貼上至主專案 SimpleDataStructures。
  2. 移動後結構
    圖 18:移動 SimpleStack.cs 後的解決方案結構
  3. 修改命名空間為 SimpleDataStructures,將類別與 Push、Pop 方法改為 public。
  4. 在測試專案中加入對主專案的參考。
  5. 加入參考
    圖 19:加入對 SimpleDataStructures 專案的參考
  6. 重新執行所有測試 — 全部通過。

總結

本實驗展示了 Visual Studio 2010 針對 TDD 工作流的多項 IDE 增強:智能標記自動生成存根、Quick Search 极速導航、測試執行器整合等。這些工具讓開發者能專注於「紅-綠-重構」節奏,以最簡代碼滿足測試,進而構建緊湊、高品質的軟體。若您初接觸 TDD,期望此實驗能為您打開一扇通往敏捷開發實踐的大門。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved