測(cè)試分類:白箱測(cè)試、黑箱測(cè)試、單元測(cè)試、集成測(cè)試、功能測(cè)試...。白箱測(cè)試是指在知道被測(cè)試的軟件如何(How)完成功能和完成什么樣(What)的功能的條件下所作的測(cè)試,一般是由開發(fā)人員完成,單元測(cè)試是一種白箱測(cè)試,因?yàn)殚_發(fā)人員了解自己編寫的軟件。JUnit是由 Erich Gamma 和 Kent Beck 編寫的一個(gè)回歸測(cè)試框架,回歸測(cè)試是你不斷地對(duì)所編寫的代碼進(jìn)行測(cè)試(如單元測(cè)試):編寫一些,測(cè)試一些,調(diào)試一些,然后循環(huán)這一過程,你會(huì)不斷地重復(fù)先前的測(cè)試,哪怕你正編寫其他的類。
第一步:
去Junit主頁(yè)(http://www.junit.org)下載新版本3.8.1程序包junit-3.8.1.zip。解開壓縮包到c:junit(可自定義)。
第二步:
假如目錄是c:junit那么,在classpath中加入:”c:junit;c:junitjunit.jar;“定義類路徑。在命令提示符下運(yùn)行:java junit.swingui.TestRunner,如果一切正確,會(huì)打開應(yīng)用程序。在下拉菜單中尋找程序自帶的例子,比如:junit.samples.AllTests,點(diǎn)擊”Run“觀察結(jié)果。
第三步:
實(shí)現(xiàn)自己的TEST計(jì)劃,目前有一個(gè)叫MyBean的數(shù)據(jù)庫(kù)操作類需要測(cè)試,如下:
package junit.samples;
import java.sql.*;
import java.io.*;
public class MyBean{
Statement stmt=null;
ResultSet rs=null;
Connection conn=null;
String result=null;
public String con(){ //初始化數(shù)據(jù)庫(kù)
try{
Class.forName("org.gjt.mm.mysql.Driver").newInstance();
String url ="jdbc:mysql://192.168.0.88/weboa?user=root&password=";
conn= DriverManager.getConnection(url);
return "Connection Suclearcase/" target="_blank" >ccess!";
}
catch(Exception e){
System.out.println(e);
return "Connection Error!";
}
}
public String gogo(String lmdm){ //查詢數(shù)據(jù)庫(kù)
try{
stmt=conn.createStatement();
String sql="select * from TB_LM where N_LMDM='"+lmdm+"'";
rs=stmt.executeQuery(sql); //執(zhí)行查詢
while (rs.next()){
result=rs.getString("N_SJID");
}
}
catch(Exception e){
result=e.toString();
}
finally { //關(guān)閉JDBC資源
if(rs != null) try { rs.close(); } catch(SQLException ex) { ex.printStackTrace(); }
if(conn != null) try { conn.close(); } catch(SQLException ex) { ex.printStackTrace(); }
}
return result;
}
}
接著,創(chuàng)建一個(gè)測(cè)試類:TestMyBean,如下:
package junit.samples;
import junit.samples.MyBean;
import junit.framework.*;
public class TestMyBean extends TestCase { //TestCase的子類
private MyBean aName; //構(gòu)造被測(cè)類的對(duì)象
public TestMyBean(String name) {
super(name);
}
protected void setUp() { //進(jìn)行初始化的任務(wù)
aName= new MyBean();
}
public static Test suite() { //進(jìn)行測(cè)試
return new TestSuite(TestMyBean.class);
}
public void testCon() { //對(duì)預(yù)期的值和con方法比較
Assert.assertTrue(!aName.equals(null)); //斷言
Assert.assertEquals("Connection Success!",aName.con());
}
public void testGogo() { //對(duì)預(yù)期的值和gogo方法比較
aName.con();
Assert.assertTrue(!aName.equals(null)); //斷言
Assert.assertEquals("0",aName.gogo("1"));
}
}
解釋如下:
首先要引入待測(cè)試的類import junit.samples.MyBean;接著引入Junit框架import junit.framework.*;。與一個(gè)Servlet類似,需要繼承父類TestCase;在setUp()方法中實(shí)例化一個(gè)MyBean,供后面的測(cè)試方法使用;suite()是一個(gè)很特殊的靜態(tài)方法,它會(huì)使用反射動(dòng)態(tài)的創(chuàng)建一個(gè)包含所有的testXxxx方法的測(cè)試套件,確定有多少個(gè)測(cè)試可以執(zhí)行;testCon()方法對(duì)MyBean的Con方法進(jìn)行測(cè)試,并斷言(Assert)結(jié)果是"Connection Success!",并在Assert.assertEquals()方法中驗(yàn)證;testGogo()方法和testCon()方法類似。
第四步:
把TestMyBean、MyBean類編譯成*.class文件,在Junit的控制臺(tái)上選擇剛才定義的TestMyBean類,并運(yùn)行。如果一切正確,會(huì)顯示綠條,證明測(cè)試正確。如果顯示紅色,在Results中會(huì)有相應(yīng)顯示,根據(jù)提示檢查MyBean類中的錯(cuò)誤。一般的,只要斷言符合MyBean類的規(guī)范,TestMyBean類幾乎不可能出錯(cuò)。
一些擴(kuò)展:
對(duì)于WEB應(yīng)用程序,我們可以把Junit引入,只需適當(dāng)配置環(huán)境。另外,可以把眾多的測(cè)試類集成到一起,形成總測(cè)試類,并且只需要實(shí)現(xiàn)suite()方法,例如:
public static Test suite ( ) {
TestSuite suite= new TestSuite("All JUnit Tests");
suite.addTest(VectorTest.suite());
suite.addTest(TestMyBean.suite());
return suite;
}