天天看點

Junit4單元測試的基本用法環境搭建Junit使用JUnit的流程測試套件參數化測試總結及補充:

環境搭建

這裡使用的開發工具是MyEclipse,首先建立一個Java工程,将Junit4的jar包引入,eclipse和MyEclipse都內建了Junit的jar包,詳細操作如下圖。

1、新增一個Junit的jar包,版本選擇Junit4

Junit4單元測試的基本用法環境搭建Junit使用JUnit的流程測試套件參數化測試總結及補充:
Junit4單元測試的基本用法環境搭建Junit使用JUnit的流程測試套件參數化測試總結及補充:

Junit使用

1、Junit最簡單的用法

建立一個類被測試類,裡面包含一些測試方法,建立一個測試類

1 package junit.util;
 2 /**
 3  * 被測試類,通過Junit對此類的方法進行單元測試
 4  */
 5 public class Claculate {
 6     public int add(int a, int b) {
 7     return a + b;
 8     }
 9 
10     public int subtract(int a, int b) {
11     return a - b;
12     }
13 
14     public int multiply(int a, int b) {
15     return a * b;
16     }
17 
18     public int divide(int a, int b) {
19     return a / b;
20     }
21 
22 }      

建立一個Junit的測試類用來測試上面的測試方法,新增Junit的測試類方法如下:

Junit4單元測試的基本用法環境搭建Junit使用JUnit的流程測試套件參數化測試總結及補充:
1 package junit.util;
 2 
 3 import static org.junit.Assert.*;
 4 import junit.util.Claculate;
 5 
 6 import org.junit.Test;
 7 
 8 /**
 9  * junit的測試方法必須使用@Test注解
10  * 測試方法必須以public void修飾,并且不包含參數
11  */
12 public class ClaculateTest {
13 
14     @Test
15     public void testAdd() {
16     /**
17      * assertEquals這個方法是一個斷言方法
18      * 第一個參數表示預期的結果
19      * 第二個參數表示程式的執行結果
20      * 當預期結果與執行結果是一緻的時候,則表示單元測試成功
21      */
22     assertEquals(4, new Claculate().add(1, 3));
23     }
24 
25    
26     @Test
27     public void testSubtract() {
28     assertEquals(4, new Claculate().subtract(9, 5));
29     }
30     
31     @Test
32     public void testMultiply() {
33     assertEquals(6, new Claculate().multiply(2, 3));
34     }
35     
36     @Test(expected=ArithmeticException.class)
37     public void testDivide() {
38     assertEquals(3, new Claculate().divide(9, 0));
39     }
40 }

      

上面的這個測試類,分别對被測試類Claculate的四個方法進行了測試,測試是選擇使用Junit方式進行執行,如果想要執行單個測試方法,可以選擇單個方法進行執行,可以通過左側代碼欄展開類選擇下面的方法或者直接在代碼中選中方法名進行執行。具體操作如下圖:

Junit4單元測試的基本用法環境搭建Junit使用JUnit的流程測試套件參數化測試總結及補充:

 對于一個類包含的多個測試方法,可以選中這個類,滑鼠右鍵選擇new一個JUnitTest Case,可以選擇類中的所有要測試的方法,eclipse會自動幫你生成測試方法體

隻需要在每個要測試的方法中添加測試代碼即可,如下圖;

Junit4單元測試的基本用法環境搭建Junit使用JUnit的流程測試套件參數化測試總結及補充:

JUnit的流程

在實際項目中,進行JUnit測試時,通常會涉及到一些初始化的東西,可能有些配置項需要在測試前進行加載的,JUnit提供了一些初始化的方法用于初始化

1 package junit.util;
 2 
 3 import org.junit.After;
 4 import org.junit.AfterClass;
 5 import org.junit.Before;
 6 import org.junit.BeforeClass;
 7 import org.junit.Test;
 8 
 9 public class JunitFlowTest {
10     /**
11      * @BeforeClass:這個注解表示這個方法會在所有測試方法執行之前執行
12      * 因為是static修飾的靜态方法,所有隻會執行一次。通常用來進行一些
13      * 資源的加載,如通過JUnit測試Spring相關的東西時,可以在這個方法
14      * 中加載Spring的配置檔案
15      */
16     @BeforeClass
17     public static void setUpBeforeClass() throws Exception {
18     System.out.println("this is before class");
19     }
20     
21     /**
22      * @AfterClass:這個注解表示這個方法會在所有方法執行完畢之後執行,通常用來釋放資源
23      */
24     @AfterClass
25     public static void tearDownAfterClass() throws Exception {
26     System.out.println("this is after class");
27     }
28 
29     /**
30      * @Before:這個注解表示這個方法會在每個測試方法執行之前執行一次
31      * 有多少個測試方法就會執行多少次
32      */
33     @Before
34     public void setUp() throws Exception {
35     System.out.println("this is before");
36     }
37 
38     /**
39      * @After:這個注解表示這個方法會在每個測試方法執行之後執行一次
40      * 有多少個測試方法就會執行多少次
41      */
42     @After
43     public void tearDown() throws Exception {
44     System.out.println("this is Down");
45     }
46 
47     @Test
48     public void test1() {
49     System.out.println("this is test1");
50     }
51     
52     @Test
53     public void test2() {
54     System.out.println("this is test2");
55     }
56 
57 }
58 
59 /* outPut:
60 this is before class
61 this is before
62 this is test1
63 this is Down
64 this is before
65 this is test2
66 this is Down
67 this is after class
68 */      

測試套件

如果要同時測試多個類,可以新增一個測試套件,将多個所有測試類包含進去,每次執行測試套件類的時候,就會把包含的測試類全都執行一遍,測試代碼如下:

1 package junit.util;
 2 
 3 import org.junit.Test;
 4 
 5 public class TaskTest1 {
 6 
 7     @Test
 8     public void test() {
 9     System.out.println("this is TaskTest1");
10     }
11 }
12 
13 
14 
15 package junit.util;
16 
17 import org.junit.Test;
18 
19 public class TaskTest2 {
20 
21     @Test
22     public void test() {
23     System.out.println("this is TaskTest2");
24     }
25 }
26 
27 
28 
29 package junit.util;
30 
31 import org.junit.Test;
32 
33 public class TaskTest3 {
34 
35     @Test
36     public void test() {
37     System.out.println("this is TaskTest3");
38     }
39 }
40 
41 
42 
43 package junit.util;
44 
45 import org.junit.runner.RunWith;
46 import org.junit.runners.Suite;
47 
48 /**
49  * 測試套件類
50  * 測試套件是用來組織多個測試類一起運作的,使用 @RunWith注解
51  * 更改測試運作器為Suite.class,将要測試的類作為數組傳入
52  * 到Suite.SuiteClasses({})中,測試套件類不能包含其他測試方法
53  * 
54  * 樣例如下:
55  */
56 @RunWith(Suite.class)
57 @Suite.SuiteClasses({ TaskTest1.class, TaskTest2.class, TaskTest3.class })
58 public class SuiteTest {}
59 
60 //outPut:
61 //this is TaskTest1
62 //this is TaskTest2
63 //this is TaskTest3      

測試套件也可以包含其他的測試套件,具體用法和包含多個測試類是一樣的,代碼如下:

1 package junit.util;
 2 
 3 import org.junit.Test;
 4 
 5 public class TaskTest4 {
 6 
 7     @Test
 8     public void test() {
 9     System.out.println("this is TaskTest4");
10     }
11 }
12 
13 
14 
15 package junit.util;
16 
17 import org.junit.runner.RunWith;
18 import org.junit.runners.Suite;
19 
20 @RunWith(Suite.class)
21 @Suite.SuiteClasses({SuiteTest.class,TaskTest4.class})
22 public class SuiteTest1 {}
23 
24 //outPut
25 //this is TaskTest1
26 //this is TaskTest2
27 //this is TaskTest3
28 //this is TaskTest4      

參數化測試

對于一個方法需要進行多種場景進行測試時,可以通過參數化測試減少測試的工作量。用法如下:

1 package junit.util;
 2 
 3 import static org.junit.Assert.assertEquals;
 4 
 5 import java.util.Arrays;
 6 import java.util.Collection;
 7 
 8 import org.junit.Test;
 9 import org.junit.runner.RunWith;
10 import org.junit.runners.Parameterized;
11 import org.junit.runners.Parameterized.Parameters;
12 
13 @RunWith(Parameterized.class)
14 public class ParameterTest {
15 
16     /**
17      * 1、更改測試運作器為RunWith(Parameterized.class)
18      * 2、聲明變量用來存放預期值與結果值
19      * 3、聲明一個傳回值為Collection的公共靜态方法,并使用@Parameters進行修飾
20      * 4、位測試類聲明一個帶有參數的公共構造方法,并在其中為聲明變量指派
21      */
22     
23     int except;  //用來存儲預期結果
24     int input1;  //用來存儲第一個輸入參數
25     int input2;  //用來存儲第二個輸入參數
26     
27     @Parameters
28     public static Collection<Object[]> initTestData(){
29     return Arrays.asList(
30         new Object[][]{
31         {3,1,2},
32         {10,5,5},
33         {6,4,2},
34         {7,3,4}}
35         );
36     }
37     
38     public ParameterTest(int except,int input1,int input2){
39     this.except = except;
40     this.input1 = input1;
41     this.input2 = input2;
42     }
43     
44     
45     
46     
47     
48     @Test
49     public void testAdd() {
50     assertEquals(except, new Claculate().add(input1, input2));
51     }
52 
53 }      

總結及補充:

JUnit的一些注意事項:

  • 測試方法必須使用@Test修飾
  • 測試方法必須使用public void進行修飾,不能帶參數
  • 一般使用單元測試會建立一個test目錄存放測試代碼,在生産部署的時候隻需要将test目錄下代碼删除即可
  • 測試代碼的包應該和被測試代碼包結構保持一緻
  • 測試單元中的每個方法必須可以獨立測試,方法間不能有任何依賴
  • 測試類一般使用Test作為類名的字尾
  • 測試方法使一般用test作為方法名的字首

測試失敗說明:

  • Failure:一般是由于測試結果和預期結果不一緻引發的,表示測試的這個點發現了問題
  • error:是由代碼異常引起的,它可以産生于測試代碼本身的錯誤,也可以是被測試代碼中隐藏的bug

一些常用注解:

  • @Test:将一個普通方法修飾成一個測試方法
    • @Test(excepted=xx.class): xx.class表示異常類,表示測試的方法抛出此異常時,認為是正常的測試通過的
    • @Test(timeout=毫秒數) :測試方法執行時間是否符合預期
  • @BeforeClass: 會在所有的方法執行前被執行,static方法
  • @AfterClass:會在所有的方法執行之後進行執行,static方法
  • @Before:會在每一個測試方法被運作前執行一次
  • @After:會在每一個測試方法運作後被執行一次
  • @Ignore:所修飾的測試方法會被測試運作器忽略
  • @RunWith:可以更改測試運作器org.junit.runner.Runner
  • @Autowired:是用在JavaBean中的注解,通過byType形式,用來給指定的字段或方法注入所需的外部資源。
  • @MockBean:https://blog.csdn.net/YiWangJiuShiXingFu/article/details/80014955
  • Parameters:參數化注解

繼續閱讀