Junit4

JUnit 4

註解

註解 描述
@Test 修飾測試方法
@Before 修飾的方法在類中的每個測試之前執行
@BeforeClass 修飾靜態方法,在類中的每個測試之前執行
@After 修飾的方法在類中的每個測試之後執行
@AfterClass 修飾靜態方法,在類中的每個測試之後前執行
@Ignore 修飾的方法暫時禁用測試
@SuiteClasses 套件測試
@Runwith 修飾測試類
@Parameters 參數化測試
import org.junit.*;

public class JunitTest {
    @BeforeClass
    public static void beforeClass() {
        System.out.println("in before class");
    }

    @AfterClass
    public static void afterClass() {
        System.out.println("in after class");
    }

    @Before
    public void before() {
        System.out.println("in before");
    }

    @After
    public void after() {
        System.out.println("in after");
    }

    @Test
    public void testCase1() {
        System.out.println("in test case 1");
    }

    @Test
    public void testCase2() {
        System.out.println("in test case 2");
    }
    
    @Ignore
    @Test
    public void testCase3() {
        System.out.println("in test case 3");
    }
}

in before class
in before
in test case 1
in after
in before
in test case 2
in after

Test ignored.
in after class

斷言

Asserts類方法 描述
assertEquals 判斷對象的內容是否相等
assertArrayEquals 判斷數組的內容是否相等
assertNotSame/assertSame 判斷是否引用同個對象
assertNotNull/assertNull 判斷對象是否爲null
assertTrue/assertFalse 判斷真假
import org.junit.Assert;
import org.junit.Test;

public class AssertionTest {

    @Test
    public void test() {
        String obj1 = "junit";
        String obj2 = "junit";
        String obj3 = "test";
        String obj4 = "test";
        String obj5 = null;
        
        int var1 = 1;
        int var2 = 2;

        int[] array1 = {1, 2, 3};
        int[] array2 = {1, 2, 3};

        Assert.assertEquals(obj1, obj2);

        Assert.assertSame(obj3, obj4);
        Assert.assertNotSame(obj2, obj4);
        
        Assert.assertNotNull(obj1);
        Assert.assertNull(obj5);

        Assert.assertTrue(var1 < var2);
        Assert.assertFalse(var1 > var2);

        Assert.assertArrayEquals(array1, array2);

    }
}

套件測試

import org.junit.Test;

public class JunitTest1 {
    @Test
    public void printMessage(){
        System.out.println("in JunitTest1");
    }
}
import org.junit.Test;

public class JunitTest2 {
    @Test
    public void printMessage(){
        System.out.println("in JunitTest2");
    }
}
import org.junit.runner.RunWith;
import org.junit.runners.Suite;

@RunWith(Suite.class)
@Suite.SuiteClasses({
        /**
         * 此處類的配置順序會影響執行順序
         */
        JunitTest1.class,
        JunitTest2.class
})
public class JunitSuite {
	// 保持空即可
}

in JunitTest1
in JunitTest2

參數化測試

  • 使用不同的值反覆運行同一個測試
public class PrimeNumberChecker {
    public Boolean validate(final Integer parimeNumber) {
        for (int i = 2; i < (parimeNumber / 2); i++) {
            if (parimeNumber % i == 0) {
                return false;
            }
        }
        return true;
    }
}
import org.junit.Assert;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.junit.runners.Parameterized;

import java.util.Arrays;
import java.util.Collection;

/**
 * 步驟一: 指定定參數運行器(默認運行器是JUnit4.class)
 */
@RunWith(Parameterized.class)
public class PrimeNumberCheckerTest {
    /**
     * 步驟二:聲明變量
     */
    private Integer inputNumber;
    private Boolean expectedResult;
    private PrimeNumberChecker primeNumberChecker;

    /**
     * 步驟三:爲測試類聲明一個帶有參數的公共構造函數,爲變量賦值
     */
    public PrimeNumberCheckerTest(Integer inputNumber,
                                  Boolean expectedResult) {
        this.inputNumber = inputNumber;
        this.expectedResult = expectedResult;
    }

    /**
     * 步驟四:爲測試類聲明一個使用註解 org.junit.runners.Parameterized.Parameters 修飾的,返回值爲
     * java.util.Collection 的公共靜態方法,並在此方法中初始化所有需要測試的參數對
     *   1)該方法必須由Parameters註解修飾 
          2)該方法必須爲public static的 
          3)該方法必須返回Collection類型 
          4)該方法的名字不做要求 
          5)該方法沒有參數 
     */
    @Parameterized.Parameters
    public static Collection primeNumbers() {
        return Arrays.asList(new Object[][]{
                {2, true},
                {6, false},
                {19, true},
                {22, false},
                {23, true}
        });
    }

    @Before
    public void initialize() {
        primeNumberChecker = new PrimeNumberChecker();
    }

    /**
     * 步驟五:編寫測試方法,使用自定義變量進行測試
     */
    @Test
    public void testPrimeNumberChecker() {
        System.out.println("Parameterized Number is : " + inputNumber);
        Assert.assertEquals(expectedResult,
                primeNumberChecker.validate(inputNumber));
    }
}

Parameterized Number is : 2
Parameterized Number is : 6
Parameterized Number is : 19
Parameterized Number is : 22
Parameterized Number is : 23

時間測試

@Test(timeout = 1000)
public void testCase1() throws InterruptedException {
    TimeUnit.SECONDS.sleep(5000);
    System.out.println("in test case 1");
}

org.junit.runners.model.TestTimedOutException: test timed out after 1000 milliseconds…

異常測試

@Test(expected = ArithmeticException.class)
public void testCase3() {
    System.out.println("in test case 3");
    // int a = 0;	// 得到預期異常才能通過測試
    int a = 1;
    int b = 1 / a;
}

java.lang.AssertionError: Expected exception: java.lang.ArithmeticException

Junit 4 與 JUnit 5的比較

描述 JUNIT 4 JUNIT 5
聲明一種測試方法 @Test @Test
在當前類中的所有測試方法之前執行 @BeforeClass @BeforeAll
在當前類中的所有測試方法之後執行 @AfterClass @AfterAll
在每個測試方法之前執行 @Before @BeforeEach
每種測試方法後執行 @After @AfterEach
禁用測試方法/類 @Ignore @Disabled
測試工廠進行動態測試 NA @TestFactory
嵌套測試 NA @Nested
標記和過濾 @Category @Tag
註冊自定義擴展 NA @ExtendWith
斷言 org.junit.Assert org.junit.jupiter.Assertions
假設 org.junit.Assume org.junit.jupiter.api.Assumptions

Junit5 套件測試

import org.junit.platform.runner.JUnitPlatform;
import org.junit.platform.suite.api.SelectPackages;
import org.junit.runner.RunWith;

@RunWith(JUnitPlatform.class)
@SelectPackages("com.howtodoinjava.junit5.examples")
// @SelectClasses
public class JUnit5Example{
    // do nothing
}

參考博客:

https://juejin.im/post/5c7fbfdd6fb9a049ef275a60

https://blog.csdn.net/u010675669/article/details/86574956

發佈了109 篇原創文章 · 獲贊 22 · 訪問量 3萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章