JUnit總覽
一、什么是單元測(cè)試?
所謂單元測(cè)試,就是針對(duì)最小的功能單元,編寫測(cè)試代碼對(duì)其進(jìn)行正確性測(cè)試。
我們之前一直使用的測(cè)試便是通過main方法來實(shí)現(xiàn),但在main方法中寫測(cè)試代碼有如下的幾個(gè)問題存在:
- 只能在main方法編寫測(cè)試代碼,去調(diào)用其他方法進(jìn)行測(cè)試。
- 無法實(shí)現(xiàn)自動(dòng)化測(cè)試,一個(gè)方法測(cè)試失敗,可能影響其他方法的測(cè)試。
- 無法得到測(cè)試的報(bào)告,需要程序員自己去觀察測(cè)試是否成功。
為了測(cè)試更加方便,有一些第三方的公司或者組織提供了很好用的測(cè)試框架,其中一種便是JUnit測(cè)試框架。
JUnit是第三方公司開源出來的框架,用于對(duì)代碼進(jìn)行單元測(cè)試的工具(IDEA已經(jīng)繼承了JUnit框架)。
相比于在main方法中測(cè)試,JUnit有如下的優(yōu)點(diǎn):
- 可以靈活的編寫測(cè)試代碼,可以針對(duì)某個(gè)方法執(zhí)行測(cè)試,也支持一鍵完成對(duì)全部方法的自動(dòng)化測(cè)試,且各自獨(dú)立。
- 不需要人為分析測(cè)試的結(jié)果,會(huì)自動(dòng)生成測(cè)試報(bào)告出來。
二、JUnit的使用與入門案例
因?yàn)镴unit是第三方提供的,所以在使用之前,我們需要導(dǎo)入到項(xiàng)目之中才能使用,具體步驟如下所示:
- 將Junit框架的jar包導(dǎo)入到項(xiàng)目中(注意:IDEA集成了Junit框架,不需要手工導(dǎo)入)。
- 為需要測(cè)試的業(yè)務(wù)類,定義對(duì)應(yīng)的測(cè)試類,并為每個(gè)業(yè)務(wù)方法,編寫對(duì)應(yīng)的測(cè)試方法(必須:公共、無參、無返回值)。
- 測(cè)試方法上必須聲明@Test注解,然后在測(cè)試方法中,編寫代碼調(diào)用被測(cè)試的業(yè)務(wù)方法進(jìn)行測(cè)試。
- 開始測(cè)試:選中測(cè)試方法,右鍵選擇"Junit運(yùn)行",如果測(cè)試通過,則為綠色;如果測(cè)試失敗,則為紅色。
使用演示
先準(zhǔn)備一個(gè)類:Utils工具類(實(shí)現(xiàn)兩數(shù)最大值)
public class Utils {
public static int max(int num1,int num2) {
return num1 > num2? num1 : num2;
}
}
再準(zhǔn)備一個(gè)測(cè)試類,測(cè)試Utils工具類中的方法能否正常使用。
public class showTest {
@Test
public void show(){
int num = 10;
int num2 = 30;
System.out.println("兩數(shù)最大值為:" + Utils.max(num,num2));
}
}
在寫完代碼后,測(cè)試方法左邊會(huì)出現(xiàn)一個(gè)綠色的三角形按鈕,點(diǎn)擊按鈕就可以測(cè)試方法。
運(yùn)行效果
三、JUnit斷言機(jī)制
斷言機(jī)制(assertions):是測(cè)試方法中的核心部分,用來對(duì)測(cè)試需要滿足的條件進(jìn)行驗(yàn)證。這些斷言方法都是org.junit.jupiter.api.Assertions的靜態(tài)方法。
而所謂斷言,意思是程序員可以預(yù)測(cè)程序的運(yùn)行結(jié)果,檢查程序的運(yùn)行結(jié)果是否與預(yù)期一致。
- 簡單斷言
介紹一種簡單的斷言方法。
現(xiàn)在在showTest中新增一個(gè)方法:assertEquals(判斷兩個(gè)對(duì)象或兩個(gè)原始類型是否相等)。
public class showTest {
@Test
public void show(){
int num = 10;
int num2 = 30;
assertEquals("不等于",10,Utils.max(num,num2));
System.out.println("兩數(shù)最大值為:" + Utils.max(num,num2));
}
}
運(yùn)行效果
注意:
若斷言失敗,后面的代碼都不會(huì)執(zhí)行,所以斷言后的輸出語句并沒有執(zhí)行。
- 數(shù)組斷言
通過 assertArrayEquals 方法來判斷兩個(gè)對(duì)象或原始類型的數(shù)組是否相等
public class showTest {
@Test
public void show(){
assertArrayEquals("內(nèi)容不相等",new int[]{3,2},new int[]{2,2});
}
}
運(yùn)行效果
四、JUnit框架的常用注解
JUnit的啟動(dòng)必須要有@Test注解,它的作用是用來標(biāo)記一個(gè)方法為測(cè)試方法,測(cè)試才能啟動(dòng)執(zhí)行。
在JUnit中,除了@Test注解,還有一些其他的注解:
@Before:每個(gè)測(cè)試方法執(zhí)行之前執(zhí)行
@Before
public void before(){
System.out.println("before執(zhí)行了");
}
@Test
public void test1(){
System.out.println("test1執(zhí)行");
}
@Test
public void test2(){
System.out.println("test2執(zhí)行");
}
運(yùn)行效果
@After:每個(gè)測(cè)試方法之后執(zhí)行。
@Test
public void test1(){
System.out.println("test1執(zhí)行");
}
@Test
public void test2(){
System.out.println("test2執(zhí)行");
}
@After
public void after(){
System.out.println("after執(zhí)行了");
}
運(yùn)行效果
@BeforeClass :修飾靜態(tài)方法,只會(huì)在所有測(cè)試方法之前執(zhí)行一次。
@BeforeClass
public static void before(){
System.out.println("before執(zhí)行了");
}
@Test
public void test1(){
System.out.println("test1執(zhí)行");
}
@Test
public void test2(){
System.out.println("test2執(zhí)行");
}
運(yùn)行效果
@AfterClass : 修飾靜態(tài)方法,只會(huì)在所有測(cè)試方法之后執(zhí)行一次。
@Test
public void test1(){
System.out.println("test1執(zhí)行");
}
@Test
public void test2(){
System.out.println("test2執(zhí)行");
}
@After
public void after(){
System.out.println("after執(zhí)行了");
}
運(yùn)行效果
● 注解的應(yīng)用場(chǎng)景
假如我想在每個(gè)測(cè)試方法中使用Socket對(duì)象,并且用完之后,要把Socket關(guān)閉,這個(gè)時(shí)候就可以使用注解來完成。
public class jUnitTest{
private static Socket socket;
@Before
public void test1(){
System.out.println("--> test1 Before 執(zhí)行了");
}
@BeforeClass
public static void test11(){
System.out.println("--> test11 BeforeClass 執(zhí)行了");
//初始化Socket對(duì)象
socket = new Socket();
}
@After
public void test2(){
System.out.println("--> test2 After 執(zhí)行了");
}
@AfterCalss
public static void test22(){
System.out.println("--> test22 AfterCalss 執(zhí)行了");
//關(guān)閉Socket
socket.close();
}
}
● 注解小結(jié)
1.被@BeforeClass標(biāo)記的方法,執(zhí)行在所有方法之前
2.被@AfterCalss標(biāo)記的方法,執(zhí)行在所有方法之后
3.被@Before標(biāo)記的方法,執(zhí)行在每一個(gè)@Test方法之前
4.被@After標(biāo)記的方法,執(zhí)行在每一個(gè)@Test方法之后
五、JUnit5的注解
在JUnit5中對(duì)注釋做了更新,但作用是相同的,只是改了方法名。文章來源:http://www.zghlxwxcb.cn/news/detail-769928.html
文章來源地址http://www.zghlxwxcb.cn/news/detail-769928.html
到了這里,關(guān)于Java高級(jí)技術(shù) 單元測(cè)試(JUnit4)的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!