摘要:軟件開發和軟件測試就像兩兄弟,他們密不可分、協同合作,目標只有一個,那就是成功開發出高質量的軟件。開發與測試之間的關系如此密切,讓我們很難徹底的將兩者嚴格的劃分開來。單元測試做為測試的一部分,一般都由編碼人員來承擔,對于模塊級一直都是誰編碼、誰測試。因此測試不僅僅是測試人員的事情,作為編碼人員也需要懂得測試的基本方法,以通過單元測試提交高質量的程序模塊。
關鍵詞:NetBeans;Junit;單元測試
中圖分類號:TP311文獻標識碼:A文章編號:1009-3044(2008)16-21255-03
NetBeans Platform Software Development Unit Testing Technology Research
TANG Jun
(Hunan Urban Construction College, Xiangtan 411101,China)
Abstract: Software development and software testing like the two brothers, they are inseparable, collaboration, there is only one objective, that is, successful development of high-quality software. Development and testing of the relationship between such closely, it is difficult to complete the demarcation of the two strict set. Unit testing as part of the test, the general commitment by the staff to coding, the module level who has been coded, who tests. So the test is not just testing things, as a coding staff also need to understand the basic test methods, through unit testing procedures to high-quality modules.
Key words: NetBeans; Junit; unit testing
1 引言
任何一個程序員都知道單元測試的重要性,沒有經過嚴格測試的模塊是“靠不住”的,組裝過程會出現越來越多的Bug,甚至到了客戶那里都不能正常工作,這簡直就是一場災難。雖然每個程序員都深刻的知道這點,但是很多時候在進度的壓力下,程序員不得不放棄部分甚至是全部的單元測試。特別是在我國現在的國情下,獻禮項目太多,建設方的領導為了在某個“有意義”的日子里使項目上線,往往迫使軟件開發方違背客觀事實,在不可能的工期內完工。程序員作為項目的最底層人員,自然沒有力量來進行反抗,當他們加班加點都無法在規定時間完成,于是放棄測試就成為了他們的唯一選擇。
很快這就成為一個惡性循環:壓力越大,編寫的測試越少。編寫的測試越少,的效率越低,并且代碼越不穩定。而效率越低并且越不精確,開發人員就感覺越有壓力。
程序員的精力就在這樣的惡性循環中被耗費掉。想要打破它需要一種外界的影響。所謂的這種外界的影響,其實就是一個簡單的測試框架,它可以讓我們通過做很少的測試,來達到完整的測試,減少我們編寫測試代碼的時間。
2 NetBeans 5.0對單元測試的支持
NetBeans IDE 5.0 引入了對基于 NetBeans 平臺的 IDE 模塊和富客戶端程序開發的全面支持,直觀的全新 GUI Builder Matisse,經過重新設計的對 CVS 的新支持,對 Sun Application Server 8.2、Weblogic9 和 JBoss 4 的支持,以及很多的編輯器增強功能。同時集成了Java開發工具中應用最廣泛的單元測試工具Junit,使得在NetBeans下進行單元測試變得簡單容易,提高了程序員進行單元測試的積極性。
可以使用NetBeans IDE創建以下類型的測試:
(1)空測試:沒有測試方法的測試框架,尚未指定要測試的任何類。
(2)現有類的測試:包含實際測試方法的類,這些方法鏡像了要測試的源的結構。
(3)測試套件:匯集在一起的幾組測試類,允許對整個應用程序或項目進行測試。
可以使用以下方法生成并找到測試:在“項目”窗口中選擇任何類或包節點,然后從“工具”> \"JUnit\" 菜單中進行選擇。NetBeans 將單元測試表示為子樹,這些子樹反映了項目的 Java 包結構。每個測試類都由它所測試的類的名稱后Test 單詞組成(如 MyClassTest.java)。
每個項目都有一個缺省的測試包,所有的測試文件都在測試包內被組織。程序文件與測試文件被分割成兩個獨立的部分,在項目下分為一個SRC文件夾和一個TEST文件夾,互相不產生影響,測試完成后,只需要將SRC文件夾單獨移開,并不需要TEST文件夾的支持。包結構如圖1:
3 被測試模塊的編寫
新建一個Java類庫的項目,項目名稱為:MoneyChange,新建包moneychange,在包中添加類Money.class。
package moneychange;
public class Money {
private int fAmount;
private String fCurrency;
public Money(int amount,String currency) {
fAmount=amount;
fCurrency=currency;
}
………
}
該類有兩個私有屬性fAmount和fCurrency,構造函數在對類進行初始化的時候,對兩個私有屬性進行了賦值。Add方法對兩個Money對象的現金(fAmount)進行相加,equals方法對兩個Money對象的現金及貨幣單位進行比較是否相等。
4 創建單元測試
在項目窗口中的類Money.class上鼠標右鍵單擊,在彈出的菜單中選擇“工具”,并在子菜單中選擇“創建Junit測試”。
這并不是創建單元測試的唯一方法,也可以通過“工具”下拉菜單中的“創建Junit測試”進行。接著彈出“創建測試”對話框,對測試類的類名以及需要生成的內容進行選擇后,點擊“確定”即可完成測試類的生成。
5 測試代碼的修改
Junit不是萬能的,不要指望它什么都幫你做好,在單元測試中,Junits 負責測試框架的生成,其他的事情還是需要程序員來做,如測試用例的設計和測試管理等。Junit針對上面代碼生成的測試代碼如下(已經刪除部分注釋):
package moneychange;
import junit.framework.*;
public class MoneyTest extends TestCase {
public MoneyTest(String testName) {
super(testName);}
protected void setUp() throws Exception {}
protected void tearDown() throws Exception {}
public void testAmount() {
System.out.println(\"amount\");
Money instance = 1;
int expResult = 0;
int result = instance.amount();
assertEquals(expResult, result);
fail(\"測試案例為原型。\");}
public void testCurrency() {
System.out.println(\"currency\");
Money instance = 1;
String expResult = \"\";
String result = instance.currency();
assertEquals(expResult, result);
fail(\"測試案例為原型。\");}
public void testAdd() {
System.out.println(\"add\");
Money m = 1;
Money instance = 1;
Money expResult = 1;
Money result = instance.add(m);
assertEquals(expResult, result);
fail(\"測試案例為原型。\"); }
public void testEquals() {
System.out.println(\"equals\");
Object anObject = 1;
Money instance = 1;
boolean expResult = true;
boolean result = instance.equals(anObject);
assertEquals(expResult, result);
fail(\"測試案例為原型。\");}
}
此時,如果要執行測試,可以展開項目中的測試包,在測試類上鼠標右鍵單機,在彈出的菜單上選擇“運行文件”,如圖2所示。默認的測試類的執行結果是全部都不能通過的,結果如圖3。
圖2 圖3
我們需要對生成的測試代碼進行修改,將我們的測試用例以及期望的結果寫入測試代碼中,將fail(“測試案例為原型”);語句刪除。testAdd的代碼修改后如下:
public void testAdd() {
System.out.println(\"testAdd\");
Money m12CHF= new Money(12, \"CHF\");
Money m14CHF= new Money(14, \"CHF\");
Money expected= new Money(26, \"CHF\");
Money result= m12CHF.add(m14CHF);
Assert.assertTrue(expected.equals(result));
}
該方法創建了兩個進行加法操作的對象m12CHF和m14CHF,相加的結果為result對象,然后將result與期望的對象expected對象進行相等性測試。對修改后的測試代碼再次執行結果如圖4。
圖4
對所有的測試用例進行測試通過后,即可以開始填寫單元測試報告。通過單元測試的類比沒有經過測試的類的穩定性將大大提高。
6 結束語
NetBeans集成的Junit單元測試工具為單元測試提供了一個很好的框架,我們無需將精力浪費在寫單元測試代碼上,而將更多的關注測試用例的設計。開發人員進行測試越來越方便,這也增強了開發人員進行單元測試的信心,在趕工期的同時將單元測試做好,是保證項目最后能夠成功的一個重要手段。
參考文獻:
[1] 蔡高亮.軟件單元測試[J].信息技術與標準化,2008(Z1).
[2] 劉升華.單元測試自動化工具的研究與實現[J].計算機工程與設計, 2007(23).
[3] 郭雯.基于VC6.0的單元測試研究與實踐[J].甘肅科技,2007(02).
[4] 隋智泉.一種改進的單元測試JUnit框架[J].電腦知識與技術,2007(08).
[5] 李海濤,歐全.淺析單元測試在項目開發中的應用.科技信息,2007(20).
注:本文中所涉及到的圖表、注解、公式等內容請以PDF格式閱讀原文。