為此很有必要設計一套能良好管理和添加測試用例的體系結構。
當一個功能有很多組測試數據時,我們可以將測試用例數據全部存放在文件中,使測試用例和測試代碼分離開。由于測試用例脫離測試代碼而存在,可以很方便的進行管理和維護。我們可以為每個要測試的函數(或功能)建個目錄,每個測試用例放在一個單獨的文本文件中,將所有對應于該函數的測試數據文件全部放入該目錄下,當測試數據量很大時還可以在目錄下再創建相應的子目錄,分類進行管理。這樣可以方便測試用例的管理,而測試程序也只用專注于測試邏輯。還以測試周期會議預約功能的例子為基礎進行討論。
圖2-1 測試用例目錄結構圖
由圖2-1上可以看到,當某個函數(或功能)的測試用例很多時,還可以在“某功能測試用例總目錄”下再使用子目錄來劃分,若覺得劃分不夠細還可以繼續加深目錄層次,直到分類比較清晰為止。
由于測試用例數據和測試代碼進行了分離,以后對于某個函數(或功能)有了新的測試用例時不用再去修改測試代碼,只需在該功能的測試數據目錄下添加新的測試用例文件即可。該功能的測試程序每次運行時對于相應測試數據目錄下的每個測試用例文件(包括各級子目錄下的用例文件)都要執行一遍。
使用了目錄結構對它們進行了分門別類方便了以后的管理,正如良好的程序應具有好的可讀性和維護性一樣,良好的測試數據也應具有好的可讀性和維護性。
2.2測試用例文件結構
測試用例文件中存放測試用例初始化數據和測試完畢后的驗證數據。數據的結構采用一般配置文件的格式,詳見圖2-2。
圖2-2 測試用例文件結構圖
1)段名
配置文件中使用了段的概念,段相當于C++中的NameSpace,每個段內的關鍵字(Key)與其它段內的關鍵字互不影響,Section即為段名。
2)關鍵字
關鍵字用來標志不同元素的值,Key即為關鍵字的名字,關鍵字的名字不區分大小。
3)值
每個關鍵字都對應一個值,Value 即為值,值要區分大小。
4)注釋
支持單行注釋,字符“#”后面的內容為注釋。
5)行結構
一行的結構只能是以下幾種:
[Section]
Key=Value
空行
以上三中情況之一加上注釋
2.3測試程序通用庫
測試數據從測試代碼中分離出來后,增加了管理測試數據文件和解析測試數據文件的代碼,這部分代碼是通用的,可以將它們組織成庫供開發測試程序時使用。
圖2-3 測試程序和測試通用庫關系圖
2.3.1管理測試數據文件的庫
管理測試數據文件的庫的功能如下:
1)獲取目錄下所有測試文件路徑的接口
能找出某個目錄下 (包括該目錄下所有子目錄)所有的測試文件(如“*.ini”文件)的路徑并存起來。
2)獲取下一個測試文件的接口
向用戶提供下一個測試文件的路徑,若已沒有下一測試文件則返回空。
2.3.2解析測試文件的庫
解析測試文件的庫的功能如下:
1)文件解析接口
按照 2.2測試用例文件結構 中的文件結構解析出一個測試文件。
2)獲取值的接口
向用戶提供測試文件中某個段內某個關鍵字對應的值。
由于測試文件的結構和一般配置文件結構一致,可以使用已有的庫來實現(如PWLIB中配置文件解析類)。
3.總結
一個完整的測試用例包含測試數據和測試代碼,當測試數據和代碼混在一起時給測試用例的維護帶來了很大困難,而且給測試代碼帶來許多冗余。本文提出了將測試數據和測試代碼分離的想法,并對怎樣進行分離進行了闡述。測試數據從測試代碼中分離出來后,使得測試數據維護簡單、方便。
4.參考資料
CppUnit 主頁 : http://cppunit.sourceforge.net/
xprogramming 主頁 :http://www.xprogramming.com