一、CPPUNIT概念
CPPUNIT是一個(gè)測(cè)試驅(qū)動(dòng)開發(fā)的測(cè)試框架。所謂測(cè)試驅(qū)動(dòng)開發(fā)(TDD)是一種可以在開發(fā)過(guò)程中控制憂慮感的開發(fā)方法,它堅(jiān)持以測(cè)試作為開發(fā)過(guò)程的中心,在開發(fā)前根據(jù)對(duì)將要開發(fā)的程序的要求,先寫好所有測(cè)試代碼,并且在開發(fā)過(guò)程中不斷地通過(guò)運(yùn)行測(cè)試代碼來(lái)獲得所開發(fā)的代碼與所要求的結(jié)果之間的差距。
CPPUNIT是XUNIT的一部分,它是由JUNIT演變過(guò)來(lái)的,專門針對(duì)C/C++的單元測(cè)試工具。
測(cè)試驅(qū)動(dòng)開發(fā)的原則:
先寫測(cè)試代碼,然后編寫符合測(cè)試的代碼。至少做到完成部分代碼后,完成對(duì)應(yīng)的測(cè)試代碼;
測(cè)試代碼不需要覆蓋所有的細(xì)節(jié),但應(yīng)該對(duì)所有主要的功能和可能出錯(cuò)的地方有相應(yīng)的測(cè)試用例;
發(fā)現(xiàn) bug,首先編寫對(duì)應(yīng)的測(cè)試用例,然后進(jìn)行調(diào)試;
不斷總結(jié)出現(xiàn) bug 的原因,對(duì)其他代碼編寫相應(yīng)測(cè)試用例;
每次編寫完成代碼,運(yùn)行所有以前的測(cè)試用例,驗(yàn)證對(duì)以前代碼影響,把這種影響盡早消除;
不斷維護(hù)測(cè)試代碼,保證代碼變動(dòng)后通過(guò)所有測(cè)試;
在編碼前:他可以強(qiáng)迫你對(duì)需求進(jìn)行詳細(xì)的分析。
在編碼時(shí):他可以使你對(duì)over coding保持警覺(jué)。
在重構(gòu)時(shí):可以確保新的設(shè)計(jì)能夠兼容舊版本的功能。
在團(tuán)隊(duì)開發(fā)時(shí):可以確保自己的單元是無(wú)誤的。
二、CPPUNIT原理
從CPPUNIT的概念:測(cè)試框架,我們可以獲知一點(diǎn)CPPUNIT原理的信息。下面我們就這個(gè)概念來(lái)進(jìn)一步說(shuō)明CPPUNIT的原理。CPPUNIT的測(cè)試對(duì)象可以是一個(gè)函數(shù),一個(gè)對(duì)象或是若干個(gè)對(duì)象集,在CPPUNIT中將測(cè)試對(duì)象定義為FIXTURE,確定了FIXUTRE之后CPPUNIT要做的步驟主要是:
1.了解需求,從使用者的角度寫出測(cè)試代碼,組織好測(cè)試框架。包括對(duì)FIXTURE及相關(guān)的初始化,準(zhǔn)備好測(cè)試用例,明確每個(gè)測(cè)試用例的預(yù)期輸出結(jié)果(也就是期望值)。
2.往測(cè)試代碼中加入被測(cè)對(duì)象,運(yùn)行測(cè)試代碼后檢查輸出結(jié)果。
3.如果隨著FIXTURE的變動(dòng)需要增加或者是刪除測(cè)試用例,可以直接在測(cè)試代碼中增加或刪除,而其它測(cè)試用例可以繼續(xù)延用,作為回歸的測(cè)試用例。
4.每一次測(cè)試CPPUNIT都是通過(guò)對(duì)比FIXTURE的返回值和期望值而得出該用例的執(zhí)行是否成功,如果二者不同,則返回FALSE。
在CPPUNIT中Test Case(測(cè)試用例)是最小的單位,當(dāng)一個(gè)FIXTURE有多個(gè)Test Case時(shí),可以將這多個(gè)Test Case組成一個(gè)Test Suite,這個(gè)Test Suite是用來(lái)測(cè)試同一被測(cè)單元的一組Test Case。若需要同時(shí)測(cè)試多個(gè)對(duì)象,將所有測(cè)試用例一起執(zhí)行的時(shí)候,可以將若干個(gè)Test Suite組成一個(gè)Test Factor。如果在測(cè)試的過(guò)程中FIXTURE發(fā)生了改變,可以直接修改相關(guān)的Test Case,這就是CPPUNIT對(duì)測(cè)試用例的管理。
三、CPPUNIT的安裝使用
Cppunit 支持多平臺(tái),其實(shí)程序自身帶的文檔就已經(jīng)非常詳盡了,建議在使用前能把根目錄下的INSTALL,INSTALL-WIN32.TXT,INSTALL-UNIX 幾個(gè)文件先過(guò)一遍,更高級(jí)的引用可以到doc目錄下查找。
1) 總體構(gòu)成
CppUnit是開源的測(cè)試工具,可以在它的安裝包里直接看到它的源代碼。
作為一個(gè)完整的CppUnit framework,雖然源碼所在的實(shí)際路徑可能不盡相關(guān),但從邏輯上講它們被劃為如下幾個(gè)部分:
core:CppUnit的核心部分
output:掌管結(jié)果輸出
helper:一些輔助類
extension:作為單元測(cè)試的延伸,對(duì)CppUnit core部分的擴(kuò)展(比如:常規(guī)測(cè)試,重復(fù)測(cè)試)
listener:監(jiān)視測(cè)試進(jìn)程和測(cè)試結(jié)果
textui:一個(gè)運(yùn)行單元測(cè)試的文本環(huán)境
portability:提供針對(duì)不同平臺(tái)的移植設(shè)置
上述所有的內(nèi)容均被置于CppUnit名字空間之內(nèi)。
2)WINDOWS的安裝以及配置
At the current time, the only supported WIN32 platform is Microsoft Visual C++. You must have VC++ 6.0 at least.
Windows 編譯環(huán)境要求我們至少是vc++ 6.0
Quick Steps to compile & run a sample using the GUI TestRunner:
- Open examples/examples.dsw in VC++ (contains all the samples).
VC7 will ask you if you want to convert, anwser 'yes to all'.
- Make HostApp the Active project
- Compile
- For Visual Studio 6 only:
- in VC++, Tools/Customize.../Add-ins and macro files/Browse...
- select the file lib/TestRunnerDSPlugIn.dll and press ok to register
the add-ins (double-click on failure = open file in VC++).
- Run the project
先編譯好cppunit帶的庫(kù),然后把庫(kù)的路徑加入到項(xiàng)目路徑中,然后才能在例子中調(diào)用這些庫(kù)。
附錄2有一些cppunit自己帶的文件,以及編譯一些庫(kù)的介紹,我們?nèi)绻屑?xì)看看它的configure文件的話,會(huì)發(fā)現(xiàn)它支持多平臺(tái)也是在這里實(shí)現(xiàn)的,他會(huì)檢測(cè)你運(yùn)行的環(huán)境,然后相應(yīng)的選擇合適的工具。
3) UNIX平臺(tái)
在UNIX平臺(tái)下先從http://www.sourceforge.net 獲得安裝包,解壓后在CPPUNIT的目錄依次操作:
./configure //生成Makefile文件
./make
./make install //將生成的庫(kù)文件復(fù)制到/user/local/lib目錄下,如果沒(méi)有目錄的安裝權(quán)限,可以指定到自己的目錄下。
將安裝包include/cppunit 目錄復(fù)制到/usr/include目錄下,里面是cppunit的頭文件。
網(wǎng)上有很多資料都說(shuō)make install之后要在共享動(dòng)態(tài)庫(kù)配置文件中將lib文件的目錄加進(jìn)去,但如果編譯出來(lái)的是靜態(tài)庫(kù)文件,則可省略了。
四、實(shí)例一
以下以一個(gè)helloworld的實(shí)例講解CPPUNIT的使用,以下例子僅作參考,注釋部分表達(dá)得不很嚴(yán)謹(jǐn),僅作參考。
#include "cppunit/Portability.h" #include "cppunit/TestAssert.h" #include "cppunit/extensions/TestFactoryRegistry.h" #include "cppunit/extensions/HelperMacros.h" #include "cppunit/TestResult.h" #include "cppunit/TestRunner.h" #include "cppunit/TestResultCollector.h" #include "cppunit/BriefTestProgressListener.h" class Test:public CPPUNIT_NS::TestCase //定義測(cè)試用例 { CPPUNIT_TEST_SUITE(Test); //創(chuàng)建一個(gè)suite,并將Test添加到suite CPPUNIT_TEST(testHelloWorld); //聲明一個(gè)測(cè)試用例testHelloWorld,如果需要增加測(cè)試用例也需要在這里聲明。 CPPUNIT_TEST_SUITE_END(); //結(jié)束suite聲明 public: void setUp(void) //CPPUNIT提供的初始化方法,將需要初始化的變量等在這里定義賦值。類似于構(gòu)造函數(shù),在執(zhí)行testcase之前自動(dòng)調(diào)動(dòng)。 本實(shí)例沒(méi)有需要初始化的變量。 { } void tearDown(void) //CPPUNIT提供的結(jié)束testcase執(zhí)行完之后自動(dòng)運(yùn)行的方法,如,需要清除的指針等。testcase執(zhí)行完后自動(dòng)調(diào)用,類似于虛構(gòu)函數(shù)。本例不需要作清除工作,也可以不定義 { } protected: void testHelloWorld(void){ //測(cè)試用例testHelloWorld,如果需要增加測(cè)試用例,可以繼續(xù)添加 printf("Hello,World!\n"); } }; CPPUNIT_TEST_SUITE_REGISTRATION(Test); //通過(guò)宏注冊(cè)Test到test suite int main() { CPPUNIT_NS::TestResult controller; //保存測(cè)試結(jié)果 CPPUNIT_NS::TestResultCollector result; //收集測(cè)試用例的執(zhí)行結(jié)果,它能夠區(qū)分測(cè)試用例執(zhí)行結(jié)果是false或是出現(xiàn)了錯(cuò)誤。 controller.addListener(&result); CPPUNIT_NS::BriefTestProgressListener progress; controller.addListener(&progress); CPPUNIT_NS::TestRunner runner; // TestRunner用于執(zhí)行測(cè)試用例,它將待執(zhí)行的測(cè)試對(duì)象管理起來(lái),然后供用戶調(diào)用 runner.addTest(CPPUNIT_NS::TestFactoryRegistry::getRegistry().makeTest()); runner.run(controller); return result.wasSuccessful()?0:-1; //反回用例的執(zhí)行結(jié)果,如果成功返回0失敗返回-1 } |
說(shuō)明:
1.如CPPUNIT_TEST_SUITE_REGISTRATION()是CPPUNIT本身帶有的宏,可以要下載cppunit-docs-1.10.2包,在這里可以查閱到函數(shù),宏及包含的頭文件。
2.CppUnit 提供了多種驗(yàn)證成功失敗的方式:
CPPUNIT_ASSERT(condition) // 確信condition為真
CPPUNIT_ASSERT_MESSAGE(message, condition)
// 當(dāng)condition為假時(shí)失敗,并打印message
CPPUNIT_FAIL(message) // 當(dāng)前測(cè)試失敗
聯(lián)系客服