CppUnit使用指南_第1頁(yè)
CppUnit使用指南_第2頁(yè)
CppUnit使用指南_第3頁(yè)
CppUnit使用指南_第4頁(yè)
CppUnit使用指南_第5頁(yè)
全文預(yù)覽已結(jié)束

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

1、CppUnit使用指南CppUnit的原理在 CppUnit 中,一個(gè)或一組測(cè)試用例的測(cè)試對(duì)象被稱為 Fixture(設(shè)施,下文為方便理解盡量使用英文名稱)。Fixture 就是被測(cè)試的目標(biāo),可能是一個(gè)對(duì)象或者一組相關(guān)的對(duì)象,甚至一個(gè)函數(shù)。有了被測(cè)試的 fixture,就可以對(duì)這個(gè) fixture 的某個(gè)功能、某個(gè)可能出錯(cuò)的流程編寫測(cè)試代碼,這樣對(duì)某個(gè)方面完整的測(cè)試被稱為TestCase(測(cè)試用例)。通常寫一個(gè) TestCase 的步驟包括:1. 對(duì) fixture 進(jìn)行初始化,及其他初始化操作,比如:生成一組被測(cè)試的對(duì)象,初始化值; 2. 按照要測(cè)試的某個(gè)功能或者某個(gè)流程對(duì) fixture

2、進(jìn)行操作; 3. 驗(yàn)證結(jié)果是否正確; 4. 對(duì) fixture 的及其他的資源釋放等清理工作。對(duì) fixture 的多個(gè)測(cè)試用例,通常(1)(4)部分代碼都是相似的,CppUnit 在很多地方引入了 setUp 和 tearDown 虛函數(shù)。可以在 setUp 函數(shù)里完成(1)初始化代碼,而在 tearDown 函數(shù)中完成(4)代碼。具體測(cè)試用例函數(shù)中只需要完成(2)(3)部分代碼即可,運(yùn)行時(shí) CppUnit 會(huì)自動(dòng)為每個(gè)測(cè)試用例函數(shù)運(yùn)行 setUp,之后運(yùn)行 tearDown,這樣測(cè)試用例之間就沒(méi)有交叉影響。撰寫TestCase必須注意以下幾點(diǎn): 可以自動(dòng)執(zhí)行,不用人手操作 自動(dòng)返回測(cè)試結(jié)果

3、 絕對(duì)的獨(dú)立,不能與其他TestCase有任何聯(lián)系。就算測(cè)試同一個(gè)函數(shù)的不同功能也需要分開。每個(gè)TestCase可以說(shuō)是一個(gè)孤島對(duì) fixture 的所有測(cè)試用例可以被封裝在一個(gè) CppUnit:TestFixture 的子類(命名慣例是ClassNameTest)中。然后定義這個(gè)fixture 的 setUp 和 tearDown 函數(shù),為每個(gè)測(cè)試用例定義一個(gè)測(cè)試函數(shù)(命名慣例是 testXXX)。下面是個(gè)簡(jiǎn)單的例子:class MathTest : public CppUnit:TestFixture protected: int m_value1, m_value2; public: M

4、athTest() / 初始化函數(shù) void setUp () m_value1 = 2; m_value2 = 3; / 測(cè)試加法的測(cè)試函數(shù) void testAdd () / 步驟(2),對(duì) fixture 進(jìn)行操作 int result = m_value1 + m_value2; / 步驟(3),驗(yàn)證結(jié)果是否爭(zhēng)取 CPPUNIT_ASSERT( result = 5 ); / 沒(méi)有什么清理工作沒(méi)有定義 tearDown. 在測(cè)試函數(shù)中對(duì)執(zhí)行結(jié)果的驗(yàn)證成功或者失敗直接反應(yīng)這個(gè)測(cè)試用例的成功和失敗。CppUnit 提供了多種驗(yàn)證成功失敗的方式:CPPUNIT_ASSERT(conditio

5、n)/ 確信condition為真 CPPUNIT_ASSERT_MESSAGE(message, condition)/ 當(dāng)condition為假時(shí)失敗, 并打印message CPPUNIT_FAIL(message)/ 當(dāng)前測(cè)試失敗, 并打印message CPPUNIT_ASSERT_EQUAL(expected, actual)/ 確信兩者相等 CPPUNIT_ASSERT_EQUAL_MESSAGE(message, expected, actual)/ 失敗的同時(shí)打印message CPPUNIT_ASSERT_DOUBLES_EQUAL(expected, actual, de

6、lta)/ 當(dāng)expected和actual之間差大于delta時(shí)失敗要把對(duì) fixture 的一個(gè)測(cè)試函數(shù)轉(zhuǎn)變成一個(gè)測(cè)試用例,需要生成一個(gè) CppUnit:TestCaller 對(duì)象。而最終運(yùn)行整個(gè)應(yīng)用程序的測(cè)試代碼的時(shí)候,可能需要同時(shí)運(yùn)行對(duì)一個(gè) fixture 的多個(gè)測(cè)試函數(shù),甚至多個(gè) fixture 的測(cè)試用例。CppUnit 中把這種同時(shí)運(yùn)行的測(cè)試案例的集合稱為 TestSuite。而 TestRunner 則運(yùn)行測(cè)試用例或者 TestSuite,具體管理所有測(cè)試用例的生命周期。目前提供了 3 類TestRunner,包括: CppUnit:TextUi:TestRunner / 文本

7、方式的TestRunner CppUnit:QtUi:TestRunner/ QT方式的TestRunner CppUnit:MfcUi:TestRunner/ MFC方式的TestRunner下面是一個(gè)TestRunner的例子:CppUnit:TextUi:TestRunner runner; CppUnit:TestSuite *suite= new CppUnit:TestSuite(); / 添加一個(gè)測(cè)試用例 suite-addTest(new CppUnit:TestCaller (testAdd, testAdd); / 指定運(yùn)行TestSuite runner.addTest(

8、 suite ); / 開始運(yùn)行, 自動(dòng)顯示測(cè)試進(jìn)度和測(cè)試結(jié)果 runner.run( , true ); / Run all tests and wait常用使用方式按照上面的方式,如果要添加新的測(cè)試用例,需要把每個(gè)測(cè)試用例添加到 TestSuite 中,而且添加新的 TestFixture 需要把所有頭文件添加到 main.cpp 中,比較麻煩。為此 CppUnit 提供了 CppUnit:TestSuiteBuilder,CppUnit:TestFactoryRegistry 和一堆宏,用來(lái)方便地把 TestFixture 和測(cè)試用例注冊(cè)到 TestSuite 中。下面就是通常的使用方式

9、(注意紅色字體):/ MathTest.h#include cppunit/extensions/HelperMacros.h class MathTest : public CppUnit:TestFixture / 聲明一個(gè)TestSuite CPPUNIT_TEST_SUITE( MathTest ); / 添加測(cè)試用例到TestSuite, 定義新的測(cè)試用例需要在這兒聲明一下 CPPUNIT_TEST( testAdd ); / TestSuite聲明完成 CPPUNIT_TEST_SUITE_END(); / 其余不變 protected: int m_value1, m_value

10、2; public: MathTest() / 初始化函數(shù) void setUp (); / 清理函數(shù) void tearDown(); / 測(cè)試加法的測(cè)試函數(shù) void testAdd (); / 可以添加新的測(cè)試函數(shù) ; / MathTest.cpp / 把這個(gè)TestSuite注冊(cè)到名字為alltest的TestSuite中, 如果沒(méi)有定義會(huì)自動(dòng)定義 / 也可以CPPUNIT_TEST_SUITE_REGISTRATION( MathTest );注冊(cè)到全局的一個(gè)未命名的TestSuite中. CPPUNIT_TEST_SUITE_NAMED_REGISTRATION( MathTest

11、, alltest ); / 下面不變 void MathTest:setUp() m_value1 = 2; m_value2 = 3; void MathTest:tearDown() void MathTest:testAdd() int result = m_value1 + m_value2; CPPUNIT_ASSERT( result = 5 ); / main.cpp/ 不用再包含所有TestFixture子類的頭文件 #include #include / 如果不更改TestSuite, 本文件后期不需要更改. int main() CppUnit:TextUi:TestRu

12、nner runner; / 從注冊(cè)的TestSuite中獲取特定的TestSuite, 沒(méi)有參數(shù)獲取未命名的TestSuite. CppUnit:TestFactoryRegistry ®istry = CppUnit:TestFactoryRegistry:getRegistry(alltest); /若沒(méi)有注冊(cè)名字,在MathTest.cpp文件中只是調(diào)用了CPPUNIT_TEST_SUITE_REGISTRATION( MathTest );那就可以寫成 CppUnit:TestFactoryRegistry ®istry = CppUnit:TestFactoryRegi

13、stry:getRegistry(); / 添加這個(gè)TestSuite到TestRunner中 runner.addTest( registry.makeTest() ); / 運(yùn)行測(cè)試 runner.run(); / mainanother.cpp另外的一種寫法。其實(shí)和上面大同小異,只是生成的對(duì)象是Test而不是registry了。int main(int argc, char* argv) / Get the top level suite from the registry CppUnit:Test *suite = CppUnit:TestFactoryRegistry:getRegi

14、stry().makeTest(); / Adds the test to the list of test to run CppUnit:TextUi:TestRunner runner; runner.addTest( suite ); / Change the default outputter to a compiler error format outputter runner.setOutputter( new CppUnit:CompilerOutputter( &runner.result(),std:cerr ) ); / Run the tests. bool wasSuc

15、essful = runner.run(); / Return error code 1 if the one of test failed. return wasSucessful ? 0 : 1; 這樣添加新的測(cè)試用例(TestFixture)只需要在類定義的開始聲明一下即可。其他實(shí)際問(wèn)題通常包含測(cè)試用例代碼和被測(cè)試對(duì)象是在不同的項(xiàng)目中。應(yīng)該在另一個(gè)項(xiàng)目(最好在不同的目錄)中編寫 TestFixture,然后把被測(cè)試的對(duì)象包含在測(cè)試項(xiàng)目中。對(duì)某個(gè)類或者某個(gè)函數(shù)進(jìn)行測(cè)試的時(shí)候,這個(gè) TestFixture 可能引用了別的類或者別的函數(shù),為了隔離其他部分代碼的影響,應(yīng)該在源文件中臨時(shí)定義一些樁

16、程序,模擬這些類或者函數(shù)。這些代碼可以通過(guò)宏定義在測(cè)試項(xiàng)目中有效,而在被測(cè)試的項(xiàng)目中無(wú)效。CppUnit的組成結(jié)構(gòu)2 核心部分(Core)2.1 基本測(cè)試類 Test TestFixture TestCase TestSuite2.2 測(cè)試結(jié)果記錄 SynchronizedObject TestListener TestResult2.3 錯(cuò)誤處理 TestFailure SourceLine Exception NotEqualException 2.4 斷言 sserter TestAssert 3 輸出部分(Output) 3.1 基礎(chǔ)部件 Outputter TestResultCollector 3.2 衍生類 TextOutputter CompilerOutputter XmlOutputter 4 輔助部分(Helper) 4.1 創(chuàng)建機(jī)制 TypeInfoHelper TestFactory TestFactoryRegistry,NamedRegistries TestSuiteFactory TestSuiteBuilder TestCaller utoRegisterSuite 4.

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論