深圳網(wǎng)站建設(shè)代理商哪家網(wǎng)絡(luò)推廣好
Hi I’m Shendi
為什么使用Junit單元測試?Junit的詳解
Junit簡介
Junit是一個(gè)Java語言的單元測試框架。
單元測試是一個(gè)對(duì)單一實(shí)體(類或方法)的測試
JUnit是由 Erich Gamma 和 Kent Beck 編寫的一個(gè)回歸測試框架(regression testing framework)。Junit測試是程序員測試,即所謂白盒測試,因?yàn)槌绦騿T知道被測試的軟件如何(How)完成功能和完成什么樣(What)的功能。
為什么要用Junit?
在我剛接觸到Junit時(shí)有這樣一個(gè)問題,進(jìn)行測試的話可以使用main函數(shù),那為什么要使用junit?
找不到答案,于是后面的開發(fā)我都沒有使用到單元測試,但用的人還是非常多的,于是今天準(zhǔn)備深入了解一下
總結(jié),有以下幾點(diǎn)
- 比main代碼少一點(diǎn)
- 斷言測試預(yù)期結(jié)果
- 可單個(gè)多個(gè)運(yùn)行,多個(gè)共享數(shù)據(jù)
- 有很多注解,可以在之前…之后運(yùn)行
主要是比較規(guī)范和方便吧,main寫完測試完后基本上都直接刪掉了,而這個(gè)不用
使用
Maven的引入就不列出了(SpringBoot都自帶導(dǎo)入),這里列出Eclipse直接配置Junit
Eclipse內(nèi)點(diǎn)擊項(xiàng)目,按Alt+Enter(或右鍵Properties),選擇 Java Build Path,選擇Libraries,選擇Classpath,點(diǎn)擊Add Library
Next
Finish即可
接下來就可以非常簡單的進(jìn)行單元測試了
在想要運(yùn)行的函數(shù)上加上 @Test
注解,鼠標(biāo)點(diǎn)擊函數(shù)名,右鍵 RunAs - Junit Test 即可運(yùn)行
運(yùn)行后會(huì)在Junit選項(xiàng)卡中顯示結(jié)果
綠勾代表運(yùn)行正常,這一次將三個(gè)函數(shù)都直接運(yùn)行了
運(yùn)行單個(gè)函數(shù)
如果需要運(yùn)行單個(gè)函數(shù)可以用鼠標(biāo)點(diǎn)擊函數(shù)名,當(dāng)輸入的光標(biāo)在函數(shù)名上時(shí)右鍵運(yùn)行即可
如果不行的話可以打開 outline 選項(xiàng)卡,window -> Show Views -> Outline
右側(cè)選中需要運(yùn)行的函數(shù),右鍵運(yùn)行即可
Assert類
用來斷言測試,基本上都是靜態(tài)函數(shù)
例如有一個(gè)函數(shù)用來處理xxx,我們知道函數(shù)返回1是正確結(jié)果,于是可以這樣寫
上面預(yù)期和實(shí)際不符,條條是紅色的,且 Failure Trace 下面顯示了錯(cuò)誤信息和行數(shù)
assert就是一個(gè)if的封裝,一般使用,可能有問題用if,不應(yīng)該有問題的時(shí)候用assert
Assert還有很多函數(shù),例如判斷是否為true或者false,下面列出一些
- fail([String])
- 代表失敗,可以有一參數(shù)為錯(cuò)誤信息
- assertSame([String],Object expected,Object actual)
- 對(duì)象的內(nèi)存地址是預(yù)期的內(nèi)存地址
- assertNotSame
- 與assertSame相反
- assertEquals([String],Object expected,Object actual)
- 值是預(yù)期值
- assertNotEquals
- 與assertEquals相反
注解
除了 @Test 注解之外,還有一些其他的注解,如下
注解 | 描述 |
---|---|
@Ignore | 被忽略的測試方法,加上之后,不執(zhí)行此段代碼,與其他注解一起使用 |
@Before | 在每一個(gè)標(biāo)注了 @Test 的函數(shù)執(zhí)行之前執(zhí)行,(有一個(gè)@Test就執(zhí)行一次) |
@After | 在每一個(gè)標(biāo)注了 @Test 的函數(shù)執(zhí)行之后執(zhí)行,(有一個(gè)@Test就執(zhí)行一次) |
@BeforeClass | 必須是靜態(tài)函數(shù),所有測試函數(shù)執(zhí)行之前執(zhí)行(包括Before),只執(zhí)行一次 |
@AfterClass | 必須是靜態(tài)函數(shù),所有測試函數(shù)執(zhí)行之后執(zhí)行(包括After),只執(zhí)行一次 |
SpringBoot整合Junit
新建SpringBoot項(xiàng)目時(shí)會(huì)自帶Junit,也可以手動(dòng)加入依賴
<!-- springboot的測試框架,里面有對(duì)junit4的依賴 -->
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId><scope>test</scope>
</dependency>
項(xiàng)目會(huì)有 src/test/java 文件夾供存放測試文件
在測試類上加上以下注解
- @RunWith(SpringRunner.class)
- @SpringBootTest
import org.junit.jupiter.api.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringRunner;@RunWith(SpringRunner.class)
@SpringBootTest
class DemoApplicationTests {@Autowired DemoControl dc;@Testpublic void test() {System.out.println(dc.test());}}
@RestController
public class DemoControl {public String test() {return "test";}}
單元測試運(yùn)行即可看到結(jié)果
單元測試對(duì)事務(wù)的影響
如果在使用了@Transactional注解,那么在單元測試中的事務(wù)默認(rèn)回滾。需要在方法上添加 @Rollback(value=false) 才會(huì)提交事務(wù)。
在測試中,處于對(duì)數(shù)據(jù)庫的保護(hù)考慮,請使用@Rollback(value=true) 顯式的回滾
END