測試與整合測試

我們再用下列指令建立一個新專案

mvn archetype:generate -DarchetypeRepository=local \
-DarchetypeGroupId=com.github.kentyeh \
-DarchetypeArtifactId=springJdbiArch -DarchetypeVersion=4.0.3

專案識別與相關問題輸入完成後(後列階假設rtifactI為springJdbi3),這是一個整合Spring,Spring SecurityJDBI3 的專案.

這裡必須介紹整體較複雜的兩個Plugins.

首先是maven-failsafe-plugin,這個外掛與之前介紹過的maven-surefire-plugin兩者互為表裡(所以兩者的版本號會保持一致),maven-surefire-plugin著重在單元測試,而maven-failsafe-plugin注重在整合測試,顧名思義,單元測試針對每個函式進行輸入與輸出的測試,而整合測試則必須考慮測試標的的前後關係(如修改密碼前必須先登錄帳號)。

maven-failsafe-plugin最重要的Goal有兩個,一個是integration-test ,另一個就是verify,兩個Goal皆對綁定到同名的生命周期。

此專案是一個Web程式,依之前介紹過的直接執行程式,可以直接執行。

mvn jetty:run

由於我一貫性使用TestNG,所以設定檔指定了測試程式TestIntegration.java

<plugin>
  <artifactId>maven-failsafe-plugin</artifactId>
  <version>${surefire.version}</version>
  <configuration>
    <suiteXmlFiles>
      <suiteXmlFile>${project.build.testOutputDirectory}/testng-integration.xml</suiteXmlFile>
    </suiteXmlFiles>
  </configuration>
</plugin>

進行整合測試之前,我們應該先將Web Server上起來,而在測試程式完成後則應把Web Server關閉,所以我們必須將jetty-maven-plugin的啟動與關閉的Goal綁定到生命週期的pre-integration-testpost-integration-test

<plugin>
  <groupId>org.eclipse.jetty</groupId>
  <artifactId>jetty-maven-plugin</artifactId>
  <version>11.0.20</version>
  <executions>
    <execution>
      <id>start-jetty</id>
      <phase>pre-integration-test</phase><!--整合測試前-->
      <goals><goal>start</goal></goals><!--啟動Jetty-->
    </execution>
    <execution>
      <id>stop-jetty</id>
      <phase>post-integration-test</phase><!--整合測試後-->
      <goals><goal>stop</goal></goals><!--關閉Jetty-->
    </execution>
  </executions>
</plugin>

在整合測試期間,整個Web是處於可運作狀態,測試程式得以對Web進行測試。

在此程式,使用HtmlUnit進行Web測試。

HtmlUnit被稱作為 Headless Broser,也就是看不見的瀏覽器,但幾乎實作了完整的瀏覽器功能,重點是我們可以用程式操縱這個看不見的瀏覽器。可以想見,她很適合來寫爬蟲程式。

HtmlUnit的缺點也是看不見,所以很難想像,畫面執行是長什麼樣子,為了彌補這個缺陷,我通常建立在您常用的瀏覽器加裝Selenium IDE這個外掛(火狐孔龍妹Edge),可記錄瀏覽器執行過程並重播(當然測試,免不了要自行編寫一些Assertion)。

Selenium IDE工具其實還支持將她的測試腳本匯出為程式碼(Java),讓程式碼直接操縱瀏覽器直接進行整合測試,然後直接在程式裡直接Assertion,我不建議這麼作(雖然還蠻炫的),因為這樣做的缺點也很明顯-綁特定的瀏覽器,在多人開發環境下是無法保證大家都預設用同款瀏覽器。

所以我備們直接執行下列指令進行整點測試與確認吧

mvn verify

或者只要進行整合測試

mvn integration-test