您的位置:軟件測(cè)試 > 開源軟件測(cè)試 > 開源單元測(cè)試工具 > cppUnit
如何使用CppUnit進(jìn)行單元測(cè)試
作者:網(wǎng)絡(luò)轉(zhuǎn)載 發(fā)布時(shí)間:[ 2013/12/23 11:39:41 ] 推薦標(biāo)簽:

二、概念

  在使用之前,我們有必要認(rèn)識(shí)一下CppUnit中的主要類,當(dāng)然你也可以先看后面的例子,遇到問題再回過(guò)頭來(lái)看這一節(jié)。

  CppUnit核心內(nèi)容主要包括一些關(guān)鍵類:

  Test:所有測(cè)試對(duì)象的基類。

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

  Test重要的一個(gè)公共接口為:

  virtual void run(TestResult *result) = 0;

  其作用為執(zhí)行測(cè)試對(duì)象,將結(jié)果提交給result。

  在實(shí)際應(yīng)用中,我們一般不會(huì)直接使用Test、TestComposite以及TestLeaf,除非我們要重新定制某些機(jī)制。

  TestFixture:用于維護(hù)一組測(cè)試用例的上下文環(huán)境。

  在實(shí)際應(yīng)用中,我們經(jīng)常會(huì)開發(fā)一組測(cè)試用例來(lái)對(duì)某個(gè)類的接口加以測(cè)試,而這些測(cè)試用例很可能具有相同的初始化和清理代碼。為此,CppUnit引入TestFixture來(lái)實(shí)現(xiàn)這一機(jī)制。

  TestFixture具有以下兩個(gè)接口,分別用于處理測(cè)試環(huán)境的初始化與清理工作:

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


  TestCase:測(cè)試用例,從名字上可以看出來(lái),它便是單元測(cè)試的執(zhí)行對(duì)象。

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

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


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

  virtual void runTest();

  用戶需從TestCase派生出子類并實(shí)現(xiàn)runTest以開發(fā)自己所需的測(cè)試用例。
另外還要提到的是TestResult的protect方法,其作用是對(duì)執(zhí)行函數(shù)(實(shí)際上是函數(shù)對(duì)象)的錯(cuò)誤信息(包括斷言和異常等)進(jìn)行捕獲,從而實(shí)現(xiàn)對(duì)測(cè)試結(jié)果的統(tǒng)計(jì)。

  TestSuit:測(cè)試包,按照樹形結(jié)構(gòu)管理測(cè)試用例

  TestSuit是TestComposite的一個(gè)實(shí)現(xiàn),它采用vector來(lái)管理子測(cè)試對(duì)象(Test),從而形成遞歸的樹形結(jié)構(gòu)。

  TestFactory:測(cè)試工廠

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

  TestRunner:用于執(zhí)行測(cè)試用例

  TestRunner將待執(zhí)行的測(cè)試對(duì)象管理起來(lái),然后供用戶調(diào)用。其接口為:

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

  這也是一個(gè)輔助類,需注意的是,通過(guò)addTest添加到TestRunner中的測(cè)試對(duì)象必須是通過(guò)new動(dòng)態(tài)創(chuàng)建的,用戶不能刪除這個(gè)對(duì)象,因?yàn)門estRunner將自行管理測(cè)試對(duì)象的生命期。

三、CppUnit 的使用

  以上工作完成以后,可以正式使用CppUnit了,由于單元測(cè)試是TDD(測(cè)試驅(qū)動(dòng)開發(fā))的利器,一般人會(huì)先寫測(cè)試代碼,然后再寫產(chǎn)品代碼,不過(guò)筆者認(rèn)為先寫產(chǎn)品代碼框架后再寫測(cè)試代碼,然后通過(guò)慢慢補(bǔ)充產(chǎn)品代碼以使得能通過(guò)測(cè)試的方法會(huì)好些。不管先寫誰(shuí)只要寫得舒服安全可以。本文決定先寫測(cè)試代碼。

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

    CPPUNIT_TEST_SUITE() 開始創(chuàng)建一個(gè)TestSuite;
  CPPUNIT_TEST() 添加TestCase;
  CPPUNIT_TEST_SUITE_END() 結(jié)束創(chuàng)建TestSuite;
  CPPUNIT_TEST_SUITE_NAMED_REGISTRATION() 添加一個(gè)TestSuite到一個(gè)指定的TestFactoryRegistry工廠。

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

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

  int Add(int nNum1, int nNum2);

  OK,那我們先來(lái)寫測(cè)試這個(gè)方法的代碼吧。TDD 可是先寫測(cè)試代碼,后寫產(chǎn)品代碼(CPlus)的哦!先寫的測(cè)試代碼往往是不能運(yùn)行或編譯的,我們的目標(biāo)是在寫好測(cè)試代碼后寫產(chǎn)品代碼,使之編譯通過(guò),然后再進(jìn)行重構(gòu)。這是Kent Beck說(shuō)的“red/green/refactor”。所以,上面的類名和方法應(yīng)該還只是在你的心里,還只是你的idea而已。

  根據(jù)測(cè)試驅(qū)動(dòng)的原理,我們需要先建立一個(gè)單元測(cè)試框架。我們?cè)赩C中為測(cè)試代碼建立一個(gè)project。通常,測(cè)試代碼和被測(cè)試對(duì)象(產(chǎn)品代碼)是處于不同的project中的。這樣不會(huì)讓你的產(chǎn)品代碼被測(cè)試代碼所“污染 ”。

  由于在CppUnit下, 可以選擇控制臺(tái)方式和UI方式兩種表現(xiàn)方案,我們選擇UI方式。在本例中,我們將建立一個(gè)基于GUI 方式的測(cè)試環(huán)境。因此我們建立一個(gè)基于對(duì)話框的Project。假設(shè)名為UnitTest。

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

上一頁(yè)12345下一頁(yè)
軟件測(cè)試工具 | 聯(lián)系我們 | 投訴建議 | 誠(chéng)聘英才 | 申請(qǐng)使用列表 | 網(wǎng)站地圖
滬ICP備07036474 2003-2017 版權(quán)所有 上海澤眾軟件科技有限公司 Shanghai ZeZhong Software Co.,Ltd