一簡介
本文與之前的《JUnit學習筆記》所記述的內容是一致的只不過IDE換成了最近開始試用的NetBeansNetBeans是新近流行的一款堪與Eclipse媲美的IDE有Sun的支持最新版本RC本文使用的是中文版可以從下載
JUnit是一款由Erich Gamma(《設計模式》的作者)和Kent Beck(極限編程的提出者)編寫的開源的回歸測試框架供Java編碼人員做單元測試之用可以從網站上免費獲得本文使用的是NetBeans自帶的JUnit
二創建項目
下面打開NetBeans然後點擊菜單文件>新建項目打開新建項目對話框
請在類別中選擇常規再從項目中選擇Java應用程序然後點擊下一步進入新建Java應用程序對話框
在這個對話框中需要設置項目的名稱以及項目所在目錄我為自己的項目起名為JUnitTest項目位置為G:\YPJCCK\JUnit\NetBeans此外請將創建主類前的對號去掉項目創建好後已經自帶了JUnit
三編寫用於測試的JavaBean
用於測試的JavaBean很簡單名為Book只有id和name兩個屬性這兩個屬性將分別用於兩個用例當中下面開始編寫該JavaBean
請點擊文件>新建文件打開新建文件對話框
確保項目選擇的是JUnitTest然後在類別中選中Java類在文件類型中選中Java類點擊下一個進入下一窗口
設置類名為Book包為netzhengjunittest設置完成後點擊完成修改代碼如下
package netzhengjunittest;
public class Book {
private String id = null;
private String name = null;
public String getId() {
return id;
}
public void setId(String id) {
thisid = id;
}
public String getName() {
return name;
}
public void setName(String name) {
thisname = name;
}
}
至此用於測試的JavaBean編寫完成
四編寫測試用例
這裡只用了一個類進行測試名為BookTest該類繼承自junitframeworkTestCase類BookTest類包含兩個用例分別對應該類的testId和testName方法即每個方法實現了一個測試用例注意在JUnit中junitframeworkTestCase的子類中每個用來實現測試用例的方法都必須以testXXX的格式來命名這些方法在運行時會被執行此外BookTest還包括setUp和tearDown這兩個方法前者在每個測試方法開始之前執行多用來做初始化後者在每個測試方法完成之後執行多用來清理資源下面開始編寫BookTest
請點擊文件>新建文件打開新建文件對話框
確保項目選擇的是JUnitTest然後在類別中選中JUnit類在文件類型中選中現有類的測試點擊下一個進入下一窗口
選擇要測試的類點擊完成修改代碼如下
package netzhengjunittest;
import junitframeworkTestCase;
import junitframeworkAssert;
public class BookTest extends TestCase {
Book book = null;
//建議為測試類創建構造
public BookTest(String name) {
super(name);
}
protected void setUp() throws Exception {
//調用超類的setUp()以確保測試環境被初始化
supersetUp();
Systemoutprintln(測試開始!);
book = new Book();
Systemoutprintln(book對象被初始化!);
}
protected void tearDown() throws Exception {
Systemoutprintln(book對象將被清理!);
book = null;
Systemoutprintln(測試結束!);
//調用超類的tearDown()以確保測試環境被清理
supertearDown();
}
public void testId() {
booksetId(); //設置id屬性的值為
//使用Assert查看id屬性的值是否為
AssertassertEquals( bookgetId());
Systemoutprintln(id屬性被測試!);
}
public void testName() {
booksetName(ASP); //設置name屬性的值為ASP
//使用Assert查看name屬性的值是否為JSP這是個必然出現錯誤的測試
AssertassertEquals(JSP bookgetName());
Systemoutprintln(name屬性被測試!);
}
}
這裡setUp和tearDown方法沒什麼好說的就是執行了對book對象的初始化和清理不過testId和testName需要說明一下前者是在對book的id屬性進行測試首先賦值為然後使用Assert的assertEquals方法查看id屬性中存放的值是否是期待的值由於我的期待值也是所以執行後這個用例應該是成功的後者則是對book的name屬性進行測試也是首先賦值為ASP然後使用Assert的assertEquals方法查看其值是否是期待的由於我特意將期待值設定為根本不可能的JSP因此這個用例執行後會出現一個錯誤但請注意由於我是特意要讓測試出現錯誤所以將期待值設定成了不可能的值如果你是測試人員請千萬不要這麼做否則如果別的地方導致了錯誤很容易給自己造成不必要的麻煩
下面簡單介紹一下上邊用到的靜態類junitframeworkAssert該類主要包含個方法
.assertEquals()方法用來查看對象中存的值是否是期待的值與字符串比較中使用的equals()方法類似
.assertFalse()和assertTrue()方法用來查看變量是是否為false或true如果assertFalse()查看的變量的值是false則測試成功如果是true則失敗assertTrue()與之相反
.assertSame()和assertNotSame()方法用來比較兩個對象的引用是否相等和不相等類似於通過==和!=比較兩個對象
.assertNull()和assertNotNull()方法用來查看對象是否為空和不為空;
.fail ()方法意為失敗用來拋出錯誤我個人認為有兩個用途首先是在測試驅動開發中由於測試用例都是在被測試的類之前編寫而寫成時又不清楚其正確與否此時就可以使用fail方法拋出錯誤進行模擬其次是拋出意外的錯誤比如要測試的內容是從數據庫中讀取的數據是否正確而導致錯誤的原因卻是數據庫連接失敗
五運行BookTest
編寫好BookTest後就可以運行了請在項目欄中選中BookTest點擊鼠標右鍵選擇運行文件測試信息會從輸出窗口輸出
六測試套件
當有多個測試類需要一次性進行測試時可以使用測試套件來完成這項工作
在NetBeans中點擊文件>新建文件打開新建文件對話框
確保項目選擇的是JUnitTest然後在類別中選中JUnit類在文件類型中選中測試套件點擊下一個進入下一窗口
修改類名為AllTests點擊完成然後修改代碼如下
package netzhengjunittest;
import junitframework*;
public class AllTests extends TestCase {
public AllTests(String testName) {
super(testName);
}
public static Test suite() {
TestSuite ts= new TestSuite(AllTests);
tsaddTestSuite(BookTestclass);
return ts;
}
}
其中TestSuite是用來組織測試類的通過其addTestSuite()方法將測試類添加到ts對象中凡是添加到ts中的測試類都將在運行文件時被執行此外您也可以在定義ts對象時利用其構造函數將測試類添加給ts對象例如
TestSuite ts = new TestSuite(BookTestclass);
這並不會影響到後續使用addTestSuite()方法測試套件的運行方法與之前一樣
此外JUnit自身也提供了運行測試的環境但需要在NetBeans中做一些改動所以就不作詳細介紹了這裡只將代碼給出
package netzhengjunittest;
import junitframework*;
public class Test {
public static void main(String[] args) {
//使用TestSuite組裝測試類
TestSuite ts = new TestSuite();
tsaddTestSuite(TestBookclass);
//textui命令行方式
junittextuiTestRunnerrun(ts);
//swinguiSwing方式
//junitswinguiTestRunnerrun(tsgetClass());
//awtuiAWT方式
//junitawtuiTestRunnerrun(tsgetClass());
}
}
七小結
其實JUnit上手很容易遠比想象的要簡單的多但我覺得如何編寫測試類是很需要經驗的因為許多時候測試一個用例但涉及到可能不止一個類而有些時候一個類可能是做為工具使用裡邊涉及很多內容那麼測試時是否還是只編寫一個測試類呢?關於這個話題我想應該是仁者見仁智者見智的其實這才是測試的難題所在
From:http://tw.wingwit.com/Article/program/Java/ky/201311/28271.html