alfra 发表于 2004-9-28 11:49:45

单元测试及先行测试开发(转台湾msdn)

作者:Eric Gunnerson
Microsoft Corporation

2003 年 3 月 1 日

摘要:Eric Gunnerson 解釋了先行測試開發的概念,並提供操作範例來說明如何將這個準則實際運用到應用程式中。(列印共 9 頁)

請由 MSDN Online Code Center 下載 integerlist.exe 範例檔 (英文)。

如果您是屬於會看完我專欄結尾的自傳的少數民族,那麼就該知道我在當上程式設計部經理前,是 C# 程式編譯的首席測試工程人員,而在這之前則負責 C++ 程式編譯。這就是為什麼我非常熱衷於分析程式碼和找出可能錯誤的原因。

降低軟體錯誤率的方法之一是,擁有全力投注於軟體檢測工作的專業測試團隊。但糟糕的是,如果有測試團隊,就會存在一種不肯花更多時間檢查程式碼穩定性的傾向,這連經驗豐富的程式開發人員也是一樣。

軟體界常流傳一句話:「程式開發人員不該測試自己寫的程式碼。」 其中道理在於,因為程式開發人員對自己的程式碼非常瞭解,所以他們對於要如何正確地進行測試常常有偏見。這個說法雖然蠻合理的,但卻忽略了一項重點-如果程式開發人員不自己測試程式碼,那怎麼能確定程式碼會如預期執行呢?

答案很簡單:他們根本不確定。而程式開發人員寫出不能執行或只有部份能用的程式碼是個很嚴重的問題。他們通常只針對少數情況,而不是各種情況來驗證自己的程式碼能否順利執行。

發現錯誤
發現錯誤的情況如下:

程式開發人員剛寫好程式碼時。
程式開發人員想辦法讓程式碼順利執行時。
由團隊其他程式開發或測試人員發現。
進行規模較大的產品測試時。
由使用者發現。
如果在第 1 個情況下就發現錯誤,要修正很容易,成本也很低。越到後面才發現,所付出的成本就越高,而且要修正使用者發現的錯誤,可能得花上 100 或 1000 倍的成本。更別提使用者通常還必須等到下個版本出來時問題才能解決。

最理想的狀況是,程式開發人員在寫程式碼時就找出所有的錯誤。要找出錯誤,必須準備好在寫程式碼時可以執行的測試。現在就為您介紹撰寫測試的妙方。

先行測試開發
先行測試開發就是在寫程式碼「之前」先行測試。所有測試都沒問題的話,就表示程式碼可以順利執行,並且還能繼續確認後來加入的新功能是否穩定。

這個概念是 Kent Beck 在 1990 年代為 Smalltalk 寫 Smalltalk Unit 時首創。過去多年來,單元測試公用程式都已經可以在大多數環境中執行,其中一個很好用的 .NET Framework 公用程式叫 nUnit (英文)。

範例
我稍候會寫一個 IntegerList 類別,來說明先行測試開發的用法。這是原本儲存整數的 ArrayList 變型,因此沒有 Boxing 和 Unboxing 的負荷。

第一個步驟是建立主控台專案,並加入 IntegerList.cs 原始程式檔。要連結 nUnit 架構,我需要加入 nUnit 架構的參考。在我的電腦上,該參考位於 d:\program files\nUnit v2.0\bin。

第二步是花點時間構想如何測試這個類別。這有點類似決定類別的功能,但重點則放在特定用法 (在清單中加上值 1,再檢查是否成功),而不是功能 (將項目加入清單)。若要建置類別,請先準備好一份要用的測試清單:

測試能否建構。
在清單中加入 2 個整數,並確定計算結果和項目都正確。
用更多項目重做一次。
將清單轉換成字串。
使用 foreach 來列舉清單。
這個範例有點反常,因為一開始我就很清楚要類別執行什麼工作。但大部份的類別都是逐步建置,而測試也應該隨類別一起增加。

更多参看原文
页: [1]
查看完整版本: 单元测试及先行测试开发(转台湾msdn)