c語言測試載入器 掌握CUnit

來源:互聯網
上載者:User

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

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.