@SpringBootTest加速單元測試小訣竅
Pre
隨著代碼量的爭奪,測試類的啟動速度變得越來越慢,而大多數情況下只是為了測試一下某個實現類的某個方法而已,比如測試一個DAO層的方法,卻要啟動這個應用。
今天我們繼續深入了解一下 稍微高級一點的用法
classes
classes 屬性用來指定運行測試類需要裝載的 class 集合,如果不指定,那么會默認裝載 @SpringBootConfiguration 注解標注的類。
如果不指定classes屬性,那么啟動測試類時需要加載的Bean的數量和正常啟動一次入口類加載的 Bean 數量是一樣的。
如果你的項目中有很多個 Bean, 特別是有以下幾種時:
- 有 CommandLineRunner 的實現類
- 用 @PostConstruct 注解指定了初始化方法的類
這幾種類在程序初始化的過程中都會運行自身的業務代碼或者初始化代碼,從而延后了測試方法的運行。
在這種情況下,我們在編寫測試類的時候,如果明確這個測試類會用到哪幾個 Bean,則可以在 classes 屬性處指定,之后啟動測試類的時候,就只會加載需要的 Bean 到上下文中,從而加快啟動速度。比如:
用法
@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.NONE, classes={ArtisanServiceImpl.class})
webEnvironment
這個屬性的含義是說測試類要不要啟動一個 web 環境, 要不要啟動一個 Tomcat 容器,可選的值為:
- MOCK:啟動一個模擬的 Servlet 環境, 默認值。
- RANDOM_PORT:啟動一個 Tomcat 容器,并監聽一個隨機的端口號
- DEFINED_PORT:啟動一個 Tomcat 容器,并監聽配置文件中定義的端口(未定義則默認監聽8080)
- NONE:不啟動 Tomcat 容器
怎么使用呢? 舉個例子 如果你要測試的方法不需要用到 Tomcat 容器,比如:
- 測試 DAO 類的CRUD
- 測試Service 類的業務方法
- 測試工具類的公用方法
- 測試配置文件類是否讀取到了正確的值
- …
用法
只需要通過指定
@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.NONE)
即可達到加速的效果。這時測試類啟動時就只會初始化 Spring 上下文,不再啟動 Tomcat 容器了:
@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.NONE) public class ArtisanServiceTests { @Autowired private IArtisanSerive artisanService; @Test public void test() { // ... } }
@記錄使用SpringBootTest遇到的坑
導入junit依賴,運行會報錯
這里變紅了,只需要spring-boot-starter-test依賴就好
刪掉junit依賴
運行成功!
以上為個人經驗,希望能給大家一個參考,也希望大家多多支持服務器之家。
原文鏈接:https://artisan.blog.csdn.net/article/details/117232544