JUnit4基礎 使用JUnit4進行單元測試


  

JUnit 4

 

  JUnit 4全面引入了Annotation來執行我們編寫的測試。

  關於JUnit 3的使用可以參見:http://www.cnblogs.com/mengdd/archive/2013/03/26/2983565.html

 

  使用JUnit 4進行測試:

  1.新建項目,引用JUnit 4類庫。

  2.新建立source folder,存放測試類代碼,但是注意測試類代碼和被測試代碼的包名一致。

  3.編寫被測試類代碼。

  前面的都是和JUnit 3類似的,下面就開始不同了:

  4.編寫測試類代碼:

  JUnit 4並不要求測試類繼承TestCase父類。

  測試方法上面需要加上一個Annotation:@Test

  在一個測試類中,所有被@Test注解所修飾的public,void方法都是test case,可以被JUnit所執行。

 

Test文檔:

org.junit

Annotation Type Test

--------------------------------------------------------------------------------

@Retention(value=RUNTIME)

@Target(value=METHOD)

public @interface Test

The Test annotation tells JUnit that the public void method to which it is attached can be run as a test case.

To run the method, JUnit first constructs a fresh instance of the class then invokes the annotated method.

Any exceptions thrown by the test will be reported by JUnit as a failure.

If no exceptions are thrown, the test is assumed to have succeeded.

 

最佳實踐

  JUnit 4不再要求方法的名字,可以給測試方法任意命名,但是為了可讀性,還是建議以test開頭命名,如JUnit 3要求的那樣

 

如何實現JUnit 3中的setUp()和tearDown()

  比如測試前面用過的計算的類:

 

Calculator
package com.mengdd.junit4;

public class Calculator
{
    public int add(int a, int b)
    {
        return a + b;
    }

    public int subtract(int a, int b)
    {
        return a - b;
    }

    public int multiply(int a, int b)
    {
        return a * b;
    }

    public int divide(int a, int b) throws Exception
    {
        if (0 == b)
        {
            throw new Exception("除數不能為0");
        }
        return a / b;
    }
}

 

 

  現在要測試這個類中的前三個方法,寫出測試類如下:

CalculatorTest
package com.mengdd.junit4;

import org.junit.Test;
import static org.junit.Assert.assertEquals;//靜態導入

public class CalculatorTest
{
    @Test
    public void testAdd()
    {
        Calculator cal = new Calculator();

        int result = cal.add(3, 5);
        assertEquals(8, result);
    }

    @Test
    public void testSubstract()
    {
        Calculator cal = new Calculator();
        int result = cal.subtract(1, 6);
        assertEquals(-5, result);

    }

    @Test
    public void testMultiply()
    {
        Calculator cal = new Calculator();
        int result = cal.multiply(5, 9);
        assertEquals(45, result);
    }

}

 

  這樣是可以完成測試功能,如何避免重復呢?

  就好像JUnit 3的時候把創建對象的代碼放在setUp()中那樣。

 

  JUnit 4中還是依靠注解來解決:@Before

  被這個注解標注的方法會在每個測試用例之前被調用。

  相應的,對應於tearDown()方法的是用@After實現的。

   這兩個方法會在每一個測試用例的前后被調用,所以可以用來創建對象,對於每個測試用例來說都是一個新的對象。

 

全局的初始化和銷毀:@BeforeClass和@AfterClass

  @BeforeClass:在所有的方法調用之前調用的一個方法;用來進行一些開銷昂貴的初始化操作,比如連接數據庫。

  @AfterClass:在所有的方法調用之后調用的方法。

  注意這兩個修飾符修飾的方法必須是public static void的,並且沒有參數(no-arg)。

 

  Note:

  即便@BeforeClass修飾的方法拋出異常了,@AfterClass修飾的方法也會照常執行。

  基類的@BeforeClass方法會在子類的@BeforeClass方法之前進行;而基類的@AfterClass方法會在子類的@AfterClass方法之后進行。

 

  修改后的代碼如下:

CalculatorTest V2
package com.mengdd.junit4;

import org.junit.After;
import org.junit.AfterClass;
import org.junit.Before;
import org.junit.BeforeClass;
import org.junit.Test;

import static org.junit.Assert.assertEquals;//靜態導入

public class CalculatorTest
{
    private Calculator cal = null;
    
    @BeforeClass
    public static void globalInit()
    {
        System.out.println("global Init invoked!");
    }
    
    @AfterClass
    public static void globalDestroy()
    {
        System.out.println("global Destroy invoked!");
    }

    @Before
    public void init()//setUp()
    {

        cal = new Calculator();
        System.out.println("init --> cal: " + cal);

    }

    @After
    public void destroy()//tearDown()
    {
        System.out.println("destroy");
    }

    @Test
    public void testAdd()
    {
        System.out.println("testAdd");
        int result = cal.add(3, 5);
        assertEquals(8, result);
    }

    @Test
    public void testSubtract()
    {
        System.out.println("testSubtract");
        int result = cal.subtract(1, 6);
        assertEquals(-5, result);

    }

    @Test
    public void testMultiply()
    {
        System.out.println("testMultiply");
        int result = cal.multiply(5, 9);
        assertEquals(45, result);
    }
    


}

 

 

@Ignore

  @Ignore注解可用於修飾測試類與測試方法,被@Ignore所修飾的方法或類中的測試(@Test修飾的測試)將不會被執行。

  @Ignore中可以加上參數值,說明忽略測試的原因。

 

參考資料

  聖思園張龍老師視頻教程。

  JUnit4 chm格式文檔網盤下載鏈接:

  JUnit 4.0:http://pan.baidu.com/share/link?shareid=539345&uk=2701745266


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM