通過(guò)方法名assertXxx你可以讓JUnit知道你想要的結(jié)果,其中Xxx是True、Fase、Equals或者其它條件。JUnit記錄assertXxx方法的通過(guò)/失敗狀態(tài),并在執(zhí)行完所有測(cè)試后反饋給你。這兒是一些JUnit中有簽名和操作描述的斷言(assert)方法:
assertTrue(String errorMessage, boolean booleanExpression): 檢查booleanExpression值是否為true。如果不是,把errorMessage添加到錯(cuò)誤報(bào)告的顯示列表中。
assertFalse(String errorMessage, boolean booleanExpression): 檢查booleanExpression值是否為false。如果不是,把errorMessage添加到錯(cuò)誤報(bào)告的顯示列表中。
assertEquals(String errorMessage, Object a, Object b): 檢查對(duì)象a是否等于對(duì)象b,通過(guò)equals方法,如果不是,把errorMessage添加到錯(cuò)誤報(bào)告的顯示列表中。對(duì)象a是期望值,對(duì)象b是要測(cè)試的程序?qū)嶋H返回的值。
assertNull(String errorMessage, Object o): 檢查對(duì)象o是否為null。如果不是,把errorMessage添加到錯(cuò)誤報(bào)告的顯示列表中。
要查看所有斷言方法的完整列表,請(qǐng)參考Assert類的javadoc文檔(http://www.junit.org/junit/javadoc/index.htm)。
你可以在整個(gè)測(cè)試代碼中隨意使用assertXxx語(yǔ)句,來(lái)確認(rèn)你要測(cè)的代碼中某個(gè)條件結(jié)果為true(或者false,視情況而定)。
五、指定要運(yùn)行的測(cè)試(Specifying Which Tests to Run)
要運(yùn)行你的測(cè)試,你需要:
一個(gè)TestRunner類的實(shí)例。
一個(gè)測(cè)試類(例如本例的MyTestClass類)的實(shí)例,它包含你要運(yùn)行的測(cè)試的。這個(gè)類必須繼承junit.framework.TestCase。
告訴這個(gè)TestRunner實(shí)例你的MyTestClass實(shí)例中哪些測(cè)試要運(yùn)行的途徑。
創(chuàng)建TestRunner的實(shí)例和指定MyTestClass實(shí)例非常容易,你可以通過(guò)下面的命令:
java junit.textui.TestRunner MyTestClass
對(duì)別的UI可以用其相應(yīng)的TestRunner代替junit.textui.TestRunner,例如AWT的junit.awtui.TestRunner和Swing的junit.swingui.TestRunner。你還要用你自己的測(cè)試類的名字替換MyTestClass。
有兩種途徑可以讓TestRunner知道你要運(yùn)行MyTestClass類中的哪些測(cè)試。一個(gè)是顯式途徑,一個(gè)是默認(rèn)途徑。在MyTestClass中,你可以選擇是否包含一個(gè)public static方法suite,這個(gè)方法沒(méi)有任何參數(shù),返回Test對(duì)象。更準(zhǔn)確地說(shuō),它返回一個(gè)實(shí)現(xiàn)Test接口的對(duì)象,因?yàn)門(mén)est是接口,不是類。大多數(shù)時(shí)候你都使用TestSuite和你自己的TestCase子類,TestSuite和TestCase都實(shí)現(xiàn)了Test接口。
如果你在MyTestClass方法中省略了suite方法,那么TestRunner通過(guò)reflection機(jī)制找到MyTestClass類中所有以“test”為前綴命名的方法,并運(yùn)行它們。這是通知TestRunner要運(yùn)行哪些測(cè)試的默認(rèn)途徑。
如果你在MyTestClass中實(shí)現(xiàn)了suite方法,TestRunner調(diào)用suite方法,通過(guò)suite方法返回的Test對(duì)象,TestRunner獲悉它要進(jìn)行的測(cè)試。這是顯式途徑。TestCase和TestSuite類都實(shí)現(xiàn)Test接口,意味著你可以只返回一個(gè)TestCase,也可以返回一個(gè)包含0到多個(gè)TestCase/TestSuite的TestSuite,這樣可以進(jìn)行多個(gè)測(cè)試和層次測(cè)試。
在junit.framework.TestCase中指定要運(yùn)行的測(cè)試
在TestCase中有兩種方式可以指定測(cè)試方法:一個(gè)靜態(tài)一個(gè)動(dòng)態(tài)。靜態(tài)方法是重TestCase的runTest方法,在其中調(diào)用你的測(cè)試。例如:
import junit.framework.TestCase;
public class MySimpleTest extends TestCase {
public MySimpleTest(String name) {
super(name);
}
public void runTest() {
testTurnLeft();
}
public void testTurnLeft() {
... code here ...
}
}
有時(shí)簡(jiǎn)單靈活的重載TestCase.runTest的方式是用一個(gè)匿名內(nèi)部類。下面的代碼描述了這種方式:
TestCase testCase = new MySimpleTest("myNameForTurnLeft") {
public void runTest() {
testTurnLeft();
}
}
匿名內(nèi)部類讓你在實(shí)例化test類的類中重載runTest,這樣在不同的地方可以有不同的runTest實(shí)現(xiàn),它們都使用MySimpleTest作為實(shí)際的測(cè)試方法。如果你在test類的suite方法中初始化它自己,這個(gè)初始化test類的類是它自己。
通過(guò)構(gòu)造器的name參數(shù)可以在TestCase中動(dòng)態(tài)指定測(cè)試方法。對(duì)上面的MySimpleTest類,你可以寫(xiě)成:
TestCase testCase = new MySimpleTest("testTurnLeft");
因?yàn)槟銢](méi)有重載runTest,TestCase類的默認(rèn)實(shí)現(xiàn)將通過(guò)reflection找到方法testTurnLeft。你可以用任何你喜歡的名字代替“testTurnLeft”。
六、用junit.framework.TestSuite指定多層測(cè)試(Specifying a Hierarchy of Tests to Run With junit.framework.TestSuite)
TestSuite類可以把多個(gè)測(cè)試打包成一組;拘问饺缦拢
TestSuite testSuite = new TestSuite();
testSuite.addTest(new MySimpleTest("testTurnLeft"));
testSuite.addTest(new CalculatorTest("testIsDivisor"));
testSuite.addTest(new TestSuite(MyThirdTest.class));
前兩個(gè)addTest方法是直接調(diào)用。TestSuite.addTest方法接受實(shí)現(xiàn)Test接口的對(duì)象作參數(shù)。MySimpleTest和CalculatorTest類都是TestCase的子類,而TestCase實(shí)現(xiàn)Test接口。通過(guò)前兩個(gè)addTest方法,你只是把兩個(gè)測(cè)試方法添加到TestSuite實(shí)例要執(zhí)行的測(cè)試列表中。
第三個(gè)addTest調(diào)用描述如何通過(guò)在TestSuite實(shí)例中包含TestSuite實(shí)例來(lái)創(chuàng)建層次測(cè)試。TestSuite類實(shí)現(xiàn)Test接口,所以可以作為addTest方法的參數(shù)。第三個(gè)addTest調(diào)用中,新的TestSuite對(duì)象包含MyThirdTest類所有的testXxx方法。沒(méi)有任何限制要求addTest方法中指定的TestSuite實(shí)例是單層列表,子TestSuite還可以包含子TestSuite。