JUnit学习摘要+入门实例 (junit4)
http://www.cnblogs.com/xwdreamer/archive/2012/03/29/2423136.html
1.學(xué)習(xí)摘要
看《重構(gòu)-改善既有代碼的設(shè)計(jì)》這本書的時(shí)候,里面提到測(cè)試環(huán)境對(duì)于重構(gòu)的重要性,想到之前在編寫代碼的時(shí)候都是通過System.out和alert來做測(cè)試,非常麻煩,而且不夠正規(guī),對(duì)于即將步入工作的人來說,一個(gè)正規(guī)的寫代碼習(xí)慣和測(cè)試習(xí)慣是非常重要的,因此我覺得好好學(xué)學(xué)如何使用JUnit。
在JUnit和單元測(cè)試入門簡(jiǎn)介一文中提到“JUnit框架是一個(gè)典型的Composite模式:TestSuite可以容納任何派生自Test的對(duì)象;當(dāng)調(diào)用TestSuite對(duì)象的run()方法是,會(huì)遍歷自己容納的對(duì)象,逐個(gè)調(diào)用它們的run()方法”。
這又讓我想起自己前段時(shí)間在讀的《研磨設(shè)計(jì)模式》這本書,讀了前面的九章,寫了一些博客,但是還沒有整理,不過大多也忘了。可能自己沒有真正理解吧。其實(shí),一時(shí)的理解,如果沒有在實(shí)際項(xiàng)目中應(yīng)用,還是很容易遺忘的。希望自己能在重構(gòu)項(xiàng)目的時(shí)候多用一些設(shè)計(jì)模式上的內(nèi)容。《研磨設(shè)計(jì)模式》這本書中的第15章講的就是組合模式(Composite),有空了就去看一看。
在使用eclipse進(jìn)行junit的時(shí)候,添加junit包才發(fā)現(xiàn)有junit3和junit4兩個(gè)版本,這兩者的區(qū)別可以參考JUnit測(cè)試框架之JUnit3和JUnit4使用區(qū)別的總結(jié)。
2.入門實(shí)例
步驟1:創(chuàng)建待測(cè)試類
首先新建一個(gè)項(xiàng)目叫JUnit_Test,我們編寫一個(gè)Calculator類,這是一個(gè)能夠簡(jiǎn)單實(shí)現(xiàn)加減乘除、平方、開方的計(jì)算器類,然后對(duì)這些功能進(jìn)行單元測(cè)試。這個(gè)類并不是很完美,我們故意保留了一些Bug用于演示,這些Bug在注釋中都有說明。該類代碼如下:
package xw.calculator; public class Calculator {private static int result; // 靜態(tài)變量,用于存儲(chǔ)運(yùn)行結(jié)果 public void add(int n) {result = result + n;}public void substract(int n) {result = result - 1; // Bug: 正確的應(yīng)該是 result =result-n }public void multiply(int n) {} // 此方法尚未寫好 public void divide(int n) {result = result / n;}public void square(int n) {result = n * n;}public void squareRoot(int n) {for (;;); // Bug : 死循環(huán) }public void clear() { // 將結(jié)果清零 result = 0;}public int getResult() {return result;} }步驟2:在eclipse中為項(xiàng)目添加JUnit環(huán)境
右鍵JUnit_Test項(xiàng)目,在build path中“add library”,添加JUnit,如下圖所示:
步驟3:創(chuàng)建測(cè)試類
右鍵Calculator類,選擇“new",創(chuàng)建JUnit Test Case
步驟4:修改測(cè)試用例代碼
測(cè)試用例代碼如下:
package xw.calculatortest; import static org.junit.Assert.*;import org.junit.Before; import org.junit.Ignore; import org.junit.Test;import xw.calculator.Calculator;public class CalculatorTest {private static Calculator calculator = new Calculator();// 復(fù)原操作,表明對(duì)每個(gè)Test方法測(cè)試以后都會(huì)進(jìn)行這個(gè)方法操作。 @Beforepublic void setUp() throws Exception {calculator.clear();// 結(jié)果清零 }@Testpublic void testAdd() {// fail("Not yet implemented"); calculator.add(2);calculator.add(3);assertEquals(5, calculator.getResult());}@Testpublic void testSubstract() {// fail("Not yet implemented"); calculator.add(10);calculator.substract(2);assertEquals(8, calculator.getResult());}// 忽略標(biāo)注,表明這個(gè)方法功能還沒有實(shí)現(xiàn) @Ignore("Multiply() Not yet implemented")@Testpublic void testMultiply() {fail("Not yet implemented");}@Testpublic void testDivide() {// fail("Not yet implemented"); calculator.add(8);calculator.divide(2);assertEquals(4, calculator.getResult());}// Timeout參數(shù)表明了你要設(shè)定的時(shí)間,單位為毫秒,因此1000就代表1秒。 @Test(timeout = 1000)public void squareRoot() {calculator.squareRoot(4);assertEquals(2, calculator.getResult());}/*** square1/square2/square3分別用來測(cè)試正數(shù),0,復(fù)數(shù)的平方*/@Testpublic void square1() {calculator.square(2);assertEquals(4, calculator.getResult());}@Testpublic void square2() {calculator.square(0);assertEquals(0, calculator.getResult());}@Testpublic void square3() {calculator.square(-3);assertEquals(9, calculator.getResult());} }參數(shù)化測(cè)試與運(yùn)行器(Runner)
考慮一種場(chǎng)景,如果要單獨(dú)測(cè)試正數(shù)的平方,0的平方以及負(fù)數(shù)的平方,那么就要?jiǎng)?chuàng)建三個(gè)測(cè)試方法來進(jìn)行測(cè)試,這樣會(huì)顯得特別繁瑣,如步驟4中最后的三個(gè)測(cè)試方法square1()、square2()和square3()。JUnit考慮到了這種情況,提出了參數(shù)化測(cè)試方法。這個(gè)時(shí)候運(yùn)行器也不是默認(rèn)的運(yùn)行器,而是通過@RunWith(Parameterized.class)來標(biāo)注。
參數(shù)化測(cè)試代碼如下所示;
package xw.calculatortest; import static org.junit.Assert.*; import java.util.Arrays; import java.util.Collection; import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; import org.junit.runners.Parameterized; import org.junit.runners.Parameterized.Parameters; import xw.calculator.Calculator; @RunWith(Parameterized.class) public class SquareTest {private static Calculator calculator = new Calculator();private int param;private int result;@Parameterspublic static Collection data() {//定義測(cè)試數(shù)據(jù)的集合 return Arrays.asList(new Object[][] { { 2, 4 }, { 0, 0 }, { -3, 9 }, });}// 構(gòu)造函數(shù),對(duì)變量進(jìn)行初始化,參數(shù)的順序與數(shù)據(jù)集成的順序相關(guān) public SquareTest(int param, int result) {this.param = param;this.result = result;}// 復(fù)原操作,表明對(duì)每個(gè)Test方法測(cè)試以后都會(huì)進(jìn)行這個(gè)方法操作。 @Beforepublic void setUp() throws Exception {calculator.clear();// 結(jié)果清零 }@Testpublic void testSquare() {calculator.square(param);assertEquals(result, calculator.getResult());} }打包測(cè)試
考慮另外一種場(chǎng)景,如果一個(gè)項(xiàng)目中有許多個(gè)測(cè)試類,一個(gè)一個(gè)去運(yùn)行會(huì)非常繁瑣,這個(gè)時(shí)候就可以考慮使用打包測(cè)試。將所有需要運(yùn)行的測(cè)試類集中起來,一次性的運(yùn)行完畢,大大的方便了我們的測(cè)試工作。
右鍵Calculator類,新建一個(gè)JUnit Test Suite,如下圖所示。
然后選擇需要打包測(cè)試的測(cè)試類,如下圖所示:
打包測(cè)試類叫做AllTests,需要打包測(cè)試的三個(gè)測(cè)試類是CalculatorTest,SquareTest和test。點(diǎn)擊Finish完成打包測(cè)試,生成的打包測(cè)試類大嗎如下:
package xw.calculatortest;import org.junit.runner.RunWith; import org.junit.runners.Suite; import org.junit.runners.Suite.SuiteClasses;@RunWith(Suite.class) @SuiteClasses({ CalculatorTest.class, SquareTest.class, test.class }) public class AllTests {}運(yùn)行結(jié)果如下:
?
?
總結(jié)
以上是生活随笔為你收集整理的JUnit学习摘要+入门实例 (junit4)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Hibernate 笔记 HQL查询
- 下一篇: JUNIT基本教程