讀古今文學網 > Maven實戰 > 3.3 編寫測試代碼 >

3.3 編寫測試代碼

為了使項目結構保持清晰,主代碼與測試代碼應該分別位於獨立的目錄中。3.2節講過Maven項目中默認的主代碼目錄是src/main/java,對應地,Maven項目中默認的測試代碼目錄是src/test/java。因此,在編寫測試用例之前,應當先創建該目錄。

在Java世界中,由Kent Beck和Erich Gamma建立的JUnit是事實上的單元測試標準。要使用JUnit,首先需要為Hello World項目添加一個JUnit依賴,修改項目的POM如代碼清單3-3所示:

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

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

上述POM代碼中還有一個值為test的元素scope,scope為依賴範圍,若依賴範圍為test則表示該依賴只對測試有效。換句話說,測試代碼中的import JUnit代碼是沒有問題的,但是如果在主代碼中用import JUnit代碼,就會造成編譯錯誤。如果不聲明依賴範圍,那麼默認值就是compile,表示該依賴對主代碼和測試代碼都有效。

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

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

一個典型的單元測試包含三個步驟:1準備測試類及數據;2執行要測試的行為;3檢查結果。上述樣例首先初始化了一個要測試的HelloWorld實例,接著執行該實例的sayHello()方法並保存結果到result變量中,最後使用JUnit框架的Assert類檢查結果是否為我們期望的「Hello Maven」。在JUnit 3中,約定所有需要執行測試的方法都以test開頭,這裡使用了JUnit 4,但仍然遵循這一約定。在JUnit 4中,需要執行的測試方法都應該以@Test進行標注。

測試用例編寫完畢之後就可以調用Maven執行測試。運行mvn clean test:

不幸的是構建失敗了,先耐心分析一下這段輸出(為了本書的簡潔,一些不重要的信息用省略號略去了)。命令行輸入的是mvn clean test,而Maven實際執行的可不止這兩個任務,還有clean:clean、resources:resources、compiler:compile、resources:testResources以及compiler:testCompile。暫時需要瞭解的是,在Maven執行測試(test)之前,它會先自動執行項目主資源處理、主代碼編譯、測試資源處理、測試代碼編譯等工作,這是Maven生命週期的一個特性。本書後續章節會詳細解釋Maven的生命週期。

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

構建在執行compiler:testCompile任務的時候失敗了,Maven輸出提示我們需要使用-source 5或更高版本以啟動註釋,也就是前面提到的JUnit 4的@Test註解。這是Maven初學者常常會遇到的一個問題。由於歷史原因,Maven的核心插件之一——compiler插件默認只支持編譯Java 1.3,因此需要配置該插件使其支持Java 5,見代碼清單3-5。

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

該POM省略了除插件配置以外的其他部分。我們暫且不去關心插件配置的細節,只需要知道compiler插件支持Java 5的編譯。現在再執行mvn clean test,輸出如下:

我們看到compiler:testCompile任務執行成功了,測試代碼通過編譯之後在target/test-classes下生成了二進制文件,緊接著surefire:test任務運行測試,surefire是Maven中負責執行測試的插件,這裡它運行測試用例HelloWorldTest,並且輸出測試報告,顯示一共運行了多少測試,失敗了多少,出錯了多少,跳過了多少。顯然,我們的測試通過了。