4、測試代碼的運行
先說常用的集成模式。
測試代碼寫好以后,可以相應(yīng)的類中寫main方法,用java命令直接運行;也可以不寫main方法,用Junit提供的運行器運行。Junit提供了textui,awtui和swingui三種運行器。
以前面第2步中的AllTests運行為例,可有四種:
java junit.textui.TestRunner junit.samples.AllTests
java junit.awtui.TestRunner junit.samples.AllTests
java junit.swingui.TestRunner junit.samples.AllTests
java junit.samples.AllTests
main方法中一般也都是簡單地用Runner調(diào)用suite(),當沒有main時,TestRunner自己以運行的類為參數(shù)生成了一個TestSuite.
對于命令模式的運行,有兩種方法。
靜態(tài)方法
TestCase test= new MoneyTest("simple add") {
public void runTest() {
testSimpleAdd();
}
};
動態(tài)方法
TestCase test= new MoneyTest("testSimpleAdd");
我試了一下,好象有問題,哪位朋友成功了,請指點我一下。確實可以。
import junit.framework.*;
public class MoneyTest extends TestCase {//TestCase的子類
private Money f12CHF;//提取公用的對象
private Money f14CHF;
public MoneyTest(String name){
super(name);
}
protected void setUp() {//初始化公用對象
f12CHF= new Money(12, "CHF");
f14CHF= new Money(14, "CHF");
}
public void testEquals() {//測試equals方法的正確性
Assert.assertTrue(!f12CHF.equals(null));
Assert.assertEquals(f12CHF, f12CHF);
Assert.assertEquals(f12CHF, new Money(12, "CHF"));
Assert.assertTrue(!f12CHF.equals(f14CHF));
}
public void testAdd() {//測試add方法的正確性
Money expected= new Money(26, "CHF");
Money result= f12CHF.add(f14CHF);
Assert.assertTrue(expected.equals(result));
}
// public static void main(String[] args) {
// TestCase test=new MoneyTest("simple add") {
// public void runTest() {
// testAdd();
// }
// };
// junit.textui.TestRunner.run(test);
// }
public static void main(String[] args) {
TestCase test=new MoneyTest("testAdd");
junit.textui.TestRunner.run(test);
}
}
再給一個靜態(tài)方法用集成測試的例子:
public static Test suite() {
TestSuite suite= new TestSuite();
suite.addTest(
new testCar("getWheels") {
protected void runTest() { testGetWheels(); }
}
);
suite.addTest(
new testCar("getSeats") {
protected void runTest() { testGetSeats(); }
}
);
return suite;
}
5、應(yīng)用案例
Junit Primer例程,運行如下:
java com.hedong.JunitLearning.Primer.ShoppingCartTest
Ant+Junit+Mailto實現(xiàn)自動編譯、調(diào)試并發(fā)送結(jié)果的build.xml
JUnit實施,寫得很棒,理解也深刻。例程運行如下:
java com.hedong.JunitLearning.car.testCarNoJunit
java junit.swingui.TestRunner com.hedong.JunitLearning.car.testCar
Junit與log4j結(jié)合,阿菜的例程運行:
cd acai
ant junit
6、一些問題
有人在實踐基礎(chǔ)上總結(jié)出一些非常有價值的使用技巧,我沒有經(jīng)過一一“測試”,暫列在此。
不要用TestCase的構(gòu)造函數(shù)初始化Fixture,而要用setUp()和tearDown()方法。
不要依賴或假定測試運行的順序,因為JUnit利用Vector保存測試方法。所以不同的平臺會按不同的順序從Vector中取出測試方法。不知3.8中是不是還是如此,不過它提供的例子有一個是指定用VectorSuite的,如果不指定呢?
避免編寫有副作用的TestCase。例如:如果隨后的測試依賴于某些特定的交易數(shù)據(jù),不要提交交易數(shù)據(jù)。簡單的回滾可以了。
當繼承一個測試類時,記得調(diào)用父類的setUp()和tearDown()方法。
將測試代碼和工作代碼放在一起,一邊同步編譯和更新。(使用Ant中有支持junit的task.)
測試類和測試方法應(yīng)該有一致的命名方案。如在工作類名前加上test從而形成測試類名。
確保測試與時間無關(guān),不要依賴使用過期的數(shù)據(jù)進行測試。導致在隨后的維護過程中很難重現(xiàn)測試。
如果你編寫的軟件面向國際市場,編寫測試時要考慮國際化的因素。不要僅用母語的Locale進行測試。
盡可能地利用JUnit提供地assert/fail方法以及異常處理的方法,可以使代碼更為簡潔。
測試要盡可能地小,執(zhí)行速度快。
把測試程序建立在與被測對象相同的包中
在你的原始代碼目錄中避免測試碼出現(xiàn),可在一個源碼鏡像目錄中放測試碼
在自己的應(yīng)用程序包中包含一個TestSuite測試類
7、相關(guān)資源下載
以下jar包,我只是做了打包、編譯和調(diào)試的工作,供下載學習之用,相關(guān)的權(quán)利屬于原作者。
可運行例程.jar
Build.xml
阿菜的例程
Junit API 漢譯(pdf)
8、未完成的任務(wù)
httpunit
cactus
將Junit用鏈接池測試