您的位置:軟件測(cè)試 > 開(kāi)源軟件測(cè)試 > 開(kāi)源單元測(cè)試工具 > junit
JUnit單元測(cè)試框架的使用
作者:java_阿杰 發(fā)布時(shí)間:[ 2016/10/9 14:04:50 ] 推薦標(biāo)簽:單元測(cè)試 Junit

  我們寫(xiě)單元測(cè)試,一般都會(huì)用到一個(gè)或多個(gè)單元測(cè)試框架,在這里,我們介紹一下JUnit4這個(gè)測(cè)試框架。這是Java界用的廣泛,也是基礎(chǔ)的一個(gè)框架,其他的很多框架,包括我們后面會(huì)看到的Robolectric,都是基于或兼容JUnit4的。然而首先要解決的問(wèn)題是。。。
  為什么要使用單元測(cè)試框架呢
  或者換句話(huà)說(shuō),單元測(cè)試框架能夠?yàn)槲覀冏鍪裁茨兀繌幕镜拈_(kāi)始說(shuō)起,假如我們有這樣一個(gè)類(lèi):
public class Calculator {
public int add(int one, int another) {
// 為了簡(jiǎn)單起見(jiàn),暫不考慮溢出等情況。
return one + another;
}
public int multiply(int one, int another) {
// 為了簡(jiǎn)單起見(jiàn),暫不考慮溢出等情況。
return one * another;
}
}
  如果不用單元測(cè)試框架的話(huà),我們要怎么寫(xiě)測(cè)試代碼呢?我們恐怕得寫(xiě)出下面這樣的代碼:
public class CalculatorTest {
public static void main(String[] args) {
Calculator calculator = new Calculator();
int sum = calculator.add(1, 2);
if(sum == 3) {
System.out.println("add() works!")
} else {
System.out.println("add() does not works!")
}
int product = calculator.multiply(2, 4);
if (product == 8) {
System.out.println("multiply() works!")
} else {
System.out.println("multiply() does not works!")
}
}
}
  然后我們?cè)偻ㄟ^(guò)某種方式,比如命令行或IDE,運(yùn)行這個(gè) CalculatorTest 的 main 方法,在看著terminal的輸出,才知道測(cè)試是通過(guò)還是失敗。想想一下,如果我們有很多的類(lèi),每個(gè)類(lèi)都有很多方法,那么要寫(xiě)一堆這樣的代碼,每個(gè)類(lèi)對(duì)于一個(gè)含有 main 方法的test類(lèi),同時(shí) main 方法里面會(huì)有一堆代碼。這樣既寫(xiě)起來(lái)痛苦,跑起來(lái)更痛苦,比如說(shuō),你怎么樣一次性跑所有的測(cè)試類(lèi)呢?所以,一個(gè)測(cè)試框架為我們做的基本的事情,是允許我們按照某種更簡(jiǎn)單的方式寫(xiě)測(cè)試代碼,把每一個(gè)測(cè)試單元寫(xiě)在一個(gè)測(cè)試方法里面,然后它會(huì)自動(dòng)找出所有的測(cè)試方法,并且根據(jù)你的需要,運(yùn)行所有的測(cè)試方法,或者是運(yùn)行單個(gè)測(cè)試方法,或者是運(yùn)行部分測(cè)試方法等等。
  對(duì)于上面的 Calculator 例子,如果使用Junit的話(huà),我們可以按照如下的方式寫(xiě)測(cè)試代碼:
public class CalculatorTest {
@Test
public void testAdd() throws Exception {
Calculator calculator = new Calculator();
int sum = calculator.add(1, 2);
Assert.assertEquals(3, sum);
}
@Test
public void testMultiply() throws Exception {
Calculator calculator = new Calculator();
int product = calculator.multiply(2, 4);
Assert.assertEquals(8, product);
}
}
  每一個(gè)被測(cè)試的方法( add(), multiply() ),寫(xiě)一個(gè)對(duì)應(yīng)的測(cè)試方法( testAdd(), testMultiply() )。那JUnit怎么知道那些是測(cè)試方法,哪些不是呢?這個(gè)是通過(guò)前面的 @Test 注解來(lái)標(biāo)志的,只要有這個(gè)注解,JUnit4會(huì)當(dāng)做是一個(gè)測(cè)試方法,方法名其實(shí)是可以隨意起的。當(dāng)然,名字還是應(yīng)該起的更有可讀性一點(diǎn),讓人一看知道,這個(gè)測(cè)試方法是測(cè)試了被測(cè)的類(lèi)的那個(gè)方法,或者是測(cè)試了那個(gè)功能點(diǎn)等等。
  除了幫我們找出所有的測(cè)試方法,并且方便運(yùn)行意外,單元測(cè)試框架還幫我們做了其他事情。在 這個(gè)系列的第一篇文章 中我們提到,一個(gè)測(cè)試方法主要包括三個(gè)部分:
  1、setup
  2、執(zhí)行操作
  3、驗(yàn)證結(jié)果
  而一個(gè)單元測(cè)試框架,可以讓我們更方便的寫(xiě)上面的每一步的代碼,尤其是第一步和第三部。比如說(shuō),在上面的 CalculatorTest 中, testAdd() 和 testMultiply() 都有相同的setup: Calculator calculator = new Calculator(); ,如果 Calculator 還有其他的方法的話(huà),這行代碼得重復(fù)更多次,這種duplication是沒(méi)必要的。絕大多數(shù)單元測(cè)試框架考慮到了這一點(diǎn),它們知道一個(gè)測(cè)試類(lèi)的很多測(cè)試方法可能需要相同的setup,所以為我們提供了便捷方法。對(duì)于JUnit4,是通過(guò) @Before 來(lái)實(shí)現(xiàn)的:
public class CalculatorTest {
Calculator mCalculator;
@Before
public void setup() {
mCalculator = new Calculator();
}
@Test
public void testAdd() throws Exception {
int sum = mCalculator.add(1, 2);
assertEquals(3, sum);  //為了簡(jiǎn)潔,往往會(huì)static import Assert里面的所有方法。
}
@Test
public void testMultiply() throws Exception {
int product = mCalculator.multiply(2, 4);
assertEquals(8, product);
}
}

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