許多書上都討論了自動測試
但是只有很少的著作注意到這麼一個問題
那就是怎樣把這些測試組織起來
隨著測試的增加
放置和調用這些測試卻變得更加麻煩
這將成為一個重要問題
以至於出現了TDD
極限編程(XP)使TDD得以普及
另外
你可以這樣理解TDD
通過測試來開發
TDD的主要規范 在編寫程序代碼之前
與之對應的自動測試必須被寫好
甚至程序代碼並不存在
那也要看見一個失敗的測試結果
在測試通過後
副本代碼必須被丟棄
有一個具體步驟(可能指的是《Extreme Programming》)可以被任何一個程序員來參考
而不需要特殊的其他方法
在我們開始寫測試之前
這些步驟(章節)應該被首先閱讀——怎樣組織自動測試
講解一下不同種類的測試 單元測試
檢測模塊(也就是類)的正確性
如果對象需要訪問外部的數據資源
例如數據庫
就需要模擬一個mock objects
但在實際中真實數據與測試環境是不同的
客戶測試
這是功能性
系統
和驗收測試
用來測試整體的系統特性
在XP中
這些測試由用戶編寫
綜合測試
介於用戶測試和單元測試之間的橋梁
綜合測試幫助測試應用程序的交互性
一般情況下
mock objects不被用於綜合測試
它會增加測試時間
同樣
綜合測試經常依賴特殊的測試環境
例如數據庫送來的測試數據
綜合測試也需要用到外部類庫
例如為J
EE應用程序進行綜合測試的類庫Cactus
解釋這些測試超出了本文的范圍
需要更加詳細的信息請參考
開發人員測試
這是用來讓開發人員檢驗自己代碼或新函數的
對於每一個開發人員
只要有可能
就需要有更多的測試來檢驗代碼
組織這些測試和組織程序代碼一樣重要
在以下章節
只要提到
測試
那就指的是開發人員測試
我們幾乎准備好開始建立測試了
先應該為我們的測試選擇名字
你也許會說
這不是問題
把
Test
這個字放在類名前面
就好了!
不會這麼快!讓我來說一下這個步驟存在的問題
在TDD中
被測試的類或者方法還不存在
一個測試能夠覆蓋多個方法
甚至多個類
這是可能的
以上只是一些普遍問題
還存在更多的問題
讓我來提一個建議
在測試命名時
測試類的名字應該讓人一眼就知道這是一個測試類
且能說明它要測試什麼
注意是否和其他類重名
按照以上建議做
就很簡單了
也不用擔心名字太長或難聽
即將在Eclipse中用JUnit工具創建我們第一個測試了
假設你已經下載了一個最新的Eclipse版本
如果還沒有
你應該去官方站點下載
還需要JUnit
也可以從下載
運行Eclipse
新建一個workplace項目
點擊文件
>新建
>項目
選擇Java項目
點擊下一步
起一個項目名稱
例如ProjectWithJUnit
點擊完成
這樣就完成新項目的建立了
再來配置一下Eclipse
在構建路徑中添加JUnit類庫
在工具條上點擊項目
>屬性
選擇Java構建路徑
庫
選擇添加外部JAR
浏覽Junit被存儲的目錄
選擇junit
jar
點擊打開
你將會看見JUnit出現在庫的列表中
點擊確定
讓Eclipse重建路徑
現在開發我們的
Hello World
例子
按照TDD的規則
應該在代碼建立以前先把測試寫好
為了能夠在某出開始
我們假設未來的類名是HelloWorld
並且有一個方法Say()
這個方法返回String的值(例如
Hello World!
)
建立測試
在ProjectWithJUnit的標題上面點擊右鍵
選擇新建
>其他
展開
Java
選項
選擇JUnit
在右邊的欄目對話框中選擇測試案例
然後下一步
在測試類這一欄中
寫上將要被測試的類名HelloWorld
選擇一個測試案例的名字
例如TestThatWeGetHelloWorldPrompt(是的
看上去很長
但是很清楚它的行為
)點擊完成
TestThatWeGetHelloWorldPrompt的代碼如下
import junit
framework
TestCase;
public class TestThatWeGetHelloWorldPrompt
extends TestCase {
public TestThatWeGetHelloWorldPrompt(
String name) {
super(name);
}
public void testSay() {
HelloWorld hi = new HelloWorld();
assertEquals(
Hello World!
hi
say());
}
public static void main(String[] args) {
junit
textui
TestRunner
run(
TestThatWeGetHelloWorldPrompt
class);
}
}
代碼並不復雜
只是有點與眾不同
然而
讓我們考察一下細節
我們繼承了JUnit的TestCase類
它在JUnit的javadocs定義為
運行眾多測試的夾具
JUnit也有TestSuite類
它是一組測試案例的集合
但在本文中不做討論
建立測試案例的步驟如下 建立一個junit
framework
TestCase的實例
定義一些以
test
開頭的無返回方法(例如testWasTransactionSuccessful()
testShow()
等等)
TestThatWeGetHelloWorldPrompt
java包含這些
TestCase的子類和一個叫做testSay()的方法
這個方法調用了assertEquals()函數
它用來比較我們預期的值和由say()返回的值
main()方法用來運行測試和顯示輸出的
JUnit的TestRunner處理測試
提供基於圖像和文本的輸出表現形式
我們使用基於文本的版本
因為Eclipse支持它
且也適合我們
當開始運行後
基於文本的版本測試會以文本形式輸出
Eclipse會把這些輸出自動變成圖像界面的輸出
按照TDD規范
首次運行測試
應該故意讓它失敗
點擊運行
>運行為
>Junit測試(記住TestThatWeGetHelloWorldPrompt
java應該被突出的顯示在包資源管理器中)
在左邊窗口
應該看見JUnit窗口而不是包資源管理器
它顯示一個紅條
一次失敗的測試
具體的失敗原因參看圖
如果沒有自動顯示這些內容
點擊JUnit標簽(在底部的左邊)
educitycn/img_///gif> 圖 JUnit中失敗的測試 現在我們來建立被測試代碼
在包資源管理器窗口的ProjectWithJUnit標題上右擊
選擇新建
>類
選擇類名
我們已經假設了它叫HelloWorld
然後直接點擊完成
為HelloWorld
java填入下列代碼
public class HelloWorld {
public String say() {
return(
Hello World!
);
}
}
這段代碼很簡單
甚至不需要注解
我們再來看看結果
按照上面描述過的方式
在JUnit的窗口中顯示了一個綠條
參看圖
綠條證明測試成功
educitycn/img_///gif > 圖 JUnit中成功的測試 現在
我們想再讓測試失敗一次
但原因不同
這有助於展示JUnit測試中不同的報錯信息
修改assertEquals()代碼
把
Hello World!
變成
Hello Me!
當再次運行JUnit時
結果變成了紅條
在JUnit窗口的底部輸出了失敗原因
參看圖
educitycn/img_///gif> 圖 JUnit中的ComparisonError 最後
想說一下關於測試是開發過程中的必要部分的話題
測試代碼一直是開發中的重要部分
經過近幾年的發展
已得到了很大的提高
這要歸功於強大的理論研究(比如
expectations
based development
等等)
和快速發展的測試工具包
還有測試過程的改進
如果你對這篇文章感興趣
那請你花一些時間來正式的學習一下測試理論吧
這對你的工作很有用
From:http://tw.wingwit.com/Article/program/Java/ky/201311/28801.html