單元測試效率優化:為什麼要對程式進行測試?測試有什麼好處?

博為峰網校發表於2022-06-29

單元測試(Unit Testing)又稱為模組測試, 是針對程式模組(軟體設計的最小單位)來進行正確性檢驗的測試工作。 程式單元是應用的最小可測試部件。簡單來說,就是測試資料的穩定性是否達到程式的預期。談到測試,我們為什麼要對程式進行測試呢?測試會為程式帶來什麼好處呢? 加我VX:atstudy-js 回覆“測試”,進入 自動化測試學習交流群~~

我們日常開發時可能在不經意間寫錯,如果等到最後階段去檢驗專案成果時,發現有錯誤,這時候我們很難找到Bug的源頭在哪裡。我們都知道,有可能一處出錯會導致步步錯的情況。

測試就在我們的上述說法中,顯得尤為重要,當我們做完專案的一個小模組,先去測試一下這個小模組是否正確或達到預期,如果錯誤或者沒有達到預期就需要反覆修改,直到正確或達到預期,也就是使用了單元測試。

單元測試的編碼規範一般涉及到以下內容:

類名: 定義測試類,類名是由被測試類名Test構成。例如:CalculatorTest;

包名:定義的測試類需要放在xxx.xxx.xxx.test包中。例如:package com.autodrive.test;

方法名: 測試方法的方法名有兩種定義方式test測試方法和測試方法。例如:testCheck和check;

返回值: 因為我們的方法只是在類中測試,可以獨立執行,所以不需要處理任何返回值,所以這裡使用void。例如:public void check();

引數列表: 因為我們的方法是用來測試的,至於引數列表的傳入是沒有必要的。我們在測試的時候自行傳入需要的引數測試即可。所以在此引數列表為空。例如:例如:public void check();

@Test註解: 測試是需要執行來完成的。如果我們只有一個main方法,顯然在結構上還是需要我們去註釋掉測試過的。解決此問題這裡我們需要在測試方法上方加@Test註解來完成測試,只要是加該註解的方法,可以單獨執行此方法來完成測試。

IDEA快捷匯入Junit4、5: 使用IDEA的小夥伴,你們的福音來了。我們可以先建立測試類和方法,然後在測試方法上方加入@Test註解,此時IDEA顯示的@Test註解是飄紅的,這時候我們使用Alt + Enter組合鍵來開啟匯入Junit單元測試列表,然後再選擇Junit4或者Junit5確定。

在SpringBoot往往存在單元測試用到如下的註解與寫法:

@RunWith(SpringRunner.class)

@SpringBootTest(classes = Application.class)

@Transactional

@Rollback(true) // 事務自動回滾,預設是true。可以不寫

public class NoticeServiceTest {

@Autowired

private NoticeService noticeService;

@Test

public void sayHello() {

helloService.sayHello("zhangsan");

}

}

在上面這個例子中,@SpringBootTest啟動了SpringBoot環境,掃描應用程式的spring配置,並構建完整的Spring Context,其classes = Application.class啟動了整個專案。通過@SpringBootTest我們可以指定啟動類,或者給@SpringBootTest的引數webEnvironment賦值為SpringBootTest.WebEnvironment.RANDOM_PORT,這樣就會啟動web容器,並監聽一個隨機的埠,同時,為我們自動裝配一個TestRestTemplate型別的bean來輔助我們傳送測試請求。

@Transactional表明呼叫資料庫並作事務處理;@RunWith(SpringRunner.class)宣告在Spring的環境中進行單元測試,這樣Spring的相關注解就會被識別並起效,而@Autowired啟動了Spring。

當專案使用了@Component註解,在SpringBoot專案啟動的時候就會跟著例項化/啟動,這個@Component註解的類裡有多執行緒方法,隨著啟動類中定義的ApplicationStartup類啟動了,那麼在你執行單元測試的時候,由於多執行緒任務的影響,就可能對你的資料庫造成了資料修改,即使你使用了事務回滾註解。

高效的單元測試應該脫離資料庫,以滿足快速啟動完成測試、支援服務間呼叫的需求。可以通過如下幾點來對上述例子進行優化:

1. 啟動Spring會讓run->Junit Test的時候程式變慢,這是每次執行單元測試都很慢的原因之一。然後單元測試是隻針對某一個類的方法來測,啟動Spring很多時候是多餘的,所以我們只需要對應的實體類例項就夠了。在需要注入bean的時候,我們直接new。

private NoticeService noticeService = new NoticeService();

2. @SpringBootTest是在SpringBoot專案上使用的,它在@SpringBootContextLoader的基礎上,配置檔案屬性的讀取,會讀取、解析一些專案配置檔案,還會連線資料庫,然後如果啟動類又帶有別的啟動類、@Component、多執行緒等,而單元測試很多時候可以避免啟動SpringBoot,減少啟動所耗費的大量時間,即不使用@SpringBootTest註解。

3. 應當使用斷言來判斷單元測試結果是否符合預期。

4. @RunWith 在JUnit中有很多個Runner,他們負責呼叫具體測試程式碼,每一個Runner都有各自的特殊功能,你要根據需要選擇不同的Runner來執行你的測試程式碼,且一般都是使用SpringRunner.class。如果我們只是簡單的做普通Java測試,不涉及Spring Web專案,可以省略@RunWith註解,這樣系統會自動使用預設Runner來執行你的程式碼。

5.單元測試可以通過Mock資料的方式避開對資料庫的呼叫,減少很多資料庫連線的時間。Mock是模擬一切運算元據庫的步驟,不執行任何SQL,我們直接模擬這句運算元據庫的程式碼執行會是成功的,而且可以模擬任何返回值,主要有兩個註解。只要是本地的,自己寫的bean,都可以使用@MockBean,它會把所有運算元據庫的方法模擬。如果是沒有返回值的方法,我們就可以不管。如果是有返回值的方法,我們可以給它返回各自我們需要模擬的值。如果是我們本地,呼叫別的公司,別的地方給我們寫好的介面,不是操作我們自己的資料庫,是我們寫好入參,別人給我們返回值,我們就用@SpyBean。

Mock所需依賴如下:

<dependency>

<groupId>org.springframework.boot</groupId>

<artifactId>spring-boot-starter-test</artifactId>

<scope>test</scope>

</dependency>

通過以上優化,可以大大縮短我們單測的時間,提高我們開發效率。

最後:

可以到我的個人V:atstudy-js,可以免費領取一份10G軟體測試工程師面試寶典文件資料。以及相對應的視訊學習教程免費分享!其中包括了有基礎知識、Linux必備、Mysql資料庫、抓包工具、介面測試工具、測試進階-Python程式設計、Web自動化測試、APP自動化測試、介面自動化測試、測試高階持續整合、測試架構開發測試框架、效能測試等。

這些測試資料,對於做【軟體測試】的朋友來說應該是最全面最完整的備戰倉庫,這個倉庫也陪伴我走過了最艱難的路程,希望也能幫助到你!

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/31407649/viewspace-2903441/,如需轉載,請註明出處,否則將追究法律責任。

相關文章