介紹
現在IT開發人員比以往任何時候都更加關注測試的重要性,沒有經過良好測試的代碼更容易出問題。在極限編程中,測試驅動開發已經被證明是一種有效提高軟體品質的方法。在測試驅動的開發方式中,軟體工程師在編寫功能代碼之前首先編寫測試代碼,這樣能從最開始保證程式碼的正確性,並且能夠在程式的每次演化時進行自動的迴歸測試。
單元測試是和開發人員最密切相關的測試類型。它通常由開發人員編寫和執行。由於單元測試通常發生在錯誤產生之後不久,因此通過單元測試發現錯誤然後進行修正的代價通常比較小。單元測試是如此重要,以至於一些極限編程愛好者主張任何未經測試的代碼都應該被自動刪除。JUnit是Java開發人員進行單元測試事實上的標準。儘管現在出現了TestNG和JTiger這樣功能更為完善的測試載入器,JUnit仍然佔據著測試載入器的頭把交椅。
JUnit佔據市場壟斷地位的一個證據是目前有很多為JUnit開發的擴充和外掛程式。今天我們要講述的就是一個配合JUnit使用的Eclipse外掛程式Continuous Testing。它能夠利用機器的空閑計算周期執行測試,並將其作為error顯示在Problem View和編輯器的標記區。
在編寫代碼的空閑時間執行測試會佔用一些CPU時間和其他資源。不過相對Continuous Testing提供的好處而言,我們不需要對此斤斤計較。還記得第一次使用Eclipse的增量編譯嗎?
我記得當時我對這個功能不屑一顧,現在我已經完全依靠增量編譯來糾正我偶爾犯下的語法錯誤了。對於軟體開發人員而言,任何能夠有效縮短"編寫-編譯-測試-修改"迴圈的工具都具有重要的意義。就此而言,我相信Continuous Testing對於軟體開發人員具有重要的意義。在http://www.eclipse-plugins.info/上我們可以看到Continuous Testing受到眾多使用者的好評
安裝Continuous Testing
在Eclipse中安裝Continuous Testing的方法非常簡單,類似於安裝其他的plugin的方法。首先我們啟動Eclipse3.1,單擊功能表項目Help->Software Update->Find and Install。在彈出的嚮導對話方塊中,我們選擇"Search New Features to Install",在彈出的對話方塊中點擊"New Remote Site",如圖1所示。在URL中輸入 http://beust.com/eclipse,點擊"OK"。如圖 1所示,點擊"Finish",Eclipse會協助我們增加一個用於Update的網站。熟悉 Eclipse的讀者對這個過程一定不會覺得陌生。
圖 1建立Update Site
添加Update Site之後,在隨後出現的Install對話方塊中選中剛剛添加的Update Site,並且按下Finish按鈕,如圖 2所示。經過後續的下載和確認之後,我們就安裝好了Continuous Testing了。
圖 2安裝Continuous Testing
在工程中啟用Continuous Testing 安裝了Continuous Testing之後,我們就可以在任何java工程中啟用Continuous Testing了。在Package Views中單擊滑鼠右鍵並從菜單中選擇Property。在隨後出現的工程屬性對話方塊中,我們可以看到配置資訊有了一個新的分類Continuous Testing。選擇這個分類,並在Continuous Testing Properties頁面中選中"Enable Informed Testing"和"Enable Continuous Testing"。這樣我們就啟用了Continuous Testing。
圖 3 配置Continuous Testing
在這個對話方塊中,我們還可以配置Continuous Testing的一些設定資訊。例如尋找Test Case的策略、進行測試的優先順序設定以及在測試開始之前進行過濾操作等。例如我就喜歡讓Continuous Testing優先測試最近出錯的測試。
Continuous Testing提供的視圖
接下來,我們在一個啟用了Continuous Testing的工程中建立一個如下的Test Case。可以看到,我們這個Test Case沒有包含任何有用的測試。我們提供的兩個測試方法一個必定會失敗,而另外一個會拋出異常。通過這個例子,我們可以看到Continuous Testing為我們提供了什麼。
package test;
import java.util.Arrays;
import junit.framework.TestCase;
public class DummyTest extends TestCase {
public void testTopThreeIntsUnsorted() {
Integer one = new Integer(1);
Integer two = new Integer(2);
Integer three = new Integer(3);
Integer four = new Integer(4);
Integer five = new Integer(5);
Integer six = new Integer(6);
assertEquals(Arrays.asList(new Integer[] { one, two, three }), Arrays
.asList(new Integer[] { four, five, six }));
}
public void testException() throws Exception {
throw new IllegalArgumentException();
}
}
Continuous Testing外掛程式在後台執行測試代碼,當監測到有錯誤或異常發生,Continuous Testing將會通過Problem View來通知開發人員。在我們提供的測試案例中,Problem View將會如下所示:
圖 4 Problem View
如果我們在Problem View當中雙擊某一條測試錯誤資訊,那麼Java編輯器將會開啟並顯示產生錯誤的測試方法。這和我們察看其他錯誤發生地點的方式非常象,不是嗎?另外,如果我們在編輯器中開啟了DummyTest.java,我們還可以看到新的測試錯誤標記出現在編輯器的左側欄上。
圖 5 編輯器上的測試錯誤標記
通過上面的描述我們可以看到,使用Continuous Testing的方式非常簡單。Continuous Testing外掛程式甚至沒有引入任何新的視圖。我們工作的方式與以往完全一樣,僅有的不同是現在Eclipse在IDE中自動顯示測試錯誤資訊。
對多Project的支援
當使用JUnit進行測試時,我們通常將測試放置在一個單獨的工程中。這種情況下,我們需要對工程進行一些特殊的配置。假如我們將hello工程的Test Case放置在工程hello.test中,那麼當我們為hello工程起用Continuous Testing支援時,需要按照圖 1配置hello工程的Continuous Testing屬性。
圖 6 多工程情況下配置測試
也就是說我們需要改變Continuous Testing尋找Test Case的方法,使得當hello工程被修改時,Continuous Testing從工程hello.test中尋找測試案例。
除了多Project支援之外,Continuous Testing還支援其他一些進階特性例如howswap、低優先順序執行、remote executeon等。感興趣的讀者朋友可以進一步對其進行研究。
小結
通過使用Continuous Testing,我們能夠在修改代碼的同時對代碼的邏輯正確性進行檢查。如果說Eclipse的增量編譯功能使得我們在修改代碼的同時能獲得對代碼文法正確性的信心,那麼Continuous Testing能協助我們獲得對代碼邏輯正確性的信心。這兩者的結合,能夠使得我們的軟體編寫出現更少的錯誤,同時,也能夠最大限度的減輕我們修正錯誤所需的代價。