JUnit學習摘要+入門執行個體

來源:互聯網
上載者:User
文章目錄
  • 步驟1:建立待測試類別
  • 步驟2:在eclipse中為項目添加JUnit環境
  • 步驟3:建立測試類別
  • 步驟4:修改測試案例代碼
1.學習摘要

  看《重構-改善既有代碼的設計》這本書的時候,裡面提到測試環境對於重構的重要性,想到之前在編寫代碼的時候都是通過System.out和alert來做測試,非常麻煩,而且不夠正規,對於即將步入工作的人來說,一個正規的寫代碼習慣和測試習慣是非常重要的,因此我覺得好好學學如何使用JUnit。

  在JUnit和單元測試入門簡介一文中提到“JUnit架構是一個典型的Composite模式:TestSuite可以容納任何派生自Test的對象;當調用TestSuite對象的run()方法是,會遍曆自己容納的對象,逐個調用它們的run()方法”。

  這又讓我想起自己前段時間在讀的《研磨設計模式》這本書,讀了前面的九章,寫了一些部落格,但是還沒有整理,不過大多也忘了。可能自己沒有真正理解吧。其實,一時的理解,如果沒有在實際項目中應用,還是很容易遺忘的。希望自己能在重構項目的時候多用一些設計模式上的內容。《研磨設計模式》這本書中的第15章講的就是組合模式(Composite),有空了就去看一看。

  在使用eclipse進行junit的時候,添加junit包才發現有junit3和junit4兩個版本,這兩者的區別可以參考JUnit測試架構之JUnit3和JUnit4使用區別的總結。

2.入門執行個體步驟1:建立待測試類別

首先建立一個項目叫JUnit_Test,我們編寫一個Calculator類,這是一個能夠簡單實現加減乘除、平方、開方的計算機類,然後對這些功能進行單元測試。這個類並不是很完美,我們故意保留了一些Bug用於示範,這些Bug在注釋中都有說明。該類代碼如下:

package xw.calculator;
public class Calculator {

private static int result; // 靜態變數,用於儲存運行結果
public void add(int n) {
result = result + n;
}
public void substract(int n) {
result = result - 1; // Bug: 正確的應該是 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 : 死迴圈
}

public void clear() { // 將結果清零
result = 0;
}

public int getResult() {
return result;
}
}
步驟2:在eclipse中為項目添加JUnit環境

右鍵JUnit_Test項目,在build path中“add library”,添加JUnit,如所示:

步驟3:建立測試類別

右鍵Calculator類,選擇“new",建立JUnit Test Case

步驟4:修改測試案例代碼

測試案例代碼如下:

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();

// 複原操作,表明對每個Test方法測試以後都會進行這個方法操作。
@Before
public void setUp() throws Exception {
calculator.clear();// 結果清零
}

@Test
public void testAdd() {
// fail("Not yet implemented");
calculator.add(2);
calculator.add(3);
assertEquals(5, calculator.getResult());
}

@Test
public void testSubstract() {
// fail("Not yet implemented");
calculator.add(10);
calculator.substract(2);
assertEquals(8, calculator.getResult());
}

// 忽略標註,表明這個方法功能還沒有實現
@Ignore("Multiply() Not yet implemented")
@Test
public void testMultiply() {
fail("Not yet implemented");
}

@Test
public void testDivide() {
// fail("Not yet implemented");
calculator.add(8);
calculator.divide(2);
assertEquals(4, calculator.getResult());
}

// Timeout參數表明了你要設定的時間,單位為毫秒,因此1000就代表1秒。
@Test(timeout = 1000)
public void squareRoot() {
calculator.squareRoot(4);
assertEquals(2, calculator.getResult());

}

/**
* square1/square2/square3分別用來測試正數,0,複數的平方
*/
@Test
public void square1() {
calculator.square(2);
assertEquals(4, calculator.getResult());
}

@Test
public void square2() {
calculator.square(0);
assertEquals(0, calculator.getResult());
}

@Test
public void square3() {
calculator.square(-3);
assertEquals(9, calculator.getResult());
}
}
參數化測試與運行器(Runner)

考慮一種情境,如果要單獨測試正數的平方,0的平方以及負數的平方,那麼就要建立三個測試方法來進行測試,這樣會顯得特別繁瑣,如步驟4中最後的三個測試方法square1()、square2()和square3()。JUnit考慮到了這種情況,提出了參數化測試方法。這個時候運行器也不是預設的運行器,而是通過@RunWith(Parameterized.class)來標註。

參數化測試代碼如下所示;

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;

@Parameters
public static Collection data() {//定義測試資料的集合
return Arrays.asList(new Object[][] { { 2, 4 }, { 0, 0 }, { -3, 9 }, });
}

// 建構函式,對變數進行初始化,參數的順序與Data Integration的順序相關
public SquareTest(int param, int result) {
this.param = param;
this.result = result;
}

// 複原操作,表明對每個Test方法測試以後都會進行這個方法操作。
@Before
public void setUp() throws Exception {
calculator.clear();// 結果清零
}

@Test
public void testSquare() {
calculator.square(param);
assertEquals(result, calculator.getResult());
}
}
打包測試

考慮另外一種情境,如果一個項目中有許多個測試類別,一個一個去運行會非常繁瑣,這個時候就可以考慮使用打包測試。將所有需要啟動並執行測試類別集中起來,一次性的運行完畢,大大的方便了我們的測試工作。

右鍵Calculator類,建立一個JUnit Test Suite,如所示。

然後選擇需要打包測試的測試類別,如所示:

打包測試類別叫做AllTests,需要打包測試的三個測試類別是CalculatorTest,SquareTest和test。點擊Finish完成打包測試,產生的打包測試類別大嗎如下:

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 {

}

運行結果如下:

 


 

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.