現在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能幫助我們獲得對代碼邏輯正確性的信心。這兩者的結合,能夠使得我們的軟件編寫出現更少的錯誤,同時,也能夠最大限度的減輕我們修正錯誤所需的代價。
新聞熱點
疑難解答