日本综合一区二区|亚洲中文天堂综合|日韩欧美自拍一区|男女精品天堂一区|欧美自拍第6页亚洲成人精品一区|亚洲黄色天堂一区二区成人|超碰91偷拍第一页|日韩av夜夜嗨中文字幕|久久蜜综合视频官网|精美人妻一区二区三区

RELATEED CONSULTING
相關(guān)咨詢
選擇下列產(chǎn)品馬上在線溝通
服務(wù)時(shí)間:8:30-17:00
你可能遇到了下面的問(wèn)題
關(guān)閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營(yíng)銷解決方案
Java如何優(yōu)雅地實(shí)現(xiàn)單元測(cè)試與集成測(cè)試

本文轉(zhuǎn)載自微信公眾號(hào)「 無(wú)敵碼農(nóng)」,作者 無(wú)敵碼農(nóng)。轉(zhuǎn)載本文請(qǐng)聯(lián)系 無(wú)敵碼農(nóng)公眾號(hào)。

在日常的開(kāi)發(fā)過(guò)程中,為了保證代碼質(zhì)量,有追求的程序員一般都會(huì)對(duì)自己編寫的代碼進(jìn)行充分的測(cè)試,這種測(cè)試不僅僅是體現(xiàn)在對(duì)正常功能的簡(jiǎn)單接口調(diào)用,而是要根據(jù)代碼中的各種邏輯分支,進(jìn)行盡可能多的覆蓋性單元測(cè)試以及主要邏輯的集成測(cè)試。

上面說(shuō)到的測(cè)試對(duì)于程序員來(lái)說(shuō),絕不僅僅只是依賴于Postman之類的網(wǎng)絡(luò)工具,而要以編寫?yīng)毩⒌膯卧?集成測(cè)試代碼的方式來(lái)實(shí)現(xiàn),具體來(lái)說(shuō)在Java中就是要基于JUnit、Mocktio之類的測(cè)試框架編寫相應(yīng)的UT及IT代碼,并在這個(gè)過(guò)程中提前發(fā)現(xiàn)軟件Bug、重新審視所寫代碼并進(jìn)行優(yōu)化。

實(shí)話說(shuō)編寫測(cè)試代碼對(duì)提高軟件質(zhì)量,及自身編程水平來(lái)說(shuō)都是一種非常有用的手段。但在工作中,并不是所有人都能正確地掌握單元測(cè)試和集成測(cè)試代碼的寫法和組織形式。以Maven工程代碼為例,很多人會(huì)把單元測(cè)試和集成測(cè)試代碼弄混,這樣導(dǎo)致的后果就是大部分Maven工程代碼:"mvn test"幾乎很難跑通。

而本文想要表達(dá)的內(nèi)容就是如何在Maven工程中有效的區(qū)分和組織單元測(cè)試、集成測(cè)試代碼使得它們互不干擾,并具體演示它們的寫法。

Maven測(cè)試代碼結(jié)構(gòu)的組織

我們知道在Maven工程結(jié)構(gòu)中“src/test”目錄是專門用于存放測(cè)試代碼的,但令人痛苦的是Maven的標(biāo)準(zhǔn)目錄結(jié)構(gòu)只定義了這樣一個(gè)測(cè)試目錄,也就是說(shuō)它本身是無(wú)法單獨(dú)區(qū)分單元測(cè)試代碼和集成測(cè)試代碼的,這也是為什么很多人會(huì)把UT和IT代碼同時(shí)寫到"src/test"目錄而導(dǎo)致“mvn test”難以跑過(guò)的原因。

那么有什么辦法可以友好地解決這個(gè)問(wèn)題呢?在接下來(lái)的內(nèi)容中我們以Maven構(gòu)建Spring Boot項(xiàng)目為例來(lái)具體演示下在Maven中如何友好地分離UT及IT,具體步驟如下:

1)、首先我們創(chuàng)建一個(gè)基于Maven構(gòu)建的Spring Boot項(xiàng)目,代碼結(jié)構(gòu)如下圖所示:

如上圖所示,在規(guī)劃的目錄結(jié)構(gòu)中我們將IT的代碼目錄及資源文件目錄單獨(dú)分離在“src/integration-test”目錄下,默認(rèn)的“src/test”目錄還是作為存放UT代碼的目錄,而Maven在構(gòu)建的過(guò)程中默認(rèn)只運(yùn)行UT代碼。這樣即便IT代碼由于網(wǎng)絡(luò)、環(huán)境等原因無(wú)法正常執(zhí)行,但也不至于影響到UT代碼的運(yùn)行。

2)、創(chuàng)建區(qū)分UT、IT代碼的Maven Profiles文件

默認(rèn)情況下Maven是無(wú)法主動(dòng)識(shí)別“src/test”目錄之外的測(cè)試代碼的,所以當(dāng)我們將IT代碼抽象到"src/integration-test"目錄之后,需要通過(guò)編寫Maven Profiles文件來(lái)進(jìn)行區(qū)分,具體示意圖如下:

如上圖所示,我們可以在與“src”目錄平行創(chuàng)建一個(gè)“profiles”的目錄,其中分別用“dev”、“integration-test”目錄中的config.properties文件來(lái)進(jìn)行區(qū)分,其中dev目錄下的config.properties文件的內(nèi)容為:

 
 
 
 
  1. profile=dev 

而integration-test目錄中的config.properties文件則為:

 
 
 
 
  1. profile=integration-test

3)、通過(guò)pom.xml文件配置上述profiles文件生效規(guī)則

為了使得這些profiles文件生效,我們還需要在pom.xml文件中進(jìn)行相應(yīng)的配置。具體如下:

 
 
 
 
  1.  
  2.  
  3.      
  4.      
  5.         dev 
  6.          
  7.             true 
  8.          
  9.          
  10.             dev 
  11.              
  12.             true 
  13.             false 
  14.          
  15.      
  16.      
  17.      
  18.         integration-test 
  19.          
  20.             integration-test 
  21.              
  22.             false 
  23.             true 
  24.          
  25.      
  26.  

上述內(nèi)容先定義了區(qū)分dev及integration-test環(huán)境的的profile信息,接下來(lái)在build標(biāo)簽中定義資源信息及相關(guān)plugin,具體如下:

 
 
 
 
  1.  
  2.     ${project.artifactId} 
  3.      
  4.      
  5.         profiles/${build.profile.id}/config.properties 
  6.      
  7.      
  8.          
  9.             false 
  10.             src/main/java 
  11.              
  12.                 **/*.properties 
  13.                 **/*.xml 
  14.                 **/*.tld 
  15.                 **/*.yml 
  16.              
  17.          
  18.          
  19.          
  20.             true 
  21.             src/main/resources 
  22.              
  23.                 **/*.properties 
  24.                 **/*.xml 
  25.                 **/*.tld 
  26.                 **/*.yml 
  27.                 **/*.sh 
  28.              
  29.          
  30.      
  31.      
  32.          
  33.             org.springframework.boot 
  34.             spring-boot-maven-plugin 
  35.          
  36.          
  37.          
  38.             org.codehaus.mojo 
  39.             build-helper-maven-plugin 
  40.             3.1.0 
  41.              
  42.                  
  43.                  
  44.                     add-integration-test-sources 
  45.                     generate-test-sources 
  46.                      
  47.                         add-test-source 
  48.                      
  49.                      
  50.                          
  51.                          
  52.                             src/integration-test/java 
  53.                          
  54.                      
  55.                  
  56.                  
  57.                  
  58.                     add-integration-test-resources 
  59.                     generate-test-resources 
  60.                      
  61.                         add-test-resource 
  62.                      
  63.                      
  64.                          
  65.                          
  66.                              
  67.                                 true 
  68.                                 src/integration-test/resources 
  69.                                  
  70.                                     **/*.properties 
  71.                                  
  72.                              
  73.                          
  74.                      
  75.                  
  76.              
  77.          
  78.          
  79.          
  80.             org.apache.maven.plugins 
  81.             maven-surefire-plugin 
  82.             2.18 
  83.              
  84.                  
  85.                 ${skip.unit.tests} 
  86.                  
  87.                  
  88.                     **/IT*.java 
  89.                  
  90.              
  91.          
  92.          
  93.          
  94.             org.apache.maven.plugins 
  95.             maven-failsafe-plugin 
  96.             2.18 
  97.              
  98.                  
  99.                     integration-tests 
  100.                      
  101.                         integration-test 
  102.                         verify 
  103.                      
  104.                      
  105.                         ${skip.integration.tests} 
  106.                      
  107.                  
  108.              
  109.          
  110.      
  111.  

到這里我們就完成了基于Maven構(gòu)建的Spring Boot項(xiàng)目的UT及IT代碼目錄的分離配置,此時(shí)對(duì)UT代碼的執(zhí)行還是通過(guò)默認(rèn)“mvn test”命令,而集成測(cè)試代碼的運(yùn)行則可以通過(guò)如下命令:

 
 
 
 
  1. mvn clean verify -P integration-test 

單元測(cè)試代碼示例

通過(guò)前面的配置操作就完成了單元測(cè)試、集成測(cè)試代碼目錄的分離設(shè)置。在后續(xù)的開(kāi)發(fā)過(guò)程中只需要將相應(yīng)的測(cè)試代碼寫在對(duì)應(yīng)的測(cè)試目錄即可。接下來(lái)我們模擬一段業(yè)務(wù)邏輯并演示如何編寫其對(duì)應(yīng)的UT代碼。具體如下:

如上圖所示,參考MVC三層規(guī)范,我們編寫了一個(gè)接口邏輯,該接口Controller層接收Http請(qǐng)求后調(diào)用Service層進(jìn)行處理,而Service層處理邏輯時(shí)會(huì)調(diào)用Dao層操作數(shù)據(jù)庫(kù),并將具體信息插入數(shù)據(jù)庫(kù)。

那么我們編寫單元測(cè)試(UT)代碼時(shí),針對(duì)的是單獨(dú)的某個(gè)邏輯單元的測(cè)試,而不是從頭到位的整個(gè)邏輯,它的運(yùn)行不應(yīng)該依賴于任何網(wǎng)絡(luò)環(huán)境或其他組件,所有依賴的組件或網(wǎng)絡(luò)都應(yīng)該先進(jìn)行Mock。以單元測(cè)試TestServceImpl中的“saveTest”方法為例,其UT代碼編寫如下:

 
 
 
 
  1. @RunWith(SpringRunner.class) 
  2. @SpringBootTest(classes = TestServiceImpl.class) 
  3. @ActiveProfiles("test") 
  4. public class TestServiceImplTest { 
  5.  
  6.     @Autowired 
  7.     TestServiceImpl testServiceImpl; 
  8.  
  9.     @MockBean 
  10.     TestDao testDao; 
  11.  
  12.     @Test 
  13.     public void saveTest() { 
  14.         //調(diào)用測(cè)試方法 
  15.         testServiceImpl.saveTest("無(wú)敵碼農(nóng)微信公眾號(hào)"); 
  16.         //驗(yàn)證執(zhí)行測(cè)試的邏輯中是否調(diào)用過(guò)addUser方法 
  17.         verify(testDao).addUser(any()); 
  18.     } 

如上所示UT代碼,我們UT測(cè)試的主要對(duì)象為TestServiceImpl類,所以可以在@SpringBootTest注解中進(jìn)行范圍指定。而@ActiveProfiles("test")則表示代碼中所依賴的系統(tǒng)參數(shù),可以從測(cè)試資源目錄resouces/application-test.yml文件中獲得。

單元測(cè)試的主要目的是驗(yàn)證單元代碼內(nèi)的邏輯,對(duì)于所依賴的數(shù)據(jù)庫(kù)Dao組件并不是測(cè)試的范圍,但是沒(méi)有該Dao組件對(duì)象,UT代碼在執(zhí)行的過(guò)程中也會(huì)報(bào)錯(cuò),所以一般會(huì)通過(guò)@MockBean注解進(jìn)行組件Mock,以此解決UT測(cè)試過(guò)程中的代碼依賴問(wèn)題。此時(shí)運(yùn)行“mvn test”命令:

單元測(cè)試代碼得以正常執(zhí)行!

集成測(cè)試代碼示例

在Spring Boot中UT代碼的編寫方式與IT代碼類似,但是其執(zhí)行范圍是包括了整個(gè)上下文環(huán)境。我們以模擬從Controller層發(fā)起Http接口請(qǐng)求為例,來(lái)完整的測(cè)試整個(gè)接口的邏輯,并最終將數(shù)據(jù)存入數(shù)據(jù)庫(kù)。具體測(cè)試代碼如下:

 
 
 
 
  1. @RunWith(SpringRunner.class) 
  2. @SpringBootTest 
  3. @ActiveProfiles("test") 
  4. public class ITTestControllerTest { 
  5.  
  6.     @Autowired 
  7.     TestController testController; 
  8.  
  9.     @Test 
  10.     public void saveTest() { 
  11.         testController.saveTest("無(wú)敵碼農(nóng)微信公眾號(hào)"); 
  12.     } 

可以看到對(duì)于集成測(cè)試代碼在@SpringBootTest中并沒(méi)有指定具體的類,它的默認(rèn)執(zhí)行范圍為整個(gè)應(yīng)用的上下文環(huán)境。而代碼中的依賴組件由于整個(gè)應(yīng)用上下文都會(huì)被啟動(dòng),所以依賴上并不會(huì)報(bào)錯(cuò),可以理解為是一個(gè)正常啟動(dòng)的Spring Boot應(yīng)用。

需要注意的是由于IT代碼的目錄有獨(dú)立的資源配置,所以相關(guān)的依賴配置,如數(shù)據(jù)庫(kù)等需要在“src/integration-test/resouces/application-test.yml”文件中單獨(dú)配置,例如:

 
 
 
 
  1. spring:
  2.   application: 
  3.     name: springboot-test-demo 
  4.   #數(shù)據(jù)庫(kù)邏輯 
  5.   datasource: 
  6.     url: jdbc:mysql://127.0.0.1:3306/test 
  7.     username: root 
  8.     password: 123456 
  9.     type: com.alibaba.druid.pool.DruidDataSource 
  10.     driver-class-name: com.mysql.jdbc.Driver 
  11.     separator: // 
  12.  
  13. server: 
  14.   port: 8080 

此時(shí)運(yùn)行集成測(cè)試命令“mvn clean verify -P integration-test”:

可以看到執(zhí)行IT測(cè)試代碼得以正常執(zhí)行!

后記

本文著重介紹了在Java項(xiàng)目中如何編寫單元測(cè)試(UT)和集成測(cè)試(IT)代碼的工程實(shí)踐。在日常編寫代碼的過(guò)程中,良好的測(cè)試代碼編寫是一種非常好的習(xí)慣,一般來(lái)說(shuō)對(duì)于UT或IT代碼執(zhí)行錯(cuò)誤的工程,要求嚴(yán)格的團(tuán)隊(duì)會(huì)讓其構(gòu)建的過(guò)程中無(wú)法通過(guò),以此來(lái)嚴(yán)格要求團(tuán)隊(duì)成員。

原文鏈接:https://mp.weixin.qq.com/s/RT-KKT1BskUYEvYAXhms5A


網(wǎng)頁(yè)題目:Java如何優(yōu)雅地實(shí)現(xiàn)單元測(cè)試與集成測(cè)試
網(wǎng)頁(yè)路徑:http://www.dlmjj.cn/article/cdohssd.html