1、JUnit的定義
JUnit is an open source Java testing framework used to write and run repeatable tests.說白了,JUnit 是一個集成測試工具,能實現測試的自動化.這裡說的是單元測試:屬於軟體工程里的白盒測試,也就是測試某個類的某個方法的功能.
2、JUnit的測試思想
如果你要寫一段代碼:
先用 junit 寫測試,然後再寫代碼
寫完代碼,運行測試,測試失敗
修改代碼,運行測試,直到測試成功
XP(極限編程)中推崇的 test first design 就是基於以上技術.
不過,似乎不可行.以下面的HelloWorldTest為例,如果沒有HelloWorld.class存在,則編譯到HelloWorld world = new HelloWorld();時就會報錯.
這不是與"先寫測試,后寫代碼"的思想相左嗎?
3、"先寫測試,再寫代碼"的好處
a)從技術上強制你先考慮一個類的功能,也就是這個類提供給外部的介面,而不至於太早
陷入它的細節.這是面向對象提倡的一種設計原則.
b)好的測試其實就是一個好的文檔.這個類使用者往往可以通過查看這個類的測試代碼了解它的功能.特別的,如果你拿到別人的一個程序,對他寫測試是最好的了解這個程序的功能的方法. xp的原則是make it simple,不是很推薦另外寫文檔,因為項目在開發過程中往往處於變動中,如果在早期寫文檔,以後代碼變動后還得同步文檔,多了一個工作,由於項目時間緊往往文檔寫的不全或與代碼不一致,與其這樣,不如不寫.而如果在項目結束后再寫文檔,開發人員往往已經忘記當時寫代碼時的種種考慮,況且有下一個項目的壓力,管理人員也不願意再為舊的項目寫文檔.導致以後維護的問題.
c)沒有人能保證需求不變動,以往項目往往對需求的變動大為頭疼,害怕這個改動會帶來其他地方的錯誤.為此,除了設計好的結構以分割項目外(松耦合),但如果有了測試,並已經建立了一個好的測試框架,對於需求的變動,修改完代碼后,只要重新運行測試代碼,如果測試通過,也就保證了修改的成功,如果測試中出現錯誤,也會馬上發現錯在哪裡.修改相應的部分,再運行測試,直至測試完全通過.
4、Java下的team開發開發模式
一般採用 cvs(版本控制) ant(項目管理) junit(集成測試) 的模式:
每天早上上班,每個開發人員從 cvs server 獲取一個整個項目的工作拷貝.
拿到自己的任務,先用 junit 寫今天的任務的測試代碼.
然後寫今天任務的代碼,運行測試,直到測試通過,任務完成
在下班前一兩個小時,各個開發人員把任務提交到 cvs server
然後由主管對整個項目運行自動測試,哪個測試出錯,就找相關人員修改,直到所有測試通過.下班…
5、如何安裝?
1、在http://www.junit.org/下載最新的junit,我下載的是junit3.8.1.zip.
2、將下載的壓縮包解壓到安裝目錄下.
3、將安裝目錄下的junit.jar加到classapth中去,這樣就安裝成功了.
6、如何測試運行正常?
1、在d:\juni3.8.1\junit\samples\目錄下鍵入
java -classpath %CLASSPATH%;. junit.textui.TestRunner SimpleTest
如果出現下列信息:
Time: 0.01
OK (1 test)
則表示安裝成功.
也可用graphics方式測試:
java -classpath %CLASSPATH%;. junit.swingui.TestRunner SimpleTest
2、或自己寫一個例子進行測試:
a)將以下代碼鍵入編輯器中,並存為SimpleTest.java.
import junit.framework.TestCase;
public class SimpleTest extends TestCase {
public SimpleTest (String name) {
super(name);
}
public void testTest() {
assertTrue(true);
}
}
b)編譯SimpleTest.java
javac -d . -classpath %CLASSPATH% SimpleTest.java
c)運行SimpleTest
java -classpath %CLASSPATH%;. SimpleTest
7、編寫測試類的基本步驟
使用JUnit編寫測試代碼的一般步驟是:
(1)引入JUnit框架包.import junit.framework.*.
(2)定義測試類名稱,一般是將要測試的類名后附加Test.
(3)測試類繼承JUnit的TestCase類.
(4)實現類的構造方法,可以在構造方法中簡單的調用super(name)即可.
(5)實現類的main()方法,在main()方法中簡單調用junit.textui.TestRunner.run(SimpleTest.class)來指定執行測試類.
(6)重載setUp()和tearDown()方法,setUp()方法用於執行每個測試用例時進行環境的初始化工作
(比如打開資料庫連接),tearDown()方法用於執行每個測試用例后清除環境(比如關閉資料庫連接).
(7)編寫每個測試用例,寫一些testXXXX()方法(一般是在要測試的方法前附加test).
8、如何創建測試案例(示例)?
測試類完整的代碼框架如下所示:
import junit.framework.*;
public class HelloWorldTest extends TestCase {
/**
* 構造函數
*/
public HelloWorldTest(String name) {
super(name);
}
/**
* 主方法
*/
public static void main(String args[]) {
junit.textui.TestRunner.run(HelloWorldTest.class);
}
/**
* 測試前的初始化 ---> 執行setUp()方法,初始化你需要的任何值
*/
protected void setUp() {
}
/**
* 清除測試環境 ---> 調用tearDown(),取消初始化並進到下一個測試
*/
protected void tearDown(){
}
/**
* 測試用例1
*/
public void testSayHello() {
HelloWorld world = new HelloWorld();
//assert( world!=null );
assertEquals("Hello World", world.sayHello() );
}
}
javac -d . -classpath %CLASSPATH% HelloWorldTest.java
java -classpath %CLASSPATH%;. HelloWorldTest
--------------------------------------------------------------------
/*
* HelloWorld.java
*/
class HelloWorld {
public String sayHello() {
return "Hello World";
}
public static void main(String[] args) {
HelloWorld world = new HelloWorld();
System.out.println(world.sayHello());
}
}
javac -d . HelloWorld.java
將HelloWorld.java中return "Hello World";該成return "Hello Worl!";試試看會有什麼提示出現.
9、什麼是測試包(test suit)?
所謂測試包(test suite)其實就是同一會話中應當執行的測試集合.
測試包把測試組織在一起執行,而不論測試是否在同一文件里.
清單A顯示我們的測試包包含兩個測試:
Listing A: Test suite
public static Test suite() {
TestSuite suite = new TestSuite();
suite.addTest(new XMLTest("testPersonCount"));
suite.addTest(new XMLTest("testContainsPerson"));
return suite;
}
10、如何利用測試包執行測試?
執行測試需要創建可執行類來調用Junit測試運行器.運行器(runner)負責執行測試包(test suite),運行所有的測試並輸出測試結果.
清單B顯示了如何把測試包集成到測試運行器中:
Listing B: XMLTestRunner.java
import junit.framework.Test;
import junit.framework.TestSuite;
import XMLTest;
public class XMLTestRunner {
//public static Test suite() {
// TestSuite suite = new TestSuite();
// suite.addTest(new XMLTest("testPersonCount"));
// suite.addTest(new XMLTest("testContainsPerson"));
// return suite;
//}
/**
*顯示了如何把類的名字傳遞給測試包構造器來自動裝載測試.
*/
public static Test suite() {
return new TestSuite(XMLTest.class);
}
public static void main(String[] args) {
junit.textui.TestRunner.run(suite());
}
}
12、如何創建測試包?-- 手工創建與自動創建
/**
*手工創建:
*下面這個簡單的測試運行器負責創建測試包,添加各個測試然後添加整個測試包.
*/
import junit.framework.Test;
import junit.framework.TestSuite;
public class TestRunner {
public static TestSuite suite() {
TestSuite t = new TestSuite();
t.addTest(new HelloWorldTest("testSayHello"));
t.addTest(new SimpleTest("testTest"));
t.addTestSuite(TestRunner.class);
return t;
}
public static void main(String args[]) {
junit.textui.TestRunner.run(suite());
}
}
運行: java -classpath %CLASSPATH%;. TestRunner
(我的TestRunner.class放在與test同級的test目錄下)
/**
*自動創建:
*從命令行上讀取測試目錄,遍歷整個目錄尋找擴展名為".class"的文件,然後把它們加到測試包里.
*/
import junit.framework.Test;
import junit.framework.TestSuite;
import java.lang.ClassNotFoundException;
import java.io.*;
import java.util.Vector;
public class AllRunner {
public static void class_list(File directory, TestSuite t) {
if (directory.isDirectory()) {
String[] files = directory.list();
for (int i = 0; i < files.length; i ) {
File f = new File(directory, files[i]);
if (f.isFile() && f.getName().endsWith(".class")) {
int len = f.getName().length();
String n = f.getName().substring(0, len - 6);
try {
t.addTestSuite(Class.forName(n));
} catch (java.lang.ClassNotFoundException e) {
System.out.println(e);
}
}
}
}
}
public static void main(String args[]) {
TestSuite t = new TestSuite("請輸入欲測試的目錄名: " args[0]);
AllRunner.class_list(new File(args[0]), t);
junit.textui.TestRunner.run(t);
}
}
技巧:將所有的測試案例放到一個tmp目錄下,運行java -classpath %CLASSPATH%;. AllRunner /tmp
(我的AllRunner.class放在與test同級的目錄test目錄下)
就這個例子來說,創建的測試運行器運行了指定目錄下的所有測試,並把結果屏幕顯示.當然,我們動態創建的測試包假定所有的測試都要運行按照從目錄中以字母順序讀取的順序運行.
不對將執行的測試進行選擇也是一種可能的測試需求,不過,在這種情況下你就只能手工地把測試加到測試包里.
注意:我們的測試運行器(TestRunner)採用Java類裝載器導入類,裝載器要裝載的類一定要位於類路徑下(因此我已將d:\j2sdk1.4\mywork下的class目錄加到CLASSPATH中去了).
測試運行器的輸出結果就是測試結果,因為輸出結果表示了目錄下所有測試的狀態,這種測試對我們的開發工作很有幫助.
12、如何與 Ant 集成?
集成Junit的Ant可以幫助我們快速地測試系統的變動.Jakarta Project給Ant創建了集成Junit的任務.這些任務可以自動地運行測試同時產生輸出結果和報告.
13、如何放置test文件?
與原文件分開放置,但結構與包相同.如下所示:
src
com
xyz
SomeClass.java
test
com
xyz
SomeClass.java
[火星人 ] JUnit的簡單介紹已經有882次圍觀