Java中怎么實現(xiàn)單元測試與集成測試,針對這個問題,這篇文章詳細介紹了相對應的分析和解答,希望可以幫助更多想解決這個問題的小伙伴找到更簡單易行的方法。
創(chuàng)新互聯(lián)公司主營江津網(wǎng)站建設的網(wǎng)絡公司,主營網(wǎng)站建設方案,app軟件開發(fā)公司,江津h5微信小程序搭建,江津網(wǎng)站營銷推廣歡迎江津等地區(qū)企業(yè)咨詢
Maven測試代碼結(jié)構(gòu)的組織
我們知道在Maven工程結(jié)構(gòu)中“src/test”目錄是專門用于存放測試代碼的,但令人痛苦的是Maven的標準目錄結(jié)構(gòu)只定義了這樣一個測試目錄,也就是說它本身是無法單獨區(qū)分單元測試代碼和集成測試代碼的,這也是為什么很多人會把UT和IT代碼同時寫到"src/test"目錄而導致“mvn test”難以跑過的原因。
那么有什么辦法可以友好地解決這個問題呢?在接下來的內(nèi)容中我們以Maven構(gòu)建Spring Boot項目為例來具體演示下在Maven中如何友好地分離UT及IT,具體步驟如下:
1)、首先我們創(chuàng)建一個基于Maven構(gòu)建的Spring Boot項目,代碼結(jié)構(gòu)如下圖所示:
如上圖所示,在規(guī)劃的目錄結(jié)構(gòu)中我們將IT的代碼目錄及資源文件目錄單獨分離在“src/integration-test”目錄下,默認的“src/test”目錄還是作為存放UT代碼的目錄,而Maven在構(gòu)建的過程中默認只運行UT代碼。這樣即便IT代碼由于網(wǎng)絡、環(huán)境等原因無法正常執(zhí)行,但也不至于影響到UT代碼的運行。
2)、創(chuàng)建區(qū)分UT、IT代碼的Maven Profiles文件
默認情況下Maven是無法主動識別“src/test”目錄之外的測試代碼的,所以當我們將IT代碼抽象到"src/integration-test"目錄之后,需要通過編寫Maven Profiles文件來進行區(qū)分,具體示意圖如下:
如上圖所示,我們可以在與“src”目錄平行創(chuàng)建一個“profiles”的目錄,其中分別用“dev”、“integration-test”目錄中的config.properties文件來進行區(qū)分,其中dev目錄下的config.properties文件的內(nèi)容為:
profile=dev
而integration-test目錄中的config.properties文件則為:
profile=integration-test
3)、通過pom.xml文件配置上述profiles文件生效規(guī)則
為了使得這些profiles文件生效,我們還需要在pom.xml文件中進行相應的配置。具體如下:
dev true dev true false integration-test integration-test false true
上述內(nèi)容先定義了區(qū)分dev及integration-test環(huán)境的的profile信息,接下來在build標簽中定義資源信息及相關plugin,具體如下:
${project.artifactId} profiles/${build.profile.id}/config.properties false src/main/java **/*.properties **/*.xml **/*.tld **/*.yml true src/main/resources **/*.properties **/*.xml **/*.tld **/*.yml **/*.sh org.springframework.boot spring-boot-maven-plugin org.codehaus.mojo build-helper-maven-plugin 3.1.0 add-integration-test-sources generate-test-sources add-test-source add-integration-test-resources generate-test-resources add-test-resource true src/integration-test/resources **/*.properties org.apache.maven.plugins maven-surefire-plugin 2.18 ${skip.unit.tests} **/IT*.java org.apache.maven.plugins maven-failsafe-plugin 2.18 integration-tests integration-test verify ${skip.integration.tests}
到這里我們就完成了基于Maven構(gòu)建的Spring Boot項目的UT及IT代碼目錄的分離配置,此時對UT代碼的執(zhí)行還是通過默認“mvn test”命令,而集成測試代碼的運行則可以通過如下命令:
mvn clean verify -P integration-test
單元測試代碼示例
通過前面的配置操作就完成了單元測試、集成測試代碼目錄的分離設置。在后續(xù)的開發(fā)過程中只需要將相應的測試代碼寫在對應的測試目錄即可。接下來我們模擬一段業(yè)務邏輯并演示如何編寫其對應的UT代碼。具體如下:
如上圖所示,參考MVC三層規(guī)范,我們編寫了一個接口邏輯,該接口Controller層接收Http請求后調(diào)用Service層進行處理,而Service層處理邏輯時會調(diào)用Dao層操作數(shù)據(jù)庫,并將具體信息插入數(shù)據(jù)庫。
那么我們編寫單元測試(UT)代碼時,針對的是單獨的某個邏輯單元的測試,而不是從頭到位的整個邏輯,它的運行不應該依賴于任何網(wǎng)絡環(huán)境或其他組件,所有依賴的組件或網(wǎng)絡都應該先進行Mock。以單元測試TestServceImpl中的“saveTest”方法為例,其UT代碼編寫如下:
@RunWith(SpringRunner.class) @SpringBootTest(classes = TestServiceImpl.class) @ActiveProfiles("test") public class TestServiceImplTest { @Autowired TestServiceImpl testServiceImpl; @MockBean TestDao testDao; @Test public void saveTest() { //調(diào)用測試方法 testServiceImpl.saveTest("無敵碼農(nóng)微信公眾號"); //驗證執(zhí)行測試的邏輯中是否調(diào)用過addUser方法 verify(testDao).addUser(any()); } }
如上所示UT代碼,我們UT測試的主要對象為TestServiceImpl類,所以可以在@SpringBootTest注解中進行范圍指定。而@ActiveProfiles("test")則表示代碼中所依賴的系統(tǒng)參數(shù),可以從測試資源目錄resouces/application-test.yml文件中獲得。
單元測試的主要目的是驗證單元代碼內(nèi)的邏輯,對于所依賴的數(shù)據(jù)庫Dao組件并不是測試的范圍,但是沒有該Dao組件對象,UT代碼在執(zhí)行的過程中也會報錯,所以一般會通過@MockBean注解進行組件Mock,以此解決UT測試過程中的代碼依賴問題。此時運行“mvn test”命令:
單元測試代碼得以正常執(zhí)行!
集成測試代碼示例
在Spring Boot中UT代碼的編寫方式與IT代碼類似,但是其執(zhí)行范圍是包括了整個上下文環(huán)境。我們以模擬從Controller層發(fā)起Http接口請求為例,來完整的測試整個接口的邏輯,并最終將數(shù)據(jù)存入數(shù)據(jù)庫。具體測試代碼如下:
@RunWith(SpringRunner.class) @SpringBootTest @ActiveProfiles("test") public class ITTestControllerTest { @Autowired TestController testController; @Test public void saveTest() { testController.saveTest("無敵碼農(nóng)微信公眾號"); } }
可以看到對于集成測試代碼在@SpringBootTest中并沒有指定具體的類,它的默認執(zhí)行范圍為整個應用的上下文環(huán)境。而代碼中的依賴組件由于整個應用上下文都會被啟動,所以依賴上并不會報錯,可以理解為是一個正常啟動的Spring Boot應用。
需要注意的是由于IT代碼的目錄有獨立的資源配置,所以相關的依賴配置,如數(shù)據(jù)庫等需要在“src/integration-test/resouces/application-test.yml”文件中單獨配置,例如:
spring: application: name: springboot-test-demo #數(shù)據(jù)庫邏輯 datasource: url: jdbc:MySQL://127.0.0.1:3306/test username: root password: 123456 type: com.alibaba.druid.pool.DruidDataSource driver-class-name: com.mysql.jdbc.Driver separator: // server: port: 8080
此時運行集成測試命令“mvn clean verify -P integration-test”:
關于Java中怎么實現(xiàn)單元測試與集成測試問題的解答就分享到這里了,希望以上內(nèi)容可以對大家有一定的幫助,如果你還有很多疑惑沒有解開,可以關注創(chuàng)新互聯(lián)行業(yè)資訊頻道了解更多相關知識。