啄木鳥之家大呂

敏捷測試已成為現在式,盡早和持續的反饋成為各研發團隊的必選項。測試同學也需要跟上這個趨勢。除了“找bug”、“分析需求”、“功能測試”,還需考慮“交付質量、一次做對、在沒有用戶界面情況下盡早接口測試”。
測試要擁抱變化,改變過去到最后才安排測試活動以及只能做黑盒測試的被動局面,從項目一開始就開始測試活動。
今天給大家介紹的FitNesse,就是一個完全集成單獨可運行wiki的驗收測試框架。它是開源的wiki web服務,允許創建自己的web頁用於包含測試表格,這些測試表格實際就是測試數據。FitNesse主要用於支持敏捷方式的黑盒驗收和回歸測試,它也是一個協作工具,可支撐開發和測試、研發和業務同學一起准備測試用例集(test suite)。
從自動化測試金字塔結構來說,FitNesse定位業務接口測試層面,介於UI和單元測試之間。該定位確保我們的測試可在UI沒出來前就可以開展測試,而且基於wiki頁面的方式,也確保業務、開發和測試之間良好的溝通,因為業務方也能很容易讀懂測試內容。
為什么要用Fitnesse
敏捷測試團隊可以用FitNesse來准備業務驗收測試用例集,用它們來測試系統對外的方法,有點類似Junit和TestNG等,它們之間主要區別是 FitNesse用wiki頁面上表格形式來表示測試用例,項目上各角色都可以很方便共享這些用例。
好處:
1、通過執行自動化的驗收測試用例實現盡早反饋
2、通過類似Junit的紅色(測試失敗)和綠色(測試通過)顯示,能很清晰展現測試執行結果
3、能根據質量要求設計不同覆蓋程度的測試數據
4、測試用例通過wiki語言編寫並通過表格形式展示,各方都能理解
5、通過測試表格定義測試用例的輸入和預期結果,很直觀
備注:關於FitNesse特性介紹可直接參考官網
用FitNesse能做什么
通過FitNesse,我們能創建測試用例和測試用例集(簡稱測試集),這跟平時我們做測試要做的測試活動類似。測試用例是單個測試腳本,測試集是一組測試用例集合。當我們執行測試集時,測試集中所有測試用例都會被執行,因此我們需要合理安排每個測試集中應該包括的測試用例。
FitNesse框架原理簡介
FitNesse框架包含Wiki、Test system、Fixtures,其中
1、Wiki:展現具體的Test Case、Test suite、甚至是Test Requirement;
2、Test system:Fitnesse的執行引擎,包括兩個部分:Slim、Fit
3、Fixtures:真正的測試代碼
具體如圖所示。

-
SUT:System Under Test,也就是被測試的系統。
-
Custom Fixture:也就是針對具體被測試系統設計的測試代碼。
-
SLIM:Simple List Invocation Method的縮寫,它包括SLIM Runner和SLIM Executor兩部分。
以SLIM執行引擎為例來說,當我們點擊Test按鈕開始測試執行時,Fitnesse讀取頁面表格數據,然后調用SLIM Runner將該表格解釋為SLIM指令發送給SLIM Executer,之后Executer調用Fixture測試代碼,最后Fixture測試代碼執行具體的測試函數。一般我們就是通過該測試代碼中測試函數跟被測系統交互完成測試驗證的。
Fit類似原理,Fit執行引擎對測試代碼要求更嚴格,建議采用SLIM,下文將以它為例展開,若要進一步了解FIT測試框架,請自行百度或閱讀官網說明。
下載和配置FitNesse
1、進入FitNesse官網下載頁面:http://www.fitnesse.org/FitNesseDownload,下載最新的fitnesse-standalone.jar。

2、打開command命令行窗口,到fitnesse jar包所在目錄,然后執行該文件。(注:為方便,大家為下面命令行創建批處理文件。下面端口號可自己隨意設置)
java -jar fitnesse-standalone.jar -p 2222
文件成功執行成功后,FitNesse啟動情況如下。

3、打開FitNesse,只需要在瀏覽器輸入http://localhost:<portnumber>,本例子是http://localhost:2222

在該頁面,大家可看到Edit和Add菜單,點擊Add,可看到Suite page(測試集頁)和Test page(測試用例頁)。當我們創建某個測試集頁,所有在該頁面上的測試腳本在執行時都會被執行。為講解方便,下面以創建某個測試用例頁為例。
FitNesse例子
我們將以一個簡單的計算器程序為例,代碼包括4個方法:
1、addition() 加
2、minus() 減
3、multiply() 乘
4、divide() 除
(注意:FitNesse能支持大部分開發語言,用Java為例而已)
FitNesse中代碼被稱作Fixture(大家可稱為夾具,本文直接以英文稱呼),它是測試代碼,也是FitNesse和待測系統之間連接點。因此,當你要測試某個方法,就需要編寫一個fixture,測試執行時該fixture被觸發,然后測試該方法。
計算器例子對應的Fixture代碼如下:
public class Calculator {
private int first, second;
public void setFirst(int first) {
this.first = first;
}
public void setSecond(int second) {
this.second = second;
}
public int addition() {
return (first + second);
}
public int minus() {
return (first - second);
}
public int multiply() {
return (first * second);
}
public float divide() {
return (first / second);
}
}
eclipse中的代碼如下:

后面需要該計算器代碼的class文件,請確保編譯成功。
開始FitNesse編寫測試
STEP #1,讓我們進入fitnesse frontpage頁面。在該頁面Add菜單,選擇Test page,然后輸入測試的名字,然后點擊save按鈕。根據這個case,我們輸入Calculator

STEP #2,在瀏覽器中使用.操作符。類似:

STEP #3,點擊edit按鈕,然后輸入下面的代碼行

讓我們一行一行看一下這些內容的含義:
a)第一行表示FitNesse使用SLIM測試系統 (關於SLIM調用關系還不清楚,參考上面框架原理介紹章節)
b)第二行定義了測試代碼Class文件所在路徑,本例Java class文件保存在“C:AndrewalipayautomationbirdieAutobin”
c)第三行引入class文件所在包
d)第四行說明了具體的class文件,本例為“Calculator”
e)第五行開始具體測試內容部分:
前面2列 |first|second| 表示測試方法的輸入參數,之后每個帶“?”列都是要測試的函數預期的返回值|addition?|minus?|multiply?|divide?|,測試執行時會將
前面測試參數傳入,然后調用函數計算結果,並跟相應列中測試數據,也就是預期值進行比較,若符合就通過,若不符合則算失敗。
f)接下來就幾行都是測試數據。每一行就是代表一個測試點。我們以第一個測試點為例說明一下:
|first|second|addition?|minus?|multiply?|divide?|
|4 |2 |6 |2 |8 |2.0 |
這表示將4作為第一個參數,2作為第二個參數輸入傳給addition函數,然后將返回值跟該列對應預期值6進行比較。其它列minus、multiply和divide類似處理。
備注:若測試代碼行之間有空行,可能會報如下錯誤:

STEP #4,編輯完成后,點擊保存按鈕,你的頁面如下

STEP #5,點擊頁面上test按鈕,將得到下圖所示結果

執行結果第一行很清楚告訴有幾個測試(1個)、幾個斷言(12個),以及相應執行結果,還給出測試執行時間。
在表格上會標准執行了那個包、那個測試代碼類,每個預期結果比對情況。
若通過則顯示綠色,若失敗則顯示紅色。類似Junit展現方式。
STEP #6:為了演示需要,讓我們修改幾個錯誤預期值,比如:第一行測試數據加法預期從6改到7,第二行減法預期從5改到4,第三行除法從1.0改到2.0。
STEP #7:再次點擊Test按鈕,大家可看到它們變成紅色了,表示不符合預期測試失敗了。

Fixture/Table類型:
在FitNesse中,Fixture的表格類型支持多種類型,主要有:
1、列(Column)格式的Fixture,也就是上面例子樣子,使用最廣泛。列直接對應待測函數的輸入參數和返回預期值,適合各類組合的輸入參數,然后跟預期結果比對。
2、行(Row)格式的Fixture,返回結果是列表的測試驗證,比如可用於根據某個條件查詢得到很多行返回結果的測試情況。
3、Action Fixture,支持工作流方式的一系列測試函數組合,可用於多個測試函數組合的業務測試類型。
!|ActionFixture||start|ActionFixtureTest||enter|firstPart|Hello||enter|secondPart|World||press|join||check|together|Hello, World|
建議:
本文介紹FitNesse框架原理、安裝以及通過簡單case一步步說明如何入門。該工具本身帶有user guide和很多用例演示,大家可進一步深入了解。
從上文演示例子,大家可看到,該工具需要測試同學掌握一些編碼技能,一旦我們具備基本的編碼技能,那么FitNesse就非常適合基於API或對外暴露接口的業務驗收測試,畢竟基於Wiki的頁面讓項目各方都很容易理解測試點和測試數據。
你還在等什么,趕快試用起來吧!
結論:
敏捷測試中一般采用4個層次的測試:
1、自動化單元測試,一般基於Junit等Xunit系列
2、自動化驗收測試,可基於FitNesse
3、自動化UI回歸測試,可基於Selenium或QTP等
4、手工測試
基於測試分層的金字塔原理,我們應盡量多采用自動化單元和驗收測試,而等底層足夠穩定,再開展UI自動化測試,這樣不僅實現測試提前和盡早反饋的目的,而且讓UI自動化回歸測試效率更高。
如果Junit一般由開發負責,那么測試同學就盡快把FitNesse用起來吧,提升一下測試工作的技術含量吧~
