前言:
大家好,我是良辰丫,在上一篇文章中我們學(xué)習(xí)了MyBatis簡單的查詢操作,今天來介紹一下Spring Boot(SSM)的一種單元測試
,有人可能會感到疑惑,框架里面還有這玩意?什么東東呀,框架里面是沒有這的,但是我們簡單的學(xué)習(xí)一下單元測試,可以幫助我們自己測試代碼,學(xué)習(xí)單元測試可以讓我們少走很多彎路,畢竟,技多不壓身,哈哈,廢話不多說,我們往下看! ! !??????
??個人主頁:良辰針不戳
??所屬專欄:javaEE進階篇之框架學(xué)習(xí)
??勵志語句:生活也許會讓我們遍體鱗傷,但最終這些傷口會成為我們一輩子的財富。
??期待大家三連,關(guān)注,點贊,收藏。
??作者能力有限,可能也會出錯,歡迎大家指正。
??愿與君為伴,共探Java汪洋大海。
1. 初識單元測試
-
單元測試(unit testing)
是指對軟件中的最?可測試單元進?檢查和驗證的過程就叫單元測試(這里的單元并沒有明確的標(biāo)準(zhǔn))。 - 這里的
單元
可以是一個函數(shù),方法,類,功能模塊或者子系統(tǒng). - 單元測試是開發(fā)者編寫的??段代碼,?于檢驗被測代碼的?個很?的、很明確的(代碼)功能是否正確。執(zhí)?單元測試就是為了證明某段代碼的執(zhí)?結(jié)果是否符合我們的預(yù)期。如果測試結(jié)果符合我們的預(yù)期,稱之為測試通過(測試成功),否則就是測試未通過(測試失敗)。
2. 單元測試有什么用?
- 可以?常簡單、直觀、快速的測試某?個功能是否正確。
- 使?單元測試可以幫我們在打包的時候,發(fā)現(xiàn)?些問題,因為在打包之前,所以的單元測試必須通過,否則不能打包成功。這樣可以減少問題發(fā)生的概率.
- 使?單元測試,在測試功能的時候,可以不污染連接的數(shù)據(jù)庫,也就是可以不對數(shù)據(jù)庫進?任何改變的情況下,測試功能. 也就是測試的時候構(gòu)造一個假的數(shù)據(jù)庫,并沒有對真實的數(shù)據(jù)庫進行修改.
3. 使用單元測試
3.1 引入單元測試框架
- 使用單元測試必須先引入單元測試的框架,也就是在pom.xml里面引入單元測試的依賴.
- 但是在我們的Spring Boot 項目里面,Spring Boot 項?創(chuàng)建時會默認單元測試框架 spring-boot-test,如果只創(chuàng)建一個maven項目,我們需要手動引入單元測試的依賴,?這個單元測試框架主要是依靠另?個著名的測試框架 JUnit 實現(xiàn)的.
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
3.2 生成單元測試
我們測試的代碼是上一篇文章MyBatis中的mapper層.
- 打開我們要測試的類或者接口(或者其它),然后右鍵選擇Generate.
- 點擊Test , 因為咱們要測試的是一個接口,因此Generate里面的東西比較少,如果測試類,還會有set等屬性.
我們先簡單的認識一下各個模塊,一般都不需要更改.
- 選擇我們要測試的單元方法列表.
此時在我們的test目錄里面就會生成一個測試類.
3.3 完善單元測試的代碼
- 添加@SpringBootTest注解
在生成的單元測試類中加一個@SpringBootTest注解,這個注解表示該單元測試是在Spring Boot容器里面的,如果沒有該注解,單元測試的好多Spring Boot的功能就不能用.
package com.example.demo.mapper;
import org.junit.jupiter.api.Test;
import org.springframework.boot.test.context.SpringBootTest;
import static org.junit.jupiter.api.Assertions.*;
//這個注解表示該單元測試是在Spring Boot容器里面的
@SpringBootTest
class StuMapperTest {
@Test
void getStuId() {
}
}
- 注入測試對象,通過屬性注入把StuMapper注入進來
package com.example.demo.mapper;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import static org.junit.jupiter.api.Assertions.*;
//這個注解表示該單元測試是在Spring Boot容器里面的
@SpringBootTest
class StuMapperTest {
@Autowired
private StuMapper stuMapper;
@Test
void getStuId() {
}
}
- 添加單元測試的業(yè)務(wù)代碼
package com.example.demo.mapper;
import com.example.demo.entity.Stu;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import static org.junit.jupiter.api.Assertions.*;
//這個注解表示該單元測試是在Spring Boot容器里面的
@SpringBootTest
class StuMapperTest {
@Autowired
private StuMapper stuMapper;
@Test
void getStuId() {
Stu stu = stuMapper.getStuId(1);
System.out.println(stu);
}
}
- 運行我們的單元測試代碼,綠色的對鉤表示我們測試成功,程序沒有問題.
在運行完我們的單元測試代碼之后,上面的運行塊變成了我們的單元測試運行塊,我們要想執(zhí)行我們的Spring Boot項目,需要改一下.
4. 單元測試的斷言
咱們在C語言里面就接觸過斷言了,但你真的了解斷言嘛?
- 斷言是用于對程序進行調(diào)試的,對執(zhí)行結(jié)構(gòu)進行一定的判斷,而不是對業(yè)務(wù)流程的判斷.
- 那么上述的語句怎么理解呢?我們可以把斷言想象成一個if判斷語句,如果滿足,那么繼續(xù)執(zhí)行斷言后面的程序 ; 如果不滿足,那么拋出異常,后面的程序也將不會執(zhí)行.
斷言的方法表
方法名 | 作用 |
---|---|
assertEquals | 判斷兩個對象或者兩個原始類型是否相等 |
assertNotEquals | 判斷兩個對象或兩個原始類型是否不相等 |
assertSame | 判斷兩個對象引用是否指向同一個對象 |
assertNotSame | 判斷兩個對象引用是否指向不同的對象 |
assertTrue | 判斷是否為true |
assertFalse | 判斷是否為false |
assertNull | 判斷對象的引用是否為null |
assertNotNull | 判斷對象的引用是否不為null |
注意 :
如果斷?失敗,則后?的代碼都不會執(zhí)?,這是非常重要的,打擊一定要記住.
- 那么,接下來,我們就來在上一篇文章代碼的基礎(chǔ)上寫上一個簡單的斷言,來簡單看一下我們的程序運行結(jié)果.
- 下面是我們的單元測試代碼,我們只是在單元測試的基礎(chǔ)上加了一個斷言.
package com.example.demo.mapper;
import com.example.demo.entity.Stu;
import org.junit.jupiter.api.Assertions;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import static org.junit.jupiter.api.Assertions.*;
//這個注解表示該單元測試是在Spring Boot容器里面的
@SpringBootTest
class StuMapperTest {
@Autowired
private StuMapper stuMapper;
@Test
void getStuId() {
Stu stu = stuMapper.getStuId(1);
System.out.println(stu);
//添加一個斷言
Assertions.assertEquals("李四",stu.getName());
}
}
接下來,我們來看一下單元測試的運行結(jié)果.
那么,我們就明白了,預(yù)期結(jié)果和最終結(jié)果不一致的時候就不能通過單元測試.
接下來我們進行打包看一下結(jié)果.
測試單元沒有通過測試的時候,打包也會失敗.
接下來我們再來修改一下代碼,讓預(yù)期結(jié)果和最終結(jié)果相同.
package com.example.demo.mapper;
import com.example.demo.entity.Stu;
import org.junit.jupiter.api.Assertions;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import static org.junit.jupiter.api.Assertions.*;
//這個注解表示該單元測試是在Spring Boot容器里面的
@SpringBootTest
class StuMapperTest {
@Autowired
private StuMapper stuMapper;
@Test
void getStuId() {
Stu stu = stuMapper.getStuId(1);
System.out.println(stu);
Assertions.assertEquals("張三",stu.getName());
}
}
我們看一下單元測試結(jié)果,發(fā)現(xiàn)此時已經(jīng)通過了單元測試.
那么,我們此時進行打包呢,此時我們會成功的打包我們的代碼.
下面是打包的包,如果我們想要在打包的時候直接改一個名字,我們可以在pom中稍微配置一下,包成功后包名就是我們設(shè)置的包名.
在build標(biāo)簽中引入打包的包名,注意,一定是在build標(biāo)簽中.
<finalName>ssm-prohect</finalName>
在project標(biāo)簽中引入打包的后綴名字,默認為jar.
<packaging>jar</packaging>
接下來我們來看一下我們的打包結(jié)果,下面就是我們指定的包名以及后綴名.
文章來源:http://www.zghlxwxcb.cn/news/detail-487708.html
后序:文章來源地址http://www.zghlxwxcb.cn/news/detail-487708.html
- 今天我們和大家簡單學(xué)習(xí)一下單元測試,后序我們更加簡答的判斷我們的程序是否有問題.
- 為什么我們要在mybatis中引入單元測試呢?
因為進入mybatis中,我們就正式接觸我們的SSM項目了,隨著知識點的深入,我們也將不斷完善我們的技能.
到了這里,關(guān)于【MyBatis學(xué)習(xí)】Spring Boot(SSM)單元測試,不用打包就可以測試我們的項目了,判斷程序是否滿足需求變得如此簡單 ? ? ?的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!