您的位置:軟件測試 > 開源軟件測試 > 開源單元測試工具 > junit
用JUnit測試Java類
作者:網(wǎng)絡(luò)轉(zhuǎn)載 發(fā)布時(shí)間:[ 2014/2/26 11:54:58 ] 推薦標(biāo)簽:Java類 JUnit測試 單元測試

輸入下述內(nèi)容作為TestCase子類的main方法:
public static void main(String[] argv) {
  junit.textui.TestRunner.run(suite());
}

如果你需要的話,用junit.awtui.TestRunner或junit.swingui.TestRunner代替junit.textui.TestRunner。

方便起見,示例文件中提供了CalculatorTest類的另一個版本CalculatorTest.java.v3,它包含suite方法和前面描述的main方法,當(dāng)然,你在使用之前需要把它改名為CalculatorTest.java。如果你使用的環(huán)境是Linux,或者是Cygwin在Windows下模擬的UNIX,你可以用diff命令查看不同版本之間的差別,這在學(xué)習(xí)新東西時(shí)通常很有用。例如,輸入diff CalculatorTest.java.v2 CalculatorTest.java.v3可以查看CalculatorTest.java.v2和CalculatorTest.java.v3之間的區(qū)別。

編譯新的CalculatorTest類之后,可以運(yùn)行了。這次不必輸入java junit.textui.TestRunner CalculatorTest,可以用java CalculatorTest代替。
十、在程序和測試中添加功能(Adding Functionality to Your Application and to Your Test)

現(xiàn)在假如說你要在FactorCalculator中添加功能。測試驅(qū)動的開發(fā)方式建議你首先增加測試,驗(yàn)證測試失敗,(代碼還沒寫當(dāng)然失敗,譯者注。)然后再編寫新功能的代碼,并確保測試通過。現(xiàn)在假如你要增加一個求大公約數(shù)的方法,名字叫“gcd”。(此處省略20字,譯者注)可以用下面三條驗(yàn)證:6和4的大公約數(shù)是2。36和18的大公約數(shù)是18。30和75的大公約數(shù)是15。

剛才那些都是正常的例子。除此之外,你還應(yīng)該測試邊緣和錯誤的情況,例如gcd(2, 1)和gcd(3, -1)。下面的代碼可以做這些測試:

程序列表 5:

public void testGcd() {
  assertEquals("bad value for gcd(6, 4)", 2, calc.gcd(6, 4));
  assertEquals("bad value for gcd(36, 18)", 18, calc.gcd(36, 18));
  assertEquals("bad value for gcd(30, 75)", 15, calc.gcd(30, 75));
  assertEquals("bad value for gcd(2, 1)", 1, calc.gcd(2, 1));
  try {
    calc.gcd(3, -1);
    fail("gcd should throw exception for when either argument is less than 1");
  } catch (IllegalArgumentException e) {
    // do nothing because throwing IAE is the proper action
  }
}

把程序列表5中的代碼添加到CalculatorTest.java。如果你不想敲鍵盤,你可以從示例代碼中拷貝CalculatorTest.java.v4,把名字改成CalculatorTest.java。

為了讓CalculatorTest能編譯,需要在FactorCalculator中添加一個stub,你在CalculatorTest中調(diào)用了gcd方法,你必須在FactorCalculator中定義gcd方法。把下述內(nèi)容加到FactorCalculator中:

public int gcd(int a, int b) {
  return 1;
}

如果你不想敲鍵盤,你可以從示例代碼中拷貝FactorCalculator.java.v3,把名字改成FactorCalculator.java。

很明顯,大部分情況下上面的gcd方法都返回錯誤結(jié)果,但測試驅(qū)動的開發(fā)方式信奉“先讓它出錯,然后再糾正它”( "errors first, then correction of errors")為有效的開發(fā)模式。測試代碼和其它代碼一樣,也可能出錯。有可能你的測試代碼不能發(fā)現(xiàn)程序中的錯誤。如果你在開發(fā)程序功能前編寫測試代碼,你可以確保測試正確發(fā)現(xiàn)錯誤,因此減少錯誤被疏漏的機(jī)會。

輸入javac *.java編譯FactorCalculator和CalculatorTest類。在編譯和運(yùn)行時(shí)都需要確保JUnit庫在classpath中。輸入java CalculatorTest。你將看到下面的輸出:

....F
Time: 0.01
There was 1 failure:
1) testGcd(CalculatorTest)junit.framework.AssertionFailedError: bad value for gcd(6, 4) expected:<2> but was:<1>
        at CalculatorTest.testGcd(CalculatorTest.java:125)
        ...
        at CalculatorTest.main(CalculatorTest.java:14)

FAILURES!!!
Tests run: 4,  Failures: 1,  Errors: 0

開始測試失敗了,這是意料之中的結(jié)果,也正是我們想要的。如果它不失敗,那意味著測試的設(shè)計(jì)或?qū)崿F(xiàn)出了問題。JUnit會把你給它的信息顯示出來,所以應(yīng)該寫有意義的錯誤信息,F(xiàn)在修復(fù)FactorCalculator類,讓它通過測試。刪除FactorCalculator類gcd方法中的“return 1;”一行,用下面的代碼代替:

程序列表6 (functional implementation of gcd method):

int gcd = 1;
int smallerInt = (a < b) ? a : b;
for(int i = smallerInt; i > 1; i--) {
  if (isDivisor(a, i) && isDivisor(b, i)) {
    gcd = i;
    break;
  }
}
return gcd;


如果你不想敲鍵盤,你可以從示例代碼中拷貝FactorCalculator.java.v4,把名字改成FactorCalculator.java。

輸入javac FactorCalculator.java重新編譯javac FactorCalculator。輸入java CalculatorTest重跑測試。你仍然得到錯誤,因?yàn)閰?shù)錯誤時(shí)gcd方法沒有拋出異常。調(diào)用gcd(3, -1)應(yīng)該產(chǎn)生一個IllegalArgumentException,但事實(shí)上沒有。把下面的代碼加到gcd方法的前面可以解決這個問題。

if ((a < 1) || (b < 1)) {
  throw new IllegalArgumentException();
}

修改后的FactorCalculator是示例代碼中的FactorCalculator.java.v5,你可以更名為FactorCalculator.java。重新編譯FactorCalculator.java后運(yùn)行測試。一切正常,測試通過,狀態(tài)報(bào)告類似:

....
Time: 0.008

OK (4 tests)

十一、總結(jié)(Conclusion)

現(xiàn)在你已經(jīng)知道如何用JUnit進(jìn)行單元測試了,在你自己的代碼中進(jìn)行試驗(yàn)吧,親身體會一下程序測試的好處。

現(xiàn)在準(zhǔn)備進(jìn)入測試驅(qū)動開發(fā)系列的下一章。下一章,也是五個部分中的第三部分,將帶你進(jìn)入如何在EJB容器中測試服務(wù)器端EJB組件的操作細(xì)節(jié)。

上一頁1234567下一頁
軟件測試工具 | 聯(lián)系我們 | 投訴建議 | 誠聘英才 | 申請使用列表 | 網(wǎng)站地圖
滬ICP備07036474 2003-2017 版權(quán)所有 上海澤眾軟件科技有限公司 Shanghai ZeZhong Software Co.,Ltd