c語言測試工具 掌握CUnit

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是標準的  

發佈了53 篇原創文章 · 獲贊 1 · 訪問量 20萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章