(四)JUnit測試套件使用及參數化設置
這篇筆記記錄JUnit測試套件的使用,即批量運行測試類;以及JUnit中的參數化設置。
@RunWith
當類被@RunWith注解修飾,或者類繼承了一個被該注解修飾的類,JUnit將會使用這個注解所指明的運行器(runner)來運行測試,而不是JUnit默認的運行器。
1.JUnit測試套件
如果在測試類不端增加的情況下,如何運行所有的單元測試代碼類?一個個測試類的執行嗎?顯然繁瑣且費勁。
將要運行的測試類集成在我們的測試套件中,比如一個系統功能對應一個測試套件,一個測試套件中包含多個測試類,每次測試系統功能時,只要執行一次測試套件就可以了。
1.1 測試類及測試套件代碼
新建3個測試任務類:
package jtzen9.util;
import org.junit.Test;
public class TaskTest1 {
@Test
public void test() {
System.out.println("this is TaskTest1...");
}
}
package jtzen9.util;
import org.junit.Test;
public class TaskTest2 {
@Test
public void test() {
System.out.println("this is TaskTest2...");
}
}
package jtzen9.util;
import org.junit.Test;
public class TaskTest3 {
@Test
public void test() {
System.out.println("this is TaskTest3...");
}
}
新建一個套件類,包含以上三個任務類:
package jtzen9.util;
import org.junit.runner.RunWith;
import org.junit.runners.Suite;
@RunWith(Suite.class)
@Suite.SuiteClasses({TaskTest1.class,TaskTest2.class,TaskTest3.class})
public class SuiteTest {
/*
* 1.測試套件就是組織測試類一起運行的
*
* 寫一個作為測試套件的入口類,這個類里不包含其他的方法
* 更改測試運行器Suite.class
* 將要測試的類作為數組傳入到Suite.SuiteClasses({})
*/
}
運行結果:
1.2 說明
①使用@RunWith注解,修改測試運行器。例如@RunWith(Suite.class),這個類就成為測試套件的入口類。
②@Suite.SuiteClasses()中放入測試套件的測試類,以數組的形式{class1,class2,......}作為參數
2.JUnit參數化設置
如果測試代碼大同小異,代碼結構都是相同的,不同的只是測試的數據和預期值,那么有沒有更好的辦法將相同的代碼結構提取出來,提高代碼的重用度呢?
解決:進行參數化測試。
步驟:
①要進行參數化測試,需要在類上面指定如下的運行器:@RunWith (Parameterized.class)
②然后,在提供數據的方法上加上一個@Parameters注解,這個方法必須是靜態static的,並且返回一個集合Collection。
③在測試類的構造方法中為各個參數賦值,(構造方法是由JUnit調用的),最后編寫測試類,它會根據參數的組數來運行測試多次。
2.1 代碼:
package jtzen9.util;
import static org.junit.Assert.*;
import java.util.Arrays;
import java.util.Collection;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.junit.runners.Parameterized;
import org.junit.runners.Parameterized.Parameters;
@RunWith(Parameterized.class) //1.更改默認的測試運行器為RunWith(Parameterized.class)
public class ParameterTest {
//2.聲明變量存放預期值和測試數據
int expected =0;
int input1 = 0;
int input2 = 0;
//3.聲明一個返回值 為Collection的公共靜態方法,並使用@Parameters進行修飾
@Parameters
public static Collection<Object[]><object> data() {
return Arrays.asList(new Object[][]{
{3,1,2},
{4,2,2}
}) ;
}
//4.為測試類聲明一個帶有參數的公共構造函數,並在其中為之聲明變量賦值
public ParameterTest(int expected,int input1,int input2) {
this.expected = expected;
this.input1 = input1;
this.input2 = input2;
}
//5.運行測試方法,即可完成對多組數據的測試
@Test
public void testAdd() {
assertEquals(expected, new Calculate().add(input1, input2));
}
}</object>
2.2 運行結果