從零開始學SpringBoot2.x(08-SpringBoot中如何進行單元測試)

“任何人的代碼,不可能沒有Bug!

我們平常所寫的代碼,無論是在開發環境,還是在測試環境,亦或者是線上的生產環境,看似運行的毫無問題,也能滿足公司的業務、客戶的需求,但要我說,這樣的代碼依然會存在Bug!只不過沒有達到觸發條件罷了。

作爲一名合格的類人猿(程序猿),我們有義務和責任在開發的過程中避免一些非常明顯的低級Bug!於是乎,就有了單元測試的概念!

那麼我們在使用SpringBoot的過程中,如何快速的進行單元測試呢?下面我會給大家演示一個實例。

1、老規矩,先在pom.xml文件中添加測試依賴,如下:


<dependencies>
        <!-- web組件 -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>

       <!-- 測試組件 -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
        </dependency>

        <!-- lombok插件 -->
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
        </dependency>
    </dependencies>

在這裏需要特別說明一下,爲了簡化代碼(如實體類中的getter/setter方法等),我引入了lombok插件,其具體的使用方法大家自行查閱,很簡單。

 

2、創建用於測試的實體類對象User,如下:


@Data //lombok插件主鍵,簡化實體類的getter/setter等方法
public class User {

    private String userName;

    private Integer age;
}

 

3、創建用於測試的UserService,裏面只有一個方面,模擬通過用戶名查詢用戶信息,如下:

@Service
public class UserService {

    /**
     * 模擬根據用戶名獲取User對象
     * @param userName
     * @return
     */
    public User getUser(String userName){
        if(userName != null && !userName.equals("")){
            if("笑笑是一個碼農".equals(userName)){
                User user = new User();
                user.setUserName("笑笑是一個碼農");
                user.setAge(18);
                return user;
            }else {
                return null;
            }
        }
        return null;
    }
}

這個業務很簡單,就是根據用戶名查詢用戶信息,爲了演示方便,在這裏我就不去查詢數據庫了,假設已存在一個用戶名爲“笑笑是一個碼農”的用戶,如果傳入的參數匹配,返回該用戶信息,不匹配則返回null。

 

4、創建UserService的測試類,在IDEA中我們使用ctrl+shift+t快捷鍵,會跳出如下圖所示頁面:

我們點擊Create New Test,進入如下頁面:

 

 

點擊ok,我們的工程最終目錄如下:

 

 

可以看到,IDEA已經自動幫我創建好了測試類,並且測試類中也給我們創建好了要測試的方法,如下:


public class UserServiceTest {
    @Test
    public void getUser() {
    }
}

但僅僅是這樣,還不夠我們開始測試,我們還需要添加一些必要的註解,以及注入我們需要測試的UserService,如下:

@RunWith(SpringRunner.class)
@SpringBootTest
public class UserServiceTest {

    @Autowired
    private UserService userService;  //注入我們要測試的類

    @Test
    public void getUser() {
        //調用要測試的方法
        User user = userService.getUser("aaa");
        //由於我們非常確定不存在“aaa的用戶,所以getUser的返回值一定爲null”
        //Assert爲junit提供用於測試的類(斷言),其裏面有很多方法來判斷被測方法實際的返回結果和預期的返回結果(正確的結果)是否一致
        Assert.assertNull(user);
    }
}

 

這樣我們就可以運行我們的測試類,關注IDEA左下方,如圖:

 

可以看到,我們的測試用例運行成功!

可是僅僅是這樣,我們也看不出單元測試的意義何在。

我們回到getUser方法,假設由於我們在編碼的時候疏忽大意,把所有的返回值都寫成了null,如下:

我們並不知道我們寫錯了,單元測試時,當我們查詢“笑笑是一個碼農”的用戶信息時,我們很確定一定會返回一個User對象,如下:

 @Test
    public void getUser() {
        //調用要測試的方法
        User user = userService.getUser("笑笑是一個碼農");
        //由於我們非常確定不存在“aaa的用戶,所以getUser的返回值一定爲null”
        //Assert爲junit提供用於測試的類(斷言),其裏面有很多方法來判斷被測方法實際的返回結果和預期的返回結果(正確的結果)是否一致
        //預期返回值user一定不null
        Assert.assertNotNull(user);
    }

 

顯然,我們的測試用例運行肯定是不通過的,如下:

 

我們所預期的結果與實際的運行結果不一致,這時候,在我們開發過程中就可以去排查代碼,避免這種非常低級的錯誤,提高我們編寫的代碼質量。

 

源碼地址:

https://github.com/devilyang123/SpringBoot-Learning/tree/master/springboot-junit-test

 

 


歡迎關注我的個人公衆號“笑笑是一個碼農”,第一時間獲取最新文章。

您的關注,就是支持我持續寫作的最大動力!

還可以免費領取前後端全站學習視頻資料呦~

個人微信號,如需添加微信,請備註來源,因爲媽媽從小就告訴我不要隨便跟陌生人聊天!(嘿嘿~)

發佈了190 篇原創文章 · 獲贊 76 · 訪問量 15萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章