首頁 >Java >java教程 >Java單元測試中關於JUnit篇的詳解

Java單元測試中關於JUnit篇的詳解

黄舟
黄舟原創
2017-09-30 10:09:241987瀏覽

這篇文章主要介紹了詳解Java單元測試之JUnit篇,小編覺得挺不錯的,現在分享給大家,也給大家做個參考。一起跟著小編過來看看吧

單元測試是寫測試程式碼,應該要準確、快速地保證程式基本模組的正確性。

JUnit是Java單元測試框架,已經在Eclipse中預設安裝。

JUnit4

JUnit4透過註解的方式來辨識測試方法。目前支援的主要註解有:

  • @BeforeClass 全域只會執行一次,而且是第一個執行

  • @Before 在測試方法運行之前運行

  • @Test 測試方法

  • #@After 在測試方法運行之後允許

  • @AfterClass 全域只會執行一次,而且是最後一個執行

  • @Ignore 忽略此方法

##下面基於Eclipse介紹JUnit的基本應用

基本測試

#1.新建一個專案叫JUnitTest,我們寫一個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 pide(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;
  }
}

1.將JUnit4單元測試套件引入這個項目:在該項目上點右鍵,點“屬性”,如圖

在彈出的屬性視窗中,首先在左邊選擇“Java Build Path”,然後到右上選擇“Libraries”標籤,之後在最右邊點擊“Add Library…”按鈕,如下圖所示


#然後在新彈出的對話框中選擇JUnit4並點選確定,如上圖所示,JUnit4軟體包就已經包含進我們這個專案了。

2.產生JUnit測試框架:在Eclipse的Package Explorer中用右鍵點選該類別彈出式選單,選擇「New JUnit Test Case」。如下圖所示:



#點擊「下一步」後,系統會自動列出你這個類別包含的方法,選擇你要進行測試的方法。此例中,我們僅對「加、減、乘、除」四個方法進行測試。

之後系統會自動產生一個新類別CalculatorTest,裡麵包含一些空的測試案例。你只需要將這些測試案例稍作修改即可使用。

 完整的CalculatorTest程式碼如下:


public class CalculatorTest {  
  private static Calculator calculator = new Calculator();

  @Before
  public void setUp() throws Exception {
    calculator.clear();
  }

  @Test
  public void testAdd() {
    calculator.add(3);
    calculator.add(4);
    assertEquals(7, calculator.getResult());

  }

  @Test
  public void testSubstract() {
    calculator.add(8);
    calculator.substract(3);
    assertEquals(5, calculator.getResult());

  }

  @Ignore("Multiply() Not yet implemented")
  @Test
  public void testMultiply() {
    fail("Not yet implemented");
  }

  @Test
  public void testpide() {
    calculator.add(8);
    calculator.pide(2);
    assertEquals(4, calculator.getResult());

  }

}

1.執行測試程式碼:依照上述程式碼修改完畢後,我們在CalculatorTest類別上點右鍵,選擇「Run As a JUnit Test」來執行我們的測試,如下圖所示

#運行結果如下:

進度條是紅顏色表示發現錯誤,具體的測試結果在進度條上面有表示「共進行了4個測試,其中1個測試被忽略,一個測試失敗」。


限時測試

對於那些邏輯很複雜,循環嵌套比較深的程序,很有可能出現死循環,因此一定要採取一些預防措施。限時測試是一個很好的解決方案。我們為這些測試函數設定一個執行時間,超過了這個時間,他們就會被系統強行終止,並且系統還會向你報告該函數結束的原因是因為超時,這樣你就可以發現這些Bug了。要實現這個功能,只需為@Test標註加一個參數即可,程式碼如下:



#

  @Test(timeout = 1000)
  public void squareRoot() {
    calculator.squareRoot(4);
    assertEquals(2, calculator.getResult());
  }

Timeout參數顯示了你要設定的時間,單位為毫秒,因此1000就代表1秒。


#

测试异常

JAVA中的异常处理也是一个重点,因此你经常会编写一些需要抛出异常的函数。那么,如果你觉得一个函数应该抛出异常,但是它没抛出,这算不算Bug呢?这当然是Bug,并JUnit也考虑到了这一点,来帮助我们找到这种Bug。例如,我们写的计算器类有除法功能,如果除数是一个0,那么必然要抛出“除0异常”。因此,我们很有必要对这些进行测试。代码如下:


 @Test(expected = ArithmeticException.class)
 public void pideByZero(){
    calculator.pide(0);
  }

如上述代码所示,我们需要使用@Test标注的expected属性,将我们要检验的异常传递给他,这样JUnit框架就能自动帮我们检测是否抛出了我们指定的异常。

参数化测试

我们可能遇到过这样的函数,它的参数有许多特殊值,或者说他的参数分为很多个区域。

例如,测试一下“计算一个数的平方”这个函数,暂且分三类:正数、0、负数。在编写测试的时候,至少要写3个测试,把这3种情况都包含了,这确实是一件很麻烦的事情。测试代码如下:


  public class AdvancedTest { 
    private static Calculator calculator = new Calculator();
    @Before
    public void clearCalculator(){
      calculator.clear();
    }

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

为了简化类似的测试,JUnit4提出了“参数化测试”的概念,只写一个测试函数,把这若干种情况作为参数传递进去,一次性的完成测试。代码如下:


  @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},
    });
  }

  //构造函数,对变量进行初始化
  public SquareTest(int param, int result){
    this.param = param;
      this.result = result;
  }

  @Test  
  public void square(){
    calculator.square(param);
    assertEquals(result, calculator.getResult());
  }
 }

执行了3次该测试类,依次采用了数据集合中的数据{处理值,预期处理结果},结果如下:

代码分析如下:

  • 为这种测试专门生成一个新的类,而不能与其他测试共用同一个类,此例中我们定义了一个SquareTest类。

  • 为这个类指定一个Runner,而不能使用默认的Runner,@RunWith(Parameterized.class)这条语句就是为这个类指定了一个ParameterizedRunner

  • 定义一个待测试的类,并且定义两个变量,一个用于存放参数,一个用于存放期待的结果。

  • 定义测试数据的集合,也就是上述的data()方法,该方法可以任意命名,但是必须使用@Parameters标注进行修饰。

  • 定义构造函数,其功能就是对先前定义的两个参数进行初始化

以上是Java單元測試中關於JUnit篇的詳解的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn