2007年6月17日 星期日

(2005.10月號-141期)_CanooWebTest實作(上)01

當程式中的元件一步一步接近完成的狀態,開發人員可將這些元件整合成為系統的部份功能,這些功能將會是系統規範Use Case中的一部份,功能測試的目的就在於對這些組件進行驗證並回饋結果。




序言

功能測試是根據軟體的功能設計規格,於系統上進行測試,以證實每個現存的功能是否符合要求,功能測試與單元測試的不同處在於功能測試是從使用者的角度來編寫的。這些測試保證系統能夠按照使用者所期望的那樣去運行,並且注重使用者所感興趣的系統功能。

功能測試屬於黑箱測試的一種,黑箱測試則意味著測試要在軟體的介面處進行。也就是說,這種方法是把測試物件看做一個黑箱子,測試人員完全不考慮程式內部的邏輯結構和內部特性,只依據程式的需求分析規格說明,檢查程式的功能是否符合它的功能說明。

但由於其天生的複雜性,Web應用程式的功能測試常是繁雜且令人生畏的工作,因為其中有太多的使用者行為,若將這些行為複製似乎是很困難的。在這裏所會面臨的是開發人員必須撰寫程式碼來進行各種不同的行為排列組合的驗證。

Java語言進行開發的領域中,進行功能測試,主要都是基於HttpUnit為基礎作延伸,而HttpUnit協助開發人員對於HTTP RequestResponse的程式進行功能單元測試或是功能測試,基本上HttpUnit本身並不是測試工具,而是協助開發人員進行HTTP請求,然後對回應的結果作驗證,並搭配 JUnit來進行測試。

雖然HttpUnit提供了基礎上的支援,從這個基礎當中開發人員可以建構複雜的測試邏輯。但以這種方式進行功能測試卻是有些不切實際的,筆者之前提過功能測試是從使用者的角度來編寫的,在極端軟體製程中也強調功能測試是為並且大部分由客戶所撰寫的,以便從客戶獲得系統狀態的回饋。若進行功能測試的人員還必須了解程式語言並以硬編碼的方式進行測試的話,似乎就有違黑箱測試的意義了。

理想上,功能測試的應用應該以HttpUnit為基礎進行封裝,依據功能測試的需求提供測試介面,例如以XML腳本的方式作為與系統溝通的請求與回應介面,為HttpUnit測試建立XML腳本。腳本定義哪一個網頁以哪一種順序被執行,及對執行結果要如何進行驗證。每當有新的功能完成,便撰寫一個新的腳本。如此一來,測試人員只需了解簡單的腳本規範即可進行複雜的功能測試了。

在本期中筆者將介紹基於上述概念協助開發人員進行功能測試的套件Canoo WebTest

Canoo WebTest簡介

WebTest是由Canoo公司開發並且基礎於HttpUnit之上的開放原始碼測試工具,有興趣的讀者可至http://webtest.canoo.com/manual/WebTestHome.html的官方網站查看最新版本與下載原始碼,到目前為止最新版本為基於HttpUnit 1.6版本開發的為WebTest 1.6版。

1 官方網站提供的下載檔案

檔名

說明

build.zip

完整的建置版本,包含了執行WebTest時所需的jar檔。

doc.zip

完整的說明文件與WebTest自身測試範本。

src.zip

使用ANT建置的原始碼。

selftest.war

WebTest自身測試用範例war檔,可佈署於Servlet Container中進行測試。

當讀者下載相關檔案之後,可依照doc.zip中的文件說明使用ANT進行WebTest的建置與自動化測試,在本期內容中筆者並不打算照官方文件依樣畫葫蘆來做重覆性的說明,在此我將以Maven進行WebTest的整合,協助讀者進行測試並且更加熟悉Maven的使用。

註:關於Maven環境建置,請參考八月份RunPC文章,建置企業專案使用Maven


使用Maven Canoo WebTest Plug-in

MavenApache的專案管理、構建、部署工具,Maven的基本概念就是專案物件模型 (Project Object ModelPOM) 描述專案的各個方面,並且對於Maven不足的功能也能夠使用Plug-in的方式進行擴充。

Maven Canoo WebTest Plug-in是位於Sourceforge.net所提供的Plug-in套件,讀者可自行在http://maven-plugins.sourceforge.net/maven-webtest-plugin網址下載或透過MavenGoal進行下載並安裝,在Console下執行maven plugin:download -DgroupId=maven-plugins -DartifactId=maven-webtest-plugin -Dversion=1.0即可完成Maven Canoo WebTest Plug-in的安裝,參考圖1

接著我們必須建置MavenPOM相關設定並給予WebTest所需的參數。讀者可自行透過MavenGoal執行genapp後再修改成符合WebTest的設定或跟隨筆者自行建立POM以便於更了解Maven

在本次的內容中將繼續以前二期的範例程式JPetStore作為我們的範例,建立如資料結構1的結構, 並撰寫設定1到設定4Maven設定檔project.xmlproject.propertiesWebTest設定檔set.init.entset.config.ent

關於project.xml的結構於之前文章中已有說明,並且在此次的範例中無java程式碼,無需相依其他的jar檔因此在<dependencies><build>標籤中不需任何設定。

project.properties檔中則必須依照WebTest的需求進行設定,參考表2,其他相關Properties請參考http://maven-plugins.sourceforge.net/maven-webtest-plugin/properties.html 的說明。

set.init.ent檔中眼尖的讀者應該可以發現< taskdef >這不是ANT的定義客製化標籤嗎?沒錯,事實上WebTest的測試腳本是基於ANT自定標籤技術的實現,在此只須依參考設定3撰寫,在等會的實作中將會以XML實體檔的方式作引入。

set.config.ent檔與set.init.ent相同,都是在下一步的實作中作引入的設定,不同的是< config >標籤除了與先前的project.properties設定對應之外還可以加入Http header的相關參數,這在針對header進行特別處理的網頁測試上相當有用,如設定4註解處。

2 WebTest Plug-in 須設定的Properties

屬性

說明

maven.webtest.config.host

進行webtest的測試主機位址,預設為localhost

maven.webtest.config.port

進行webtest的測試主機通訊埠,預設為80port

maven.webtest.config.protocol

進行webtest的通訊協定,例如httphttps,預設為http

maven.webtest.config.basepath

進行webtestcontext路徑,在本例中使用jpetstore

maven.webtest.src

webtest測試腳本檔放置路徑,預設為${basedir}/webtest,在本例中使用預設路徑,因此在project.properties檔中將其註解。


1 Maven Canoo WebTest Plug-in安裝。

資料結構1

Jpetstore_WebTest

+--webtest 放置webtest腳本檔資料夾

| +--modules 測試用模組放置資料夾

| +--set.init.ent webtest初始化設定

| +--set.config.ent webtest測試網站設定

+--project.properties 專案屬性檔

+--project.xml Project Object Model,POM

設定1 project.xml

<?xml version="1.0" encoding="UTF-8"?>

<project>

<pomVersion>3</pomVersion>

<groupId>jpetstore</groupId>

<id>jpetstore</id>

<name>JPetStore Application</name>

<currentVersion>1.0</currentVersion>

<dependencies></dependencies>

<build></build>

</project>

設定2 project.properties

# -------------------------------------------------------------------

# for Canoo WebTest plugin.

# -------------------------------------------------------------------

# Source directory of Canoo Webtest scripts

#maven.webtest.src=${basedir}/src/webtest

# Settings for Canoo Webtest Configuration

maven.webtest.config.host=localhost

maven.webtest.config.port=8080

maven.webtest.config.protocol=http

maven.webtest.config.basepath=jpetstore

設定3 set.init.ent

<taskdef file="${webtest.home}/webtestTaskdefs.properties">

<classpath>

<fileset dir="${webtest.home}">

<include name="lib/*.jar"/>

<include name="lib/base/*.jar"/>

</fileset>

<pathelement path="${webtest.home}/lib"/>

</classpath>

</taskdef>

設定4 set.config.ent

<config

host="${host}"

port="${port}"

protocol="${protocol}"

basepath="${basepath}"

summary="${summary}"

saveresponse="${saveresponse}"

resultpath="${resultpath}"

resultfile="${resultfile}"

haltonfailure="${haltonfailure}"

haltonerror="${haltonerror}"

showhtmlparseroutput="${showhtmlparseroutput}"

autorefresh="${autorefresh}"

>

<!--

<header name="user-agent" value="Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.0; MyIE2)"/>

<header name="accept-encoding" value="gzip, deflate"/>

<header name="accept-language" value="zh-tw,en-us;q=0.7,zh-cn;q=0.3"/>

<header name="connection" value="Keep-Alive"/>

<header name="locale" value="zh_TW"/>

-->

</config>

當完成設定後,可以開始寫第一個腳本檔了,參考腳本檔1,從該檔中不難發現,這不就是ANTXML格式嗎!這就更加印證了WebTest的測試腳本是基於ANT自定標籤技術的實現,並且更能熟悉Maven的好處,Maven可透過Plug-in進行不同技術的整合,包括ANT

在腳本檔1webtest.xml中將set.init.ent與set.config.ent透過XML使用ENTITY的方式進行引入,並在<project>標籤一開始就執行了&init;,將set.init.ent的自定標籤庫導入,使得在之後的<target>標籤中能使用WebTest的自定標籤進行功能測試腳本實作。在<target name="home">標籤中包含了<testSpec>WebTest 標籤,testSpec中引入了&config;進行set.config.ent檔的設定,參考設定2可知,網頁起始路徑將會是http://localhost:8080/jpetstore/ <invoke >標籤中得知,這個簡易的腳本將測試http://localhost:8080/jpetstore/ shop/index.do 是否可正常的連結。

完成第腳本檔1之後啟動JPetStore的HSQLDB資料庫與Tomcat並且在Console下執行maven webtest,若設定無誤Maven執行結果將如圖2所示。當WebTest測試完成後將會在[Jpetstore_WebTesttargetdocsmaven-webtest-report.html]建立如圖3的測試報告檔,並且報告檔中將可得知其測試結果總表(Result Summary)、伺服端回應時間數據圖(Server Roundtrip Timing Profile)、測試情節概要(Test Scenario Overview)等測試結果訊息供測試人員參考。不但如此在每一個<invoke >標籤執行後的Resulting page上皆記錄了網頁快照可供連結進行確認是否正確執行。

沒有留言: