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

// PlusTestCase.h
class CPlusTestCase : public CppUnit::TestCase
{
    CPPUNIT_TEST_SUITE(CPlusTestCase);
    CPPUNIT_TEST(testAdd);
    CPPUNIT_TEST_SUITE_END();
public:
    CPlusTestCase ();
    virtual ~ CPlusTestCase ();
   void testAdd();
    static std::string GetSuiteName();
   static CppUnit::Test* GetSuite();
};
   // PlusTestCase.cpp
    CppUnit::Test* CPlusTestCase::GetSuite()
    {
           CppUnit::TestFactoryRegistry& reg =
                 CppUnit::TestFactoryRegistry::getRegistry (CPlusTestCase::GetSuiteName());
                 return reg.makeTest();
     }

  記住在PlusTestCase.h中包含頭文件:

  #include <cppunit/extensions/TestFactoryRegistry.h>

  后, 我們?yōu)閱卧獪y(cè)試建立一個(gè)UI測(cè)試界面.

  由于我們希望這個(gè)Project運(yùn)行后顯示的是GUI界面,所以我們需要在App的 InitInstance ()中屏蔽掉原有的對(duì)話框,代之以CppUnit的GUI。
我們?cè)贑UnitTestApp::InitInstance()函數(shù)中,將原先顯示主對(duì)話框的代碼以下面的代碼取代:

CppUnit::MfcUi::TestRunner runner;
    runner.addTest(CPlusTestCase::GetSuite());//添加測(cè)試
    runner.run();//show UI
/* CUnitTestDlg dlg;
 m_pMainWnd = &dlg;
 int nResponse = dlg.DoModal();
 if (nResponse == IDOK)
 {
  // TODO: Place code here to handle when the dialog is
  //  dismissed with OK
 }
 else if (nResponse == IDCANCEL)
 {
  // TODO: Place code here to handle when the dialog is
  //  dismissed with Cancel
 }
*/


  切記必須先在UnitTest.cpp中包含頭文件:

  #include <cppunit/ui/mfc/TestRunner.h>
  #include " PlusTestCase.h "

  到此為止, 我們已經(jīng)建立好一個(gè)簡(jiǎn)單的單元測(cè)試框架。測(cè)試框架雖然寫好了,但是測(cè)試代碼仍然為空,產(chǎn)品代碼也還沒(méi)有寫。下面我們來(lái)寫測(cè)試代碼:
  如前所述,在測(cè)試類中,我們添加了一個(gè)測(cè)試方法:

  void testAdd();

  它測(cè)試的對(duì)象是前面提到的CPlus類的方法:int Add(int nNum1, int nNum2);(產(chǎn)品代碼) 我們來(lái)看看testAdd()的實(shí)現(xiàn):記得在PlusTestCase.h中包含頭文件

#include <cppunit/TestAssert.h>
  // PlusTestCase.cpp
  void CPlusTestCase::testAdd()
  {
   CPlus plus;
 int nResult = plus.Add(10, 20); //執(zhí)行Add操作
 CPPUNIT_ASSERT_EQUAL(30, nResult); //檢查結(jié)果是否等于30 
  }

  CPPUNIT_ASSERT_EQUAL是一個(gè)判斷結(jié)果的宏。CppUnit中類似的其它宏請(qǐng)查閱TestAssert.h,本文在此不做詳述 。

  另外,我們還可以覆寫基類的 setUp()、tearDown()兩個(gè)函數(shù)。這兩個(gè)函數(shù)實(shí)際上是一個(gè)模板方法,在測(cè)試運(yùn)行之前會(huì)調(diào)用setUp()以進(jìn)行一些初始化的工作,測(cè)試結(jié)束 之后又會(huì)調(diào)用tearDown()來(lái)做一些“善后工作” ,比如資源的回收等等。當(dāng)然,你也可以不覆寫這兩個(gè)函數(shù),因?yàn)樗鼈冊(cè)诨惱锒x成了空方法,而不是純虛函數(shù)。

  編寫完上面的測(cè)試代碼后,進(jìn)行編譯。編譯肯定通不過(guò),編譯器會(huì)告訴我們CPlus類沒(méi)有聲明,因?yàn)槲覀冞沒(méi)有實(shí)現(xiàn)CPlus類呢!現(xiàn)在的工作是馬上實(shí)現(xiàn)CPlus類,讓編譯通過(guò),F(xiàn)在你應(yīng)該嗅到一點(diǎn)“測(cè)試驅(qū)動(dòng)”(Test Driven Develop)的味道了吧?

  在VC中建立一個(gè)MFC Extension Dll的Project,在這個(gè)Project 中加入類CPlus,它的聲明如下:

  
// Plus.h
class AFX_EXT_CLASS CPlus
{
public:
 CPlus();
 virtual ~CPlus();
public:
 int Add(int nNum1, int nNum2);
};

Add在Plus.cpp中實(shí)現(xiàn)如下

  
int CPlus::Add(int nNum1, int nNum2)
{
 return nNum1 + nNum2;//這里可以寫一些錯(cuò)誤的語(yǔ)句,用來(lái)看看錯(cuò)誤的結(jié)果
}


  非常簡(jiǎn)單,不是嗎?現(xiàn)在讓前面那個(gè)包含測(cè)試代碼的Project dependent這個(gè)Project,并且include 相關(guān)頭文件 ,Rebuild All,你會(huì)發(fā)現(xiàn)編譯已通過(guò)。你體會(huì)到了測(cè)試代碼驅(qū)動(dòng)產(chǎn)品代碼了嗎?當(dāng)然我們的這個(gè)例子還很簡(jiǎn)單 ,沒(méi)有重構(gòu)這一步驟。

  運(yùn)行我們的測(cè)試程序,單擊Browse,你會(huì)看到如下圖所示的界面:


   選擇CPlusTestCase::testAdd后,單擊Run,你會(huì)看到如下圖所示的界面:

  這下你應(yīng)該對(duì)前面我們說(shuō)的TestSuite的名字理解更深了吧。CPlus是一個(gè)測(cè)試包TestSuite,它的下面包含一個(gè)測(cè)試用例,這個(gè)測(cè)試用例下面又包含一個(gè)測(cè)試方法。

  如果我修改CPlus::Add的代碼如下:

int CPlus::Add(int nNum1, int nNum2)
  {
  // return nNum1 + nNum2;
   return 2; 
  }

  重新編譯通過(guò),運(yùn)行程序會(huì)發(fā)現(xiàn):

  GUI顯示有一個(gè)單元測(cè)試不通過(guò),并顯示出錯(cuò)的地方和原因,這樣很好的控制Bug了。

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