單元測試效率優化:為什麼要對程式進行測試?測試有什麼好處?
單元測試(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/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 介面測試要測試什麼?
- 進行軟體介面測試有什麼作用?哪家軟體測試公司服務好?
- 程式設計師為什麼不寫單元測試?程式設計師
- 軟體為什麼要進行安全測試?可做安全測試的軟體檢測公司安利
- 軟體自動化測試的作用有哪些?為什麼要選擇專業軟體測試公司進行?
- Twitter的A/B測試實踐(一):為什麼要測試以及測試的意義
- 為什麼要進行軟體測試需求分析?廣東權威的軟體測試公司有哪些?
- 軟體測評中心簡要分析:為什麼要進行軟體效能測試?
- 效能測試、負載測試、壓力測試有什麼區別?負載
- 安卓測試跟ios 測試有什麼區別?安卓iOS
- 軟體相容性測試怎麼進行?相容性測試有什麼作用?
- 什麼是滲透測試?網站有必要進行滲透測試嗎?網站
- 軟體測試要學什麼(5)效能測試大綱
- 軟體自動化測試有什麼優勢?自動化測試框架有哪些?框架
- 遊戲測試和軟體測試有什麼區別?遊戲
- 為什麼要參加軟體測試培訓?有哪些優勢?
- 介面測試的價值(為什麼要做介面測試)
- 既然測試地位不高,為什麼你還要做測試?
- 什麼是測試左移和測試右移
- 單元測試-mock使用應該注意什麼Mock
- 什麼情況下進行效能測試
- 軟體測試要學什麼(1)黑盒測試詳解教程
- 安卓單元測試 (十一):非同步程式碼怎麼測試安卓非同步
- 【伺服器】當我們對伺服器進行測試,我們測試什麼?伺服器
- 縱觀整個測試行業,為什麼優秀的測試人員不到20%?行業
- ? python 介面自動化 (二)--什麼是介面測試、為什麼要做介面測試 (詳解)Python
- 軟體測評中心▏效能測試、壓力測試、負載測試有什麼區別?負載
- 軟體測試為什麼需要自動化測試框架?權威軟體測試公司分享框架
- Android單元測試(2):再來談談為什麼Android
- 為什麼要做介面測試?可做介面測試的軟體測試公司分享
- 測試 之Java單元測試、Android單元測試JavaAndroid
- 自動化測試落地為什麼那麼難
- 軟體測試要學什麼(2)白盒測試詳解教程
- 軟體測試要學什麼(3)軟體測試流程詳解
- [譯]對 React 元件進行單元測試React元件
- 自動化測試是什麼?什麼軟體專案適合自動化測試?
- APP測試和傳統軟體測試有什麼區別APP
- 什麼是滲透測試和安全測試,有何區別?