qileilove

          blog已經(jīng)轉(zhuǎn)移至github,大家請(qǐng)?jiān)L問 http://qaseven.github.io/

          maven編寫主代碼與測試代碼

          3.2 編寫主代碼 

           

          項(xiàng)目主代碼和測試代碼不同,項(xiàng)目的主代碼會(huì)被打包到最終的構(gòu)件中(比如jar),而測試代碼只在運(yùn)行測試時(shí)用到,不會(huì)被打包。默認(rèn)情況下,Maven假設(shè)項(xiàng)目主代碼位于src/main/java目錄,我們遵循Maven的約定,創(chuàng)建該目錄,然后在該目錄下創(chuàng)建文件com/juvenxu/mvnbook/helloworld/HelloWorld.java,其內(nèi)容如代碼清單3-2

          代碼清單3-2Hello World的主代碼

          Java代碼  收藏代碼
          1. <span style="font-size: small;">package com.juvenxu.mvnbook.helloworld;  
          2.    
          3. public class HelloWorld  
          4. {  
          5.    public String sayHello()  
          6.    {  
          7.      return "Hello Maven";  
          8.    }  
          9.   
          10.   public static void main(String[] args)  
          11.    {  
          12.      System.out.print( new HelloWorld().sayHello() );  
          13.    }  
          14. }  
          15. </span>  

                 這是一個(gè)簡單的Java類,它有一個(gè)sayHello()方法,返回一個(gè)String。同時(shí)這個(gè)類還帶有一個(gè)main方法,創(chuàng)建一個(gè)HelloWorld實(shí)例,調(diào)用sayHello()方法,并將結(jié)果輸出到控制臺(tái)。

          關(guān)于該Java代碼有兩點(diǎn)需要注意。首先,在95%以上的情況下,我們應(yīng)該把項(xiàng)目主代碼放到src/main/java/目錄下(遵循Maven的約定),而無須額外的配置,Maven會(huì)自動(dòng)搜尋該目錄找到項(xiàng)目主代碼。其次,該Java類的包名是com.juvenxu.mvnbook.helloworld,這與我們之前在POM中定義的groupIdartifactId相吻合。一般來說,項(xiàng)目中Java類的包都應(yīng)該基于項(xiàng)目的groupIdartifactId,這樣更加清晰,更加符合邏輯,也方便搜索構(gòu)件或者Java類。

          代碼編寫完畢后,我們使用Maven進(jìn)行編譯,在項(xiàng)目根目錄下運(yùn)行命令 mvn clean compile ,我們會(huì)得到如下輸出:


          Java代碼  收藏代碼
          1. <span style="font-size: small;">[INFO] Scanning for projects...  
          2. [INFO] ------------------------------------------------------------------------  
          3. [INFO] Building Maven Hello World Project  
          4. [INFO]    task-segment: [clean, compile]  
          5. [INFO] ------------------------------------------------------------------------  
          6. [INFO] [clean:clean {execution: default-clean}]  
          7. [INFO] Deleting directory D:\code\hello-world\target  
          8. [INFO] [resources:resources {execution: default-resources}]  
          9. [INFO] skip non existing resourceDirectory D: \code\hello-world\src\main\resources  
          10. [INFO] [compiler:compile {execution: default-compile}]  
          11. [INFO] Compiling 1 source file to D: \code\hello-world\target\classes  
          12. [INFO] ------------------------------------------------------------------------  
          13. [INFO] BUILD SUCCESSFUL  
          14. [INFO] ------------------------------------------------------------------------  
          15. [INFO] Total time: 1 second  
          16. [INFO] Finished at: Fri Oct 09 02:08:09 CST 2009  
          17. [INFO] Final Memory: 9M/16M  
          18. [INFO] ------------------------------------------------------------------------  
          19. </span>  

           

          clean告訴Maven清理輸出目錄target/,compile告訴Maven編譯項(xiàng)目主代碼,從輸出中我們看到Maven首先執(zhí)行了clean:clean任務(wù),刪除target/目錄,默認(rèn)情況下Maven構(gòu)建的所有輸出都在target/目錄中;接著執(zhí)行resources:resources任務(wù)(未定義項(xiàng)目資源,暫且略過);最后執(zhí)行compiler:compile任務(wù),將項(xiàng)目主代碼編譯至target/classes目錄(編譯好的類為com/juvenxu/mvnbook/helloworld/HelloWorld.Class)。

          上文提到的clean:clean、resources:resources,以及compiler:compile對(duì)應(yīng)了一些Maven插件及插件目標(biāo),比如clean:cleanclean插件的clean目標(biāo),compiler:compilecompiler插件的compile目標(biāo),后文會(huì)詳細(xì)講述Maven插件及其編寫方法。

          至此,Maven在沒有任何額外的配置的情況下就執(zhí)行了項(xiàng)目的清理和編譯任務(wù),接下來,我們編寫一些單元測試代碼并讓Maven執(zhí)行自動(dòng)化測試。

          3.3 編寫測試代碼 Top


           

          為了使項(xiàng)目結(jié)構(gòu)保持清晰,主代碼與測試代碼應(yīng)該分別位于獨(dú)立的目錄中。3.2節(jié)講過Maven項(xiàng)目中默認(rèn)的主代碼目錄是src/main/java,對(duì)應(yīng)地,Maven項(xiàng)目中默認(rèn)的測試代碼目錄是src/test/java。因此,在編寫測試用例之前,我們先創(chuàng)建該目錄。

          在Java世界中,由Kent Beck和Erich Gamma建立的JUnit是事實(shí)上的單元測試標(biāo)準(zhǔn)。要使用JUnit,我們首先需要為Hello World項(xiàng)目添加一個(gè)JUnit依賴,修改項(xiàng)目的POM如代碼清單3-3:

          代碼清單3-3:為Hello World的POM添加依賴

          Java代碼  收藏代碼
          1. <?xml version="1.0" encoding="UTF-8"?>  
          2. <project xmlns="http://maven.apache.org/POM/4.0.0"  
          3.          xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"  
          4.          xsi:schemaLocation="http://maven.apache.org/POM/4.0.0  
          5. http://maven.apache.org/maven-v4_0_0.xsd">  
          6.   <modelVersion>4.0.0</modelVersion>  
          7.   <groupId>com.juvenxu.mvnbook</groupId>  
          8.   <artifactId>hello-world</artifactId>  
          9.   <version>1.0-SNAPSHOT</version>  
          10.   <name>Maven Hello World Project</name>  
          11.   <dependencies>  
          12.     <dependency>  
          13.        <groupId>junit</groupId>  
          14.        <artifactId>junit</artifactId>  
          15.        <version>4.7</version>  
          16.        <scope>test</scope>  
          17.     </dependency>  
          18.   </dependencies>  
          19. </project>    

               代碼中添加了dependencies元素,該元素下可以包含多個(gè)dependency元素以聲明項(xiàng)目的依賴,這里我們添加了一個(gè)依賴——groupId是junit,artifactId是junit,version是4.7。前面我們提到groupId、artifactId和version是任何一個(gè)Maven項(xiàng)目最基本的坐標(biāo),JUnit也不例外,有了這段聲明,Maven就能夠自動(dòng)下載junit-4.7.jar。也許你會(huì)問,Maven從哪里下載這個(gè)jar呢?在Maven之前,我們可以去JUnit的官網(wǎng)下載分發(fā)包。而現(xiàn)在有了Maven,它會(huì)自動(dòng)訪問中央倉庫(http://repo1.maven.org/maven2/),下載需要的文件。讀者也可以自己訪問該倉庫,打開路徑j(luò)unit/junit/4.7/,就能看到j(luò)unit-4.7.pom和junit-4.7.jar。本書第6章會(huì)詳細(xì)介紹Maven倉庫及中央倉庫。

          上述POM代碼中還有一個(gè)值為test的元素scope,scope為依賴范圍,若依賴范圍為test則表示該依賴只對(duì)測試有效,換句話說,測試代碼中的import JUnit代碼是沒有問題的,但是如果我們?cè)谥鞔a中用import JUnit代碼,就會(huì)造成編譯錯(cuò)誤。如果不聲明依賴范圍,那么默認(rèn)值就是compile,表示該依賴對(duì)主代碼和測試代碼都有效。

          配置了測試依賴,接著就可以編寫測試類,回顧一下前面的HelloWorld類,現(xiàn)在我們要測試該類的sayHello()方法,檢查其返回值是否為“Hello Maven”。在src/test/java目錄下創(chuàng)建文件,其內(nèi)容如代碼清單3-4:

          代碼清單3-4:Hello World的測試代碼

           

          Java代碼  收藏代碼
          1. package com.juvenxu.mvnbook.helloworld;  
          2. import static org.junit.Assert.assertEquals;  
          3. import org.junit.Test;  
          4.   
          5. public class HelloWorldTest  
          6. {  
          7.     @Test  
          8.     public void testSayHello()  
          9.     {  
          10.         HelloWorld helloWorld = new HelloWorld();  
          11.   
          12.         String result = helloWorld.sayHello();  
          13.   
          14.         assertEquals( "Hello Maven", result );  
          15.     }  
          16. }   

          一個(gè)典型的單元測試包含三個(gè)步驟:一,準(zhǔn)備測試類及數(shù)據(jù);二,執(zhí)行要測試的行為;三,檢查結(jié)果。上述樣例中,我們首先初始化了一個(gè)要測試的HelloWorld實(shí)例,接著執(zhí)行該實(shí)例的sayHello()方法并保存結(jié)果到result變量中,最后使用JUnit框架的Assert類檢查結(jié)果是否為我們期望的”Hello Maven”。在JUnit 3中,約定所有需要執(zhí)行測試的方法都以test開頭,這里我們使用了JUnit 4,但我們?nèi)匀蛔裱@一約定,在JUnit 4中,需要執(zhí)行的測試方法都應(yīng)該以@Test進(jìn)行標(biāo)注。

          測試用例編寫完畢之后就可以調(diào)用Maven執(zhí)行測試,運(yùn)行 mvn clean test :

           

          Java代碼  收藏代碼
          1. [INFO] Scanning for projects...  
          2. [INFO] ------------------------------------------------------------------------  
          3. [INFO] Building Maven Hello World Project  
          4. [INFO]    task-segment: [clean, test]  
          5. [INFO] ------------------------------------------------------------------------  
          6. [INFO] [clean:clean {execution: default-clean}]  
          7. [INFO] Deleting directory D:\git-juven\mvnbook\code\hello-world\target  
          8. [INFO] [resources:resources {execution: default-resources}]  
          9. …  
          10. Downloading: http://repo1.maven.org/maven2/junit/junit/4.7/junit-4.7.pom  
          11. 1K downloaded  (junit-4.7.pom)  
          12. [INFO] [compiler:compile {execution: default-compile}]  
          13. [INFO] Compiling 1 source file to D: \code\hello-world\target\classes  
          14. [INFO] [resources:testResources {execution: default-testResources}]  
          15. …  
          16. Downloading: http://repo1.maven.org/maven2/junit/junit/4.7/junit-4.7.jar  
          17. 226K downloaded  (junit-4.7.jar)  
          18. [INFO] [compiler:testCompile {execution: default-testCompile}]  
          19. [INFO] Compiling 1 source file to D:\ code\hello-world\target\test-classes  
          20. [INFO] ------------------------------------------------------------------------  
          21. [ERROR] BUILD FAILURE  
          22. [INFO] ------------------------------------------------------------------------  
          23. [INFO] Compilation failure  
          24. D:\code\hello-world\src\test\java\com\juvenxu\mvnbook\helloworld\HelloWorldTest.java:[8,5] -source 1.3 中不支持注釋  
          25. (請(qǐng)使用 -source 5 或更高版本以啟用注釋)  
          26.     @Test  
          27. [INFO] ------------------------------------------------------------------------  
          28. [INFO] For more information, run Maven with the -e switch  
          29.   …  
           

          不幸的是構(gòu)建失敗了,不過我們先耐心分析一下這段輸出(為了本書的簡潔,一些不重要的信息我用省略號(hào)略去了)。命令行輸入的是mvn clean test,而Maven實(shí)際執(zhí)行的可不止這兩個(gè)任務(wù),還有clean:clean、resources:resources、compiler:compile、resources:testResources以及compiler:testCompile。暫時(shí)我們需要了解的是,在Maven執(zhí)行測試(test)之前,它會(huì)先自動(dòng)執(zhí)行項(xiàng)目主資源處理,主代碼編譯,測試資源處理,測試代碼編譯等工作,這是Maven生命周期的一個(gè)特性,本書后續(xù)章節(jié)會(huì)詳細(xì)解釋Maven的生命周期。

          從輸出中我們還看到:Maven從中央倉庫下載了junit-4.7.pom和junit-4.7.jar這兩個(gè)文件到本地倉庫(~/.m2/repository)中,供所有Maven項(xiàng)目使用。

          構(gòu)建在執(zhí)行compiler:testCompile任務(wù)的時(shí)候失敗了,Maven輸出提示我們需要使用-source 5或更高版本以啟動(dòng)注釋,也就是前面提到的JUnit 4的@Test注解。這是Maven初學(xué)者常常會(huì)遇到的一個(gè)問題。由于歷史原因,Maven的核心插件之一compiler插件默認(rèn)只支持編譯Java 1.3,因此我們需要配置該插件使其支持Java 5,見代碼清單3-5:

          代碼清單3-5:配置maven-compiler-plugin支持Java 5

           

          Java代碼  收藏代碼
          1. <project>  
          2. …  
          3.   <build>  
          4.     <plugins>  
          5.        <plugin>  
          6.          <groupId>org.apache.maven.plugins</groupId>  
          7.          <artifactId>maven-compiler-plugin</artifactId>  
          8.          <configuration>  
          9.            <source>1.5</source>  
          10.            <target>1.5</target>  
          11.          </configuration>  
          12.        </plugin>  
          13.     </plugins>  
          14.   </build>  
          15. …  
          16. </project>    

          該P(yáng)OM省略了除插件配置以外的其他部分,我們暫且不去關(guān)心插件配置的細(xì)節(jié),只需要知道compiler插件支持Java 5的編譯?,F(xiàn)在再執(zhí)行mvn clean test,輸出如下:

           

          Java代碼  收藏代碼
          1. …  
          2. [INFO] [compiler:testCompile {execution: default-testCompile}]  
          3. [INFO] Compiling 1 source file to D: \code\hello-world\target\test-classes  
          4. [INFO] [surefire:test {execution: default-test}]  
          5. [INFO] Surefire report directory: D:\code\hello-world\target\surefire-reports  
          6. -------------------------------------------------------  
          7.  T E S T S  
          8. -------------------------------------------------------  
          9. Running com.juvenxu.mvnbook.helloworld.HelloWorldTest  
          10. Tests run: 1, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.055 sec  
          11. Results :  
          12. Tests run: 1, Failures: 0, Errors: 0, Skipped: 0  
          13. [INFO] ------------------------------------------------------------------------  
          14. [INFO] BUILD SUCCESSFUL  
          15. [INFO] ------------------------------------------------------------------------  
          16. …  

          我們看到compiler:testCompile任務(wù)執(zhí)行成功了,測試代碼通過編譯之后在target/test-classes下生成了二進(jìn)制文件,緊接著surefire:test任務(wù)運(yùn)行測試,surefire是Maven世界中負(fù)責(zé)執(zhí)行測試的插件,這里它運(yùn)行測試用例HelloWorldTest,并且輸出測試報(bào)告,顯示一共運(yùn)行了多少測試,失敗了多少,出錯(cuò)了多少,跳過了多少。顯然,我們的測試通過了——BUILD SUCCESSFUL。

          posted on 2014-03-06 11:39 順其自然EVO 閱讀(10379) 評(píng)論(0)  編輯  收藏 所屬分類: maven

          <2025年6月>
          25262728293031
          1234567
          891011121314
          15161718192021
          22232425262728
          293012345

          導(dǎo)航

          統(tǒng)計(jì)

          常用鏈接

          留言簿(55)

          隨筆分類

          隨筆檔案

          文章分類

          文章檔案

          搜索

          最新評(píng)論

          閱讀排行榜

          評(píng)論排行榜

          主站蜘蛛池模板: 黄骅市| 兴文县| 来宾市| 富平县| 自贡市| 花莲市| 卓资县| 浠水县| 滨州市| 丰县| 石门县| 河北省| 西安市| 阿勒泰市| 北流市| 潞西市| 马龙县| 贵阳市| 贵州省| 防城港市| 天全县| 漳浦县| 侯马市| 麻栗坡县| 宜城市| 镇赉县| 太白县| 宜丰县| 西和县| 平昌县| 临猗县| 化州市| 洮南市| 浏阳市| 广平县| 灵宝市| 太康县| 西平县| 陆丰市| 红安县| 六安市|