JUnit 是由 Erich Gamma 與 Kent Beck 創建的回歸測試框架,支援「寫一點、測一點、改一點」的微循環開發節奏。本文以實例演示從環境搭建到測試執行的完整流程。
c:\junitCLASSPATH 包含 c:\junit;junit.jarjava junit.swingui.TestRunner 啟動圖形介面,載入 junit.samples.AllTests 點擊 Run 觀察綠條被測類 MyBean(模擬資料庫操作):
package junit.samples;
import java.sql.*;
public class MyBean {
private Connection conn;
public String con() {
try { Class.forName("org.gjt.mm.mysql.Driver").newInstance();
conn = DriverManager.getConnection("jdbc:mysql://192.168.0.88/weboa?user=root&password=");
return "Connection Success!";
} catch (Exception e) { System.out.println(e); return "Connection Error!"; }
}
public String gogo(String lmdm) {
try { Statement stmt = conn.createStatement();
ResultSet rs = stmt.executeQuery("select * from TB_LM where N_LMDM='" + lmdm + "'");
while (rs.next()) return rs.getString("N_SJID");
} catch (Exception e) { return e.toString(); }
finally { /* 關閉資源 */ }
}
}
測試類 TestMyBean:
package junit.samples;
import junit.framework.*;
public class TestMyBean extends TestCase {
private MyBean bean;
public TestMyBean(String name) { super(name); }
protected void setUp() { bean = new MyBean(); } // 每個 testXxx 前執行
public static Test suite() { return new TestSuite(TestMyBean.class); } // 反射收集所有 testXxx
public void testCon() {
assertNotNull(bean);
assertEquals("Connection Success!", bean.con());
}
public void testGogo() {
bean.con();
assertNotNull(bean);
assertEquals("0", bean.gogo("1"));
}
// protected void tearDown() { /* 每個 testXxx 後執行,釋放資源 */ }
}
assertEquals、assertTrue、assertNotNull 等,失敗拋出 AssertionFailedError# 文字介面
java junitfaq.SimpleTest
# 輸出:. Time: 0 OK (1 tests)
# 圖形介面
java junit.swingui.TestRunner junitfaq.SimpleTest
# 綠條 = 全部通過,紅條 = 有失敗/錯誤
失敗 vs 錯誤:Failure 來自斷言不成立;Error 來自非預期異常(如 NullPointerException)。
public static Test suite() {
TestSuite suite = new TestSuite("All JUnit Tests");
suite.addTest(VectorTest.suite());
suite.addTest(TestMyBean.suite());
return suite;
}
Web 應用同樣適用,只需在測試環境配置資料源與容器上下文。