亚洲好骚综合-亚洲黄色录像-亚洲黄色网址-亚洲黄色网址大全-99久久99久久-99久久99久久精品国产

您的位置:軟件測試 > 開源軟件測試 > 開源單元測試工具 > cppUnit
如何使用CppUnit進行單元測試
作者:網絡轉載 發布時間:[ 2013/12/23 11:39:41 ] 推薦標簽:

二、概念

  在使用之前,我們有必要認識一下CppUnit中的主要類,當然你也可以先看后面的例子,遇到問題再回過頭來看這一節。

  CppUnit核心內容主要包括一些關鍵類:

  Test:所有測試對象的基類。

  CppUnit 采用樹形結構來組織管理測試對象(類似于目錄樹,如下圖所示),因此這里采用了組合設計模式(Composite Pattern),Test的兩個直接子類TestLeaf和TestComposite分別表示“測試樹”中的葉節點和非葉節點,其中 TestComposite主要起組織管理的作用,像目錄樹中的文件夾,而TestLeaf才是終具有執行能力的測試對象,像目錄樹中的文件。

  Test重要的一個公共接口為:

  virtual void run(TestResult *result) = 0;

  其作用為執行測試對象,將結果提交給result。

  在實際應用中,我們一般不會直接使用Test、TestComposite以及TestLeaf,除非我們要重新定制某些機制。

  TestFixture:用于維護一組測試用例的上下文環境。

  在實際應用中,我們經常會開發一組測試用例來對某個類的接口加以測試,而這些測試用例很可能具有相同的初始化和清理代碼。為此,CppUnit引入TestFixture來實現這一機制。

  TestFixture具有以下兩個接口,分別用于處理測試環境的初始化與清理工作:

  virtual void setUp();
  virtual void tearDown();


  TestCase:測試用例,從名字上可以看出來,它便是單元測試的執行對象。

  TestCase從Test和TestFixture多繼承而來,通過把Test::run制定成模板函數(Template Method)而將兩個父類的操作融合在一起,run函數的偽定義如下:

// 偽代碼
void TestCase::run(TestResult* result)
{
    result->startTest(this); // 通知result測試開始
    if( result->protect(this, &TestCase::setUp) ) // 調用setUp,初始化環境
        result->protect(this, &TestCase::runTest); // 執行runTest,即真正的測試代碼
    result->protect(this, &TestCase::tearDown); // 調用tearDown,清理環境
    result->endTest(this); // 通知result測試結束
}


  這里要提到的是函數runTest,它是TestCase定義的一個接口,原型如下:

  virtual void runTest();

  用戶需從TestCase派生出子類并實現runTest以開發自己所需的測試用例。
另外還要提到的是TestResult的protect方法,其作用是對執行函數(實際上是函數對象)的錯誤信息(包括斷言和異常等)進行捕獲,從而實現對測試結果的統計。

  TestSuit:測試包,按照樹形結構管理測試用例

  TestSuit是TestComposite的一個實現,它采用vector來管理子測試對象(Test),從而形成遞歸的樹形結構。

  TestFactory:測試工廠

  這是一個輔助類,通過借助一系列宏定義讓測試用例的組織管理變得自動化。參見后面的例子。

  TestRunner:用于執行測試用例

  TestRunner將待執行的測試對象管理起來,然后供用戶調用。其接口為:

  virtual void addTest( Test *test );
  virtual void run( TestResult &controller, const std::string &testPath = "" );

  這也是一個輔助類,需注意的是,通過addTest添加到TestRunner中的測試對象必須是通過new動態創建的,用戶不能刪除這個對象,因為TestRunner將自行管理測試對象的生命期。

三、CppUnit 的使用

  以上工作完成以后,可以正式使用CppUnit了,由于單元測試是TDD(測試驅動開發)的利器,一般人會先寫測試代碼,然后再寫產品代碼,不過筆者認為先寫產品代碼框架后再寫測試代碼,然后通過慢慢補充產品代碼以使得能通過測試的方法會好些。不管先寫誰只要寫得舒服安全可以。本文決定先寫測試代碼。

  前面我們提到過,CppUnit小的測試單位是TestCase,多個相關TestCase組成一個TestSuite。要添加測試代碼簡單的方 法是利用CppUnit為我們提供的幾個宏來進行(當然還有其他的手工加入方法,但均是殊途同歸,大家可以查閱CppUnit頭文件中的演示代碼)。這幾個宏是:

    CPPUNIT_TEST_SUITE() 開始創建一個TestSuite;
  CPPUNIT_TEST() 添加TestCase;
  CPPUNIT_TEST_SUITE_END() 結束創建TestSuite;
  CPPUNIT_TEST_SUITE_NAMED_REGISTRATION() 添加一個TestSuite到一個指定的TestFactoryRegistry工廠。

  感興趣的朋友可以在HelperMacros.h看看這幾個宏的聲明,本文在此不做詳述。

  假定我們要實現一個類,類名暫且取做CPlus,它的功能主要是實現兩個數相加(多簡單的一個類啊,這也要測試嗎?不要緊,我們只是了解怎樣加入測試代碼來測試它行了,所以越簡單越好)。 假定這個類要實現的相加的方法是:

  int Add(int nNum1, int nNum2);

  OK,那我們先來寫測試這個方法的代碼吧。TDD 可是先寫測試代碼,后寫產品代碼(CPlus)的哦!先寫的測試代碼往往是不能運行或編譯的,我們的目標是在寫好測試代碼后寫產品代碼,使之編譯通過,然后再進行重構。這是Kent Beck說的“red/green/refactor”。所以,上面的類名和方法應該還只是在你的心里,還只是你的idea而已。

  根據測試驅動的原理,我們需要先建立一個單元測試框架。我們在VC中為測試代碼建立一個project。通常,測試代碼和被測試對象(產品代碼)是處于不同的project中的。這樣不會讓你的產品代碼被測試代碼所“污染 ”。

  由于在CppUnit下, 可以選擇控制臺方式和UI方式兩種表現方案,我們選擇UI方式。在本例中,我們將建立一個基于GUI 方式的測試環境。因此我們建立一個基于對話框的Project。假設名為UnitTest。

  建立了UnitTest project之后,我們首先配置這個工程。

上一頁12345下一頁
軟件測試工具 | 聯系我們 | 投訴建議 | 誠聘英才 | 申請使用列表 | 網站地圖
滬ICP備07036474 2003-2017 版權所有 上海澤眾軟件科技有限公司 Shanghai ZeZhong Software Co.,Ltd
主站蜘蛛池模板: 免费一级片观看 | 日日草天天干 | 中文字幕精品视频在线观看 | 成年大片免费高清在线观看 | 亚洲成人一级片 | 久久久国产精品免费 | α片免费 | 福利视频第一页 | 欧美本道 | 色视频在线观看在线播放 | 波多野结衣在线网站 | 欧美综合区自拍亚洲综合图区 | 欧美成人香蕉网在线观看 | 免费a级毛片在线播放 | 亚洲另类z0zx | 日韩精品亚洲人成在线播放 | bt天堂中文资源在线 | 欧美中文在线视频 | 香焦视频在线观看黄 | 日韩色在线| 91短视频在线观看免费最新 | 久久亚洲国产成人亚 | 欧美一级视频在线 | 欧美 亚洲 激情 | 成年美女黄网站色大免费观看软件 | 国产精品久久久久激情影院 | 色日韩在线| a级黄色毛片 | 日本污网站 | 美女黄18| 国产人成午夜免费噼啪视频 | 国产综合视频在线 | 日韩成人精品在线 | 福利免费看 | 中文字幕视频在线播放 | 日韩中文字幕网 | 免费观看日韩大尺码观看 | 女黄人东京手机福利视频 | 精品欧美一区手机在线观看 | 激情5月 | 国产高清天干天天视频 |