1.繼Junit CppUnit的成功後, c語言環境下也出現了開發源碼的白盒測試用例CUnit。
暫時CUnit只是在SourceForge上還再不斷改進中,雖然不是很完善,但是能用。
下面介紹一下CUnit結構框架和具體使用
2.結構框架:
在CUnit的主頁上可以看到對他結構簡單描述
Test Registry
|
------------------------------
| |
Suite '1' . . . . Suite 'N'
| |
--------------- ---------------
| | | |
Test '11' ... Test '1M' Test 'N1' ... Test 'NM'
CUnit的測試是單線程啓動,只能註冊一個測試用例Test Registry,我認爲這和結構設計和需求有關
單線程數據結構是多重鏈表(對Suite,Test)組織起來,除非對測試用例再進行鏈表組織那樣管理層次上
已經多達到3層嵌套實現麻煩,並且用戶需求和習慣也就是能接受一個作爲一個獨立用例一次測試。
所以沒有必要再費精力。
繼續結構分析一個起始測試下轄多個Suite(可以認爲程序中各個獨立模塊),一個Suite管理多個Test
(可以認爲具體到模塊內部函數實現)。
整體測試流程就是這樣:
註冊一個測試用例(如果已經註冊了你可以cleanup掉然後重新註冊使用)然後CU_add_suite增加你的模塊
然後CU_add_test再在你的模塊下掛載你的模塊內的測試函數。所有的掛載完畢後,調用你想使用的界面進行
測試。
下面是四種測試模式:
1 Automated Output to xml file Non-interactive
2 Basic Flexible programming interface Non-interactive
3 Console Console interface (ansi C) Interactive
4 Curses Graphical interface (Unix) Interact
注意12是沒有交互功能的,4的Unix下的我是windows用戶 選擇第三個介紹console
而且console是可以人機交互的。
3.具體使用
1.沒有CUnit源碼去http://sourceforge.net/projects/cunit/
去down一份,這裏是CUnit-2.0-2的例子。
2.新建console工程 把自己要測試的代碼文件加載進去,獨立建一個main文件
3.
#include <stdio.h>
#include "console.h"
#include <assert.h>
/*
* Function:模塊測試初始化工作,對模塊內部Test函數需要用到的資源初始化
如當前裏例子中則對Test1,Test2中使用的到的資源初始化
* Input: None
* Return: 0:Succeed, or False
* Remark: 如果成功才進測試函數的測試運行否則此Suite下掛載的Test均不運行
*
*/
int InitSuite()
{
return 0;
}
/*
* Function:模塊測試銷燬工作,對模塊內部Test函數需要用到的資源進行銷燬
如當前裏例子中則對Test1,Test2中使用的到的資源釋放
* Input: None
* Return: 0:Succeed, or False
* Remark: 不影響Test的運行,失敗會報suite運行錯誤
*
*/
int EndSuite()
{
return 1;
}
/*
* 自己定義的函數過程形式不限制 可以extern近來或者包含,h近來供測試
*/
int MyTest1()
{
return 1;
}
BOOL MyTest2()
{
return FALSE;
}
/*
* Function: 單元測試例子也內部裝載自己的函數過程
* Input: ignore
* Return: true:Succeed, or False
* Remark: 失敗回記錄Test失敗,內部可以使用CU_ASSERT檢測最終會有檢測結果
* CU_ASSERT中檢測到的纔是真正意義上的用戶函數
*
*/
int Test1()
{
CU_ASSERT(MyTest1());
return 1;
}
BOOL Test2()
{
CU_ASSERT(MyTest2());
return FALSE;
}
/*
* 使用過程
*/
int main()
{
CU_pSuite pSuite = NULL;
//CU_initialize_registry 註冊函數註冊一個用例返回CUE_系列異常值
if( CUE_SUCCESS != CU_initialize_registry())
return CU_get_error();
//CU_get_registry 返回註冊到用例指針
assert(NULL != CU_get_registry());
//檢測是否在執行
assert(!CU_is_test_running());
//CU_add_suite 增加一個Suite
//"mySuite": Suite名字
//InitSuite EndSuite:分別是測試單元初始和釋放函數,如不需要則NULL傳遞
pSuite = CU_add_suite("mySuite",InitSuite, EndSuite);
//檢測註冊suite情況
if(NULL == pSuite)
{
CU_cleanup_registry();
return CU_get_error();
}
//註冊當前Suite下的測試用例
//pSuite:用例指針
//"Test1": 測試單元名稱
//Test1:測試函數
if( NULL == CU_add_test(pSuite, "Test1", Test1) ||
NULL == CU_add_test(pSuite, "Test2", Test2) )
{
CU_cleanup_registry();
return CU_get_error();
}
//使用console控制交互界面的函數入口
CU_console_run_tests();
//調用完畢清除註冊信息
CU_cleanup_registry();
}
4:使用中可能出現的情況
a: 找不到某些函數 加載CUnit.lib 在CUnit目錄下,不行你就搜索吧
b: #include "console.h" 找不到的話就inclue的console目錄進來
c: 注意使用不同模式測試可能需要平臺不同 小心不要搞出問題了console是標準的