您的位置:軟件測(cè)試 > 開源軟件測(cè)試 > 開源單元測(cè)試工具 > cppUnit
用CPPUnit做單元測(cè)試
作者:網(wǎng)絡(luò)轉(zhuǎn)載 發(fā)布時(shí)間:[ 2013/3/4 16:11:41 ] 推薦標(biāo)簽:

例子如下:
int additionPropertiesTest()
{
    //conmutative: a + b = b + a
    if ( addition(1, 2) != addition(2, 1) )
    {
 return (FALSE);
    }

    //asociative: a + (b + c) = (a + b) + c
    if ( addition(1, addition(2, 3)) != addition(addition(2, 1), 3 ) )
    {
 return (FALSE);
    }

    //neutral element: a + NEUTRAL = a
    if ( addition(10, 0) != 10 )
    {
 return (FALSE);
    }

    //inverse element: a + INVERSE = NEUTRAL
    if ( addition(10, -10) != 0 )
    {
 return (FALSE);
    }

    return (TRUE);
}
上面的例子測(cè)試了多個(gè)數(shù)據(jù)相加順序不同的情況。
上述的兩個(gè)Test Case組成了一個(gè)Test Suite,Test Suite是指用來(lái)測(cè)試同一被測(cè)單元的一組Test Case。
在開發(fā)被測(cè)模塊時(shí)必須同時(shí)編寫這些Test Case和Test Suite的代碼,被測(cè)模塊變更時(shí),要同時(shí)變更(有時(shí)需要增加)相應(yīng)的Test Case和Test Suite。
舉例來(lái)說(shuō),當(dāng)求和模塊升級(jí)為可以對(duì)小數(shù)求和的模塊,必須變更Test Case和Test Suite,加入諸如addDecimalNumbersTest之類的Test Case。
極限編程建議程序員在編寫目標(biāo)模塊之前開發(fā)出所有單元測(cè)試中要用到的Test Case。其主要理由是:一旦程序員處于開發(fā)過(guò)程之中,那么他進(jìn)入了一個(gè)持續(xù)改進(jìn)的階段,必須同時(shí)考慮單元模塊功能、需要公布的接口、需要給方法傳遞的參數(shù)、外部訪問、內(nèi)部行為等等。在編寫目標(biāo)單元之前通過(guò)開發(fā)Test Case,可以對(duì)需要考慮的這些因素有更好的了解,這樣編寫目標(biāo)模塊與其他方法相比速度會(huì)更快,代碼的質(zhì)量也會(huì)更好。
每當(dāng)開發(fā)團(tuán)隊(duì)需要發(fā)布新版本的時(shí)候,都要進(jìn)行徹底的單元測(cè)試。所有的單元必須通過(guò)單元測(cè)試,這樣可以發(fā)布成功的版本。如果有1個(gè)或以上的單元沒有通過(guò)所有的測(cè)試,Bug出現(xiàn)了。遇到這種情況需要在進(jìn)行測(cè)試,如果需要的話還需要增加新的Test Case,檢查可以使Bug再現(xiàn)的所有情況。如果新的Test Case可以使Bug重現(xiàn),可以修正這個(gè)Bug,然后再進(jìn)行測(cè)試,如果模塊通過(guò)了測(cè)試,可以認(rèn)為Bug已經(jīng)修正,可以發(fā)布新的無(wú)Bug版本了。
為每一個(gè)發(fā)現(xiàn)的Bug添加新的Test Case是很有必要的,因?yàn)锽ug會(huì)反復(fù)出現(xiàn),當(dāng)其重復(fù)出現(xiàn)時(shí)需要有效的測(cè)試來(lái)檢測(cè)Bug。這樣的話,Test Bettery會(huì)逐漸膨脹直至覆蓋所有的歷史Bug和潛在的錯(cuò)誤。
測(cè)試工具:
有兩個(gè)小伙子,一個(gè)叫Kent Beck,另一個(gè)叫Eric Gamma,他們寫了一系列的Java類,希望可以把測(cè)試做的盡可能自動(dòng)化,并稱之為JUnit,JUnit使整個(gè)單元測(cè)試界產(chǎn)生的很大的震動(dòng)。其他的開發(fā)者們把JUnit的代碼移植到其他語(yǔ)言上,構(gòu)建了一大系列稱為xUnit框架的產(chǎn)品。其總包括C/C++的CUnit和CPPUnit,Delphi的DUnit,Visual Basic的VBUnit,.NET平臺(tái)上的NUnit,等等。
所有這些框架都采用同樣的規(guī)則,對(duì)語(yǔ)言的依賴性很小,熟悉其中一個(gè)框架能夠熟練應(yīng)用其他框架。
下面要講的是如何通過(guò)使用CPPUnit來(lái)編寫測(cè)試代碼并提高單元的質(zhì)量。
CPPUnit采用面向?qū)ο蟮木幊谭椒,中間會(huì)遇到諸如封裝、繼承、多態(tài)這些概念。另外,CPPUnit采用C++ SEH(Structured Exception Handling),所以還會(huì)遇到異常的概念,以及throw, try, finally, catch這些指令。
CPPUnit
每一個(gè)Test Case都需要在TestCase類的派生類中定義。TestCase類中包含了許多基本的功能,比如運(yùn)行測(cè)試、在Test Suite中注冊(cè)Test Case等。
比如在需要寫一個(gè)在磁盤上存儲(chǔ)數(shù)據(jù)的小模塊的時(shí)候,模塊(定義為DiskData類)主要實(shí)現(xiàn)兩個(gè)功能:讀取數(shù)據(jù)和裝載數(shù)據(jù)。例程如下:
typedef struct _DATA
{
    int number;
    char string[256];
}DATA, *LPDATA;

class DiskData
{
public:
    DiskData();
    ~DiskData();

    LPDATA getData();
    void setData(LPDATA value);

    bool load(char *filename);
    bool store(char *filename);

private:
    DATA m_data;
};

此時(shí),首先要做的事情不是弄明白上面的代碼是如何變出來(lái)的,而是要確定上面所定義的類是否完成了設(shè)計(jì)的全部功能——正確地讀取和存儲(chǔ)數(shù)據(jù)。

為此,需要設(shè)計(jì)一個(gè)新的Test Suite,其中包含兩個(gè)Test Case:一個(gè)讀取數(shù)據(jù)、一個(gè)存儲(chǔ)數(shù)據(jù)。

使用CPPUnit

新版本的CPPUnit可以在http://cppunit.sourceforge.net/上免費(fèi)下載到,其中包含所有的庫(kù)文件、文檔、例子程序和其他有趣的素材。

在Win32環(huán)境下,可以在VC++(6.0或更新版本)中使用CPPUnit,由于CPPUnit采用的是ANSI C++,所以可應(yīng)用于C++ Builder等開發(fā)環(huán)境中的版本較少。
構(gòu)建庫(kù)文件的步驟可以在CPPUnit發(fā)布版本的INSTALL-WIN32.txt文件中找到。構(gòu)
建好庫(kù)文件之后可以著手編寫Test Suite了。

在VC++下編寫單元測(cè)試程序的步驟如下:
 創(chuàng)建一個(gè)基于MFC的對(duì)話框應(yīng)用程序(或者文檔應(yīng)用程序)
 開啟RTTI:Project Settings -> C++ -> C++ Language
 在include目錄中加入CPPUnitinclude:Tools -> Options -> Directories -> Include
 連接cppunitd.lib(靜態(tài)連接)或者cppunitd_dll.lib(動(dòng)態(tài)連接),testrunnerd.lib。如果是在“Release”配置下編譯,同樣需要連接這些庫(kù)文件,只是需要把名稱中的“d”字母去掉。
 拷貝testrunnerd.dll文件到可執(zhí)行文件夾的下面(或者路徑下的其他文件夾中),如果是動(dòng)態(tài)連接的話,還需要拷貝cppunitd_dll.dll(“Release”配置下需要拷貝testrunner.dll和cppunit_dll.dll)。

配置好之后即可以著手進(jìn)行單元測(cè)試類編碼了。

待測(cè)試的DiskData類,主要實(shí)現(xiàn)兩個(gè)功能:讀取和存儲(chǔ)磁盤上的數(shù)據(jù)。要測(cè)試這兩個(gè)功能,需要兩個(gè)Test Case:一個(gè)負(fù)責(zé)讀取數(shù)據(jù)、一個(gè)負(fù)責(zé)存儲(chǔ)數(shù)據(jù)。

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