junitjunit入門


備註

JUnit是一個為Java編程語言編寫可重複測試的簡單框架。它是單元測試框架的xUnit體系結構的一個實例。

主要特點包括:

  • 斷言 ,可讓您自定義測試中的值的測試方法
  • 測試運行器,允許您指定如何在類中運行測試
  • 規則 ,允許您靈活地修改類中測試的行為
  • 套件 ,允許您組合來自許多不同類的一系列測試

JUnit的有用擴展:

版本

發布日期
JUnit 5里程碑2 2016年7月23日
JUnit 5里程碑1 2016年7月7日
JUnit 4.12 2016年4月18日
JUnit 4.11 2012年11月14日
JUnit 4.10 2011-09-28
JUnit 4.9 2011-08-22
JUnit 4.8 2009-12-01
JUnit 4.7 2009-07-28
JUnit 4.6 2009-04-14

安裝或設置

由於JUnit是一個Java庫,因此要安裝它所需要做的就是將幾個JAR文件添加到Java項目的類路徑中,然後就可以開始了。

您可以手動下載這兩個JAR文件: junit.jarhamcrest-core.jar

如果你正在使用Maven,你只需在pom.xml 添加一個依賴項:

<dependency>
  <groupId>junit</groupId>
  <artifactId>junit</artifactId>
  <version>4.12</version>
  <scope>test</scope>
</dependency>
 

或者,如果您正在使用Gradle,請在build.gradle 添加依賴build.gradle

apply plugin: 'java'

dependencies {
    testCompile 'junit:junit:4.12'
}
 

在此之後,您可以創建第一個測試類:

import static org.junit.Assert.assertEquals;

import org.junit.Test;

public class MyTest {
    @Test
    public void onePlusOneShouldBeTwo() {
        int sum = 1 + 1;
        assertEquals(2, sum);
    }
}
 

並從命令行運行它:

  • Windows java -cp .;junit-X.YY.jar;hamcrest-core-XYjar org.junit.runner.JUnitCore MyTest
  • Linux或OsX java -cp .:junit-X.YY.jar:hamcrest-core-XYjar org.junit.runner.JUnitCore MyTest

或者與Maven: mvn test

@Before,@ After

@Before 帶註釋的方法將在每次執行@Test 方法之前執行。類似於@After 註釋的方法在每個@Test 方法之後執行。這可用於重複設置測試設置並在每次測試後進行清理。因此測試是獨立的,準備代碼不會在@Test 方法中復制。

例:

import static org.junit.Assert.assertEquals;

import java.util.ArrayList;
import java.util.List;

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

public class DemoTest {

    private List<Integer> list;

    @Before
    public void setUp() {
        list = new ArrayList<>();
        list.add(3);
        list.add(1);
        list.add(4);
        list.add(1);
        list.add(5);
        list.add(9);
    }

    @After
    public void tearDown() {
        list.clear();
    }

    @Test
    public void shouldBeOkToAlterTestData() {
        list.remove(0); // Remove first element of list.
        assertEquals(5, list.size()); // Size is down to five
    }

    @Test
    public void shouldBeIndependentOfOtherTests() {
        assertEquals(6, list.size());
    }
}
 

使用@Before@After 註釋的方法必須是public void 且參數為零。

基本單元測試示例

此示例是使用junit對StringBuilder.toString()進行單元測試的基本設置。

import static org.junit.Assert.assertEquals;

import org.junit.Test;

public class StringBuilderTest {

    @Test
    public void stringBuilderAppendShouldConcatinate()  {
        StringBuilder stringBuilder = new StringBuilder();
        stringBuilder.append("String");
        stringBuilder.append("Builder");
        stringBuilder.append("Test");

        assertEquals("StringBuilderTest", stringBuilder.toString());
    }

}
 

捕獲預期的異常

可以在沒有任何try catch 塊的情況下輕鬆捕獲異常。

public class ListTest {
  private final List<Object> list = new ArrayList<>();

  @Test(expected = IndexOutOfBoundsException.class)
  public void testIndexOutOfBoundsException() {
    list.get(0);
  }
}
 

當您不希望/需要檢查拋出的異常所攜帶的消息時,上面的示例應該足以滿足更簡單的情況。

如果要檢查有關異常的信息,可能需要使用try / catch塊:

@Test
public void testIndexOutOfBoundsException() {
    try {
        list.get(0);
        Assert.fail("Should throw IndexOutOfBoundException");
    } catch (IndexOutOfBoundsException ex) {
        Assert.assertEquals("Index: 0, Size: 0", ex.getMessage());
    }
}
 

對於此示例,您必須注意始終添加Assert.fail() 以確保在未拋出異常時測試將失敗。

對於更詳細的案例,JUnit具有ExpectedException @Rule ,它也可以測試此信息並按如下方式使用:

public class SimpleExpectedExceptionTest {
     @Rule
     public ExpectedException expectedException = ExpectedException.none();

     @Test
     public void throwsNothing() {
         // no exception expected, none thrown: passes.
     }

     @Test
     public void throwsExceptionWithSpecificType() {
         expectedException.expect(NullPointerException.class);

         throw new NullPointerException();
     }

     @Test
     public void throwsExceptionWithSpecificTypeAndMessage() {
         expectedException.expect(IllegalArgumentException.class);
         expectedException.expectMessage("Wanted a donut.");

         throw new IllegalArgumentException("Wanted a donut.");
     }
}
 

在JUnit5中測試異常

要在JUnit 5中實現相同的功能,請使用全新的機制

測試方法

public class Calculator {
    public double divide(double a, double b) {
        if (b == 0.0) {
            throw new IllegalArgumentException("Divider must not be 0");
        }
        return a/b;
    }
}
 

測試方法

public class CalculatorTest {
    @Test
    void triangularMinus5() { // The test method does not have to be public in JUnit5
        Calculator calc = new Calculator();

        IllegalArgumentException thrown = assertThrows(
            IllegalArgumentException.class, 
            () -> calculator.divide(42.0, 0.0));
        // If the exception has not been thrown, the above test has failed.

        // And now you may further inspect the returned exception...
        // ...e.g. like this:
        assertEquals("Divider must not be 0", thrown.getMessage());
}
 

忽略測試

要忽略測試,只需將@Ignore 註釋添加到測試中,並可選擇使用原因為註釋提供參數。

@Ignore("Calculator add not implemented yet.")
@Test
public void testPlus() {
    assertEquals(5, calculator.add(2,3));
}
 

與評論測試或刪除@Test 註釋相比,測試運行器仍將報告此測試並註意它被忽略。

也可以通過使用JUnit 假設有條件地忽略測試用例。一個示例用例是在開發人員修復某個錯誤後運行測試用例。例:

import org.junit.Assume;
import org.junit.Assert;
...

@Test 
public void testForBug1234() {

    Assume.assumeTrue(isBugFixed(1234));//will not run this test until the bug 1234 is fixed

    Assert.assertEquals(5, calculator.add(2,3));
}
 

默認運行器將處於失敗假設的測試視為已忽略。其他跑步者可能表現得不同,例如將他們視為通過。

JUnit - 基本註釋示例

這裡有一些你應該理解的基本JUnit註釋:

@BeforeClass – Run once before any of the test methods in the class, public static void 
@AfterClass – Run once after all the tests in the class has been run, public static void
@Before – Run before @Test, public void
@After – Run after @Test, public void
@Test – This is the test method to run, public void