JUnit常用單元測試註解介紹及代碼演示 by:授客 QQ:1033553122 1. 測試環境 1 2. 基礎概念 1 3. 常用Annotation 1 4. 運行環境配置 3 maven配置 3 Eclipse maven運行環境配置 4 更新項目 5 5. 單元測試實踐 7 被測類Binar ...
JUnit常用單元測試註解介紹及代碼演示
by:授客 QQ:1033553122
Win7
eclipse-java-oxygen-3a-win32-x86_64.zip
apache-maven-3.5.4-bin.zip
https://maven.apache.org/download.cgi
https://pan.baidu.com/s/1OUNC0kZNduXJJLbpw76GZA
測試方法 :用@Test註解修飾的一些類方法。
測試類:包含一個或多個測試方法的java類;
測試套件:用@RunWith(Suite.class) 及@SuiteClasses註解的;font-size:10.5000pt;mso-font-kerning:0.0000pt;">一個或多個測試類
@RunWith 修飾測試類,用於修改運行器,如果不指定@RunWith則使用預設運行器。當測試類被@RunWith註解修飾時,或者類繼承了一個被該註解修飾的類,JUnit將會使用這個註解所指明的運行器來運行單元測試,而不使用JUnit預設的運行器。
常見的運行器有:
@RunWith(JUnit4.class) junit4的預設運行器
@RunWith(SpringRunner.class) 集成了spring的一些功能的運行器
@RunWith(Suite.class) 配合@SuiteClasses使用,用於執行測試套件的運行器
@RunWith(Parameterized.class) 參數化運行器,配合@Parameters使用,參數化運行單元測試,需要在被修飾的測試類中的,提供數據的方法上加上一個@Parameters註解,例如,註意,這個提供數據的方法必須是靜態的(static),並且返回一個集合(Collection)。
我們可以為@Parameters 提供一個“名稱”,以便更清晰的標記每個測試方法在每次運行時所使用的參數
“名稱”可以包含占位符,該占位符在運行時將會被替換。
·{index}: 當前參數的索引
·{0}, {1}, …: 第一個參數,第二個參數等對應的參數值。
@Test 註解將一個普通方法修飾為一個測試方法,可選參數 timeout、expected,如下:
@Test(timeout = 1000) 設置被修飾的測試方法在預期時間(例中為 1000毫秒)內執行完成,否則測試失敗;
@Test(expected = Exception.class)設置被修飾的測試方法應該拋出的預期異常,異常類型為:Exception.class,如果測試方法沒有拋出預期的異常,則測試失敗, 例如 @Test(expected = NullPointException.class)
註意:測試方法必須是public void,即公共、無返回
參考鏈接:https://www.cnblogs.com/mengdd/archive/2013/04/13/3019278.html
@BeforeClass 註解用於修飾測試類中的非測試方法,該方法將在其所屬測試類中的所有測試方法被執行前運行,且只運行一次,可用於做一些測試基礎準備,比如資料庫連接,讀取文件等。
註意:@BeforeClass修飾的方法必須是被public static void 修飾的方法,即公開、靜態、無返回
@AfterClass 同@BeforeClass相反,註解用於修飾測試類中的非測試方法,該方法將在其所屬測試類中所有測試方法執行完成後被運行,且只運行一次,可用於做一些測試後續操作,比如斷開資料庫連接,關閉文件等。
註意:@AfterClass 修飾的方法必須是被public static void 修飾的方法,即公開、靜態、無返回
@Before 註解用於修飾測試類中的非測試方法, 該方法會在其所屬測試類中的每一個測試方法運行前運行一次
與@BeforeClass的區別在於,@Before不止運行一次,它會在每個測試方法運行之前都運行一次。主要用於為單個測試方法做一些基礎的測試準備工作。
註意:@Before 修飾的方法必須是被public void 修飾的方法,即公開、無返回,但不能是被static修飾的
@After:用於修飾測試類中的非測試方法, 同@Before相反,該方法會在其所屬測試類中的每一個測試方法執行完後都運行一次
註意:@After 修飾的方法必須是被public void 修飾的方法,即公開、無返回,但不能是被static修飾的
@ignore 註釋掉一個測試方法或一個類,被註釋的方法或類,不會被執行;
確保全裝了java jdk並正確設置了JAVA_HOME
下載bin.zip壓縮包,解壓到目標路徑(例中 D:\Program Files\apache-maven-3.5.4\
),設置MAVEN_HOME及Path環境變數,如下
cmd輸入mvn -v測試
如圖,Window - Preferences - Maven -User Settings,Browse指定maven配置文件所在路徑
為瞭解決項目jar包依賴之類的問題,更新項目,右鍵項目根目錄 - Maven - Update Project
如下圖,預設已經選中了工程項目,預設選項配置的基礎上,勾選上“Force Update of Snapshots/Releases”,OK提交
package org.shouke.demo;
public class BinarySearch {
public int binarySearch(long[] a, long key) {
int low = 0;
int high = a.length - 1;
while (low <= high) {
int mid = (low + high) >>> 1;
long midVal = a[mid];
if (midVal < key)
low = mid + 1;
else if (midVal > key)
high = mid - 1;
else
return mid;
}
return -1;
}
}
package org.shouke.test;
import org.junit.After;
import org.junit.AfterClass;
import org.junit.Assert;
import org.junit.Ignore;
import org.junit.Test;
import org.junit.Before;
import org.junit.BeforeClass;
import org.junit.runner.RunWith;
import org.junit.runners.JUnit4;
import org.shouke.demo.BinarySearch;
//@RunWith(SpringRunner.class)
@RunWith(JUnit4.class)
//@SpringBootTest
//@TestPropertySource("classpath:test-application.properties")
public class BinarySearchTest {
private BinarySearch binarySearch = new BinarySearch();
private long[] array1 = new long[] {};
@Test
public void testBinarySearch1() {
System.out.println("執行方法 testBinarySearch1");
int index = binarySearch.binarySearch(array1, 401L);
Assert.assertEquals(-1, index);
}
private long[] array2 = new long[] {123L,123L,123L,123L,123L,123L,123L,123L};
@Ignore
public void testBinarySearch2() {
System.out.println("執行方法 testBinarySearch2");
int index = binarySearch.binarySearch(array2, 401L);
Assert.assertEquals(-1, index);
}
private long[] array3 = new long[] {123L, 456L};
@Test
public void testBinarySearch3() {
System.out.println("執行方法 testBinarySearch3");
int index = binarySearch.binarySearch(array3, 401L);
Assert.assertEquals(-1, index);
}
private long[] array4 = new long[] {123L, 456L};
@Test
public void testBinarySearch4() {
System.out.println("執行方法 testBinarySearch4");
int index = binarySearch.binarySearch(array4, 40L);
Assert.assertEquals(-1, index);
}
private long[] array5 = new long[] {123L, 456L};
@Test
public void testBinarySearch5() {
System.out.println("執行方法 testBinarySearch5");
int index = binarySearch.binarySearch(array5, 123L);
Assert.assertEquals(0, index);
}
private long[] array6 = new long[] {123L, 123L};
@Test
public void testBinarySearch6() {
System.out.println("執行方法 testBinarySearch6");
int index = binarySearch.binarySearch(array6, 123L);
Assert.assertEquals(0, index);
}
@Before
public void testBeforeMethod() {
System.out.println("執行每個方法前先執行該函數");
}
@After
public void testAfterMethod() {
System.out.println("執行完每個方法後都會執行該函數");
}
@BeforeClass
public static void testBeforeClass() {
System.out.println("執行測試類的所有方法前先執行該函數");
}
@AfterClass
public static void testAfterClass() {
System.out.println("執行完測試類的所有方法後都會執行該函數");
}
}
package org.shouke.demo;
public class Caculator {
public int caculate(int arg1, int arg2) {
if (arg1 > arg2) {
return arg1 - arg2;
} else if (arg1 < arg2) {
return arg1 + arg2;
} else {
return arg1;
}
}
}
package org.keshou.test;
import org.junit.Assert;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.junit.runners.Parameterized;
import org.shouke.demo.Caculator;
import java.util.Arrays;
import java.util.Collection;
@RunWith(Parameterized.class)
public class CaculatorTest {
private Caculator caculator = new Caculator();
public int arg1;
public int arg2;
public CaculatorTest(int arg1, int arg2) {
this.arg1 = arg1;
this.arg2 = arg2;
}
// @Parameterized.Parameters
@Parameterized.Parameters(name = "{index}: (arg1: {0} arg2: {1}")
public static Collectiondata() {
return Arrays.asList(new Object[][] {
{ 10, 1}, { 5, 1 }
});
}
@Test
public void testCaculate1() {
int result = caculator.caculate(arg1, arg2);
System.out.println("執行方法 testCaculate1 參數:" + arg1 + " " + arg1);
Assert.assertEquals(result, arg1-arg2);
}
@Test
public void testCaculate2() {
int result = caculator.caculate(arg1, arg2);
System.out.println("執行方法 testCaculate2 參數:" + arg1 + " " + arg1);
Assert.assertEquals(result, arg1+arg2);
}
}
說明:被@Parameters 註解修飾用於提供參數的方法有多少個參數,那麼就需要為其所在類提供對應數量的類屬性,及一個包含對應數量的參數的構造函數,否則會報錯:java.lang.IllegalArgumentException: wrong number of arguments
package org.keshou.test;
import org.junit.runner.RunWith;
import org.junit.runners.Suite;
@RunWith(Suite.class)
@Suite.SuiteClasses({CaculatorTest.class, org.shouke.test.BinarySearchTest.class})
public class RunAllTestClass {
}
說明:如果需要運行多個測試類,只需要把目標測試類名稱.class放入如下的 {}中即可,測試類之間使用逗號分隔,如果不是同一個包中的測試類,記得加上對應的package名稱,或者使用import提前導入對應類。
@Suite.SuiteClasses({A.class, B.class, ...})
如下圖,右鍵整個項目、單個測試類、測試套件 -> Coverage As -> JUnit Test
或者
如下圖,右鍵整個項目、單個測試類、測試套件 -> Run As -> JUnit Test
說明:
1、如果右鍵時選擇的是整個項目,那麼項目src\test\;font-size:10.5000pt;mso-font-kerning:0.0000pt;">目錄下的都有測試類都會被執行。
2、Coverage as 和 Run as 這兩種運行方式的區別在於前者運行完成,會在控制臺端自動打開 Coverage 界面,展示覆蓋率,後者需要手動打開,打開方式如下:
Window -> Show View -> Java -> Coverage
運行測試套件