JUnit 4
- JUnit 4:https://junit.org/junit4/
- JUnit 5:https://junit.org/junit5/
註解
註解 | 描述 |
---|---|
@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 afterTest 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