青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

C++ Programmer's Cookbook

{C++ 基礎(chǔ)} {C++ 高級(jí)} {C#界面,C++核心算法} {設(shè)計(jì)模式} {C#基礎(chǔ)}

CPP Unit 使用


一 準(zhǔn)備

在sourceforge.net上下載CPPUnit的源代碼,地址:http://sourceforge.net/projects/cppunit ,現(xiàn)在最新的版本:cppunit-1.12.0.tar.gz 

二  參考

1)看CPPUnit的源代碼,在你下載的目錄下的src目錄下,還有examples目錄下的samples。
2)在源碼的工程下有一個(gè)txt的幫助文件:INSTALL-WIN32.txt, 很不錯(cuò),但是是英文的。    
3)更多的幫助可以查看:
// http://www.vckbase.com/document/viewdoc/?id=1762
// http://www.codeproject.com/library/Using_CPPUnit.asp
// http://cppunit.sourceforge.net/doc/1.8.0/cppunit_cookbook.html#cppunit_cookbook

三  編譯(我使用vs編譯)

CPPUnit: Unit test 的核心框架庫(kù)
CPPUnit_dll:作用同上,區(qū)別是上面的是靜態(tài)的lib,此為動(dòng)態(tài)的DLL,我們使用時(shí)可以從中任選一個(gè)就可以
TestRunner:MFC擴(kuò)展的DLL,負(fù)責(zé)Report的GUI瀏覽

TestPlugInRunner:PlugIn方式運(yùn)行時(shí),用于運(yùn)行實(shí)現(xiàn)了CPPUnit指定接口的PlugIn DLL
DllPlugInTester:PlugIn方式運(yùn)行時(shí),在plugIn dll的post event 中使用,在對(duì)Plugin dll的編譯時(shí)候檢測(cè)結(jié)果。
DSPlugIn:vc6需要的addin,當(dāng)某些case沒(méi)有通過(guò)是,雙擊可以跳到指定的代碼行,VS200*中不需要

四 實(shí)例 (只介紹使用宏定義來(lái)實(shí)現(xiàn),宏定義使用真是太簡(jiǎn)單了,其他的原理和類(lèi)的實(shí)現(xiàn)及關(guān)系可以參考上面的鏈接)

1)假設(shè)我們要測(cè)試的類(lèi):

//test data 
class SampleClass
{
public:
    
int Add(int i,int j)
    
{
        
return i+j;
    }

    
int Square(int i)
    
{
        
return i*i;
    }

}
;

2)我們需要實(shí)現(xiàn)相應(yīng)的測(cè)試模塊test case:(此類(lèi)繼承CppUnit::TestFixture或CPPUnit::TestCase,可以實(shí)現(xiàn)2個(gè)虛函數(shù)setup()和teardown(),他們?cè)诿總€(gè)測(cè)試函數(shù)即case的前后自動(dòng)調(diào)用)
class SampleClass_TestCase : public CppUnit::TestFixture 
{
  CPPUNIT_TEST_SUITE(SampleClass_TestCase);
      CPPUNIT_TEST(Add_Test);
      CPPUNIT_TEST(Square_Test);
  CPPUNIT_TEST_SUITE_END();

public:
    
void setUp()
    
{
        testClass 
= new SampleClass();
    }


    
void tearDown()
    
{
        delete testClass;
        testClass 
= NULL;
    }


protected:

    
void Add_Test()
    
{
        CPPUNIT_ASSERT(
6 == testClass->Add(1,4));
    }

    
    
void Square_Test()
    
{
        CPPUNIT_ASSERT(
10 == testClass->Square(3));
    }


public:
    
static std::string GetSuiteName();        

private:
    SampleClass 
*testClass;    
}
;

 std::
string SampleClass_TestCase::GetSuiteName()
{
   
return "TestSample";
}
 

3)增加上面的testcase到test suite中,當(dāng)然test suite的名字是可以自己定義的。
//CPPUNIT_TEST_SUITE_REGISTRATION(SampleClassTestCase);
CPPUNIT_TEST_SUITE_NAMED_REGISTRATION(SampleClass_TestCase,SampleClass_TestCase::GetSuiteName());

4)增加上面的test suite到test runner,testrunner負(fù)責(zé)所有test suite的管理。可以使用CPPUNIT_REGISTRY_ADD( which, to ) 建立suite的樹(shù)形關(guān)系。比如:CPPUNIT_REGISTRY_ADD( A, B ) ,CPPUNIT_REGISTRY_ADD( B, C )

CPPUNIT_REGISTRY_ADD_TO_DEFAULT(SampleClass_TestCase::GetSuiteName());


5)調(diào)用Testrunner,顯示結(jié)果,一般有三種方式:
      第一種:GUI的方式,需要我們建立一個(gè)MFC的exe,把下面的代碼加入,在我們的theapp::InitInstance()中調(diào)用下面的函數(shù),且函數(shù)要改為返回true:     
// 1) run ui for output in mfc dialog project(.exe)

void TestMain()
{
    
     
// declare a test runner, fill it with our registered tests and run them
   CppUnit::MfcUi::TestRunner runner;
   runner.addTest( CPPUNIT_NS::TestFactoryRegistry::getRegistry().makeTest());      

   runner.run();
//show UI

}

    第二種:console的方式,需要建立一個(gè)console的exe,把下面的代碼加入,在main中調(diào)用下面的函數(shù):
// 2) run console for output in console project(.exe)

void TestMain()
{
    
// Create the event manager and test controller
    CPPUNIT_NS::TestResult controller;

    
// Add a listener that colllects test result
    CPPUNIT_NS::TestResultCollector result;
    controller.addListener( 
&result );        

    
// Add a listener that print dots as test run.
    CPPUNIT_NS::BriefTestProgressListener progress;
    controller.addListener( 
&progress );      

    
// Add the top suite to the test runner
    CPPUNIT_NS::TestRunner runner;
    
//runner.addTest( CPPUNIT_NS::TestFactoryRegistry::getRegistry().makeTest() );
    runner.run( controller );

    
// Print test in a compiler compatible format.
    CPPUNIT_NS::CompilerOutputter outputter( &result, CPPUNIT_NS::stdCOut() );
    outputter.write(); 
}
  
      第三種:PlugIn的方式,建立一個(gè)DLL,加入下面的代碼,且必須在此DLL中調(diào)用下面的宏之一:(需要注意的是你的dll本身有沒(méi)有main函數(shù))
      我們可以對(duì)此DLL的post -event事件中增加對(duì)DllPlugInTesterud.exe的調(diào)用來(lái)在編譯的時(shí)候就得到結(jié)果, 或?qū)幾g好的DLL使用TestPlugInRunner來(lái)打 開(kāi),用GUI的方式查看結(jié)果。
// //Implements all the plug-in stuffs, WinMain
 
CPPUNIT_PLUGIN_IMPLEMENT();
// //or
// //only export function not has main function. if you have main ,use below macro
// CPPUNIT_PLUGIN_EXPORTED_FUNCTION_IMPL( CPPUNIT_NS::TestPlugInDefaultImpl );

四  更多

1)一般需要使用的頭文件:
#include <cppunit/BriefTestProgressListener.h>
#include 
<cppunit/CompilerOutputter.h>
#include 
<cppunit/TestResult.h>
#include 
<cppunit/TestResultCollector.h>
#include 
<cppunit/TestRunner.h>
#include 
<cppunit/extensions/TestFactoryRegistry.h>
#include 
<cppunit/ui/mfc/TestRunner.h>
2)一般需要使用的宏定義:
//CPPUNIT_ASSERT(condition): checks condition and throws an exception if it's false. 
//CPPUNIT_ASSERT_MESSAGE(message, condition): checks condition and throws an exception and showing 
//specified message 
if it is false
//CPPUNIT_ASSERT_EQUAL(expected,current): checks if expected is the same as current, and raises exception 
//showing expected and current values. 
//CPPUNIT_ASSERT_EQUAL_MESSAGE(message,expected,current): checks if expected is the same as actual, and 
//raises exception showing expected and current values, and specified message. 
//CPPUNIT_ASSERT_DOUBLES_EQUAL(expected,current,delta): checks if expected and current difference is 
//smaller than delta. If it fails, expected and current values are shown. 
3)如果我們對(duì)想對(duì)我們的整個(gè)工程下的函數(shù)進(jìn)行單元測(cè)試,且想使測(cè)試代碼和我們的正式代碼分離,這時(shí)我們可以為我們的測(cè)試代碼建立一個(gè)單獨(dú)的dll(使用plugin)或exe(輸出到GUI或console),在此測(cè)試工程中加入我們正式的代碼,但是不對(duì)我們正式的代碼進(jìn)行拷貝,但是如果我們的project的靜態(tài)的lib,則我們可以直接調(diào)用不需要把代碼再加入測(cè)試模塊中。

posted on 2007-06-25 22:50 夢(mèng)在天涯 閱讀(5591) 評(píng)論(0)  編輯 收藏 引用 所屬分類(lèi): CPlusPlus

公告

EMail:itech001#126.com

導(dǎo)航

統(tǒng)計(jì)

  • 隨筆 - 461
  • 文章 - 4
  • 評(píng)論 - 746
  • 引用 - 0

常用鏈接

隨筆分類(lèi)

隨筆檔案

收藏夾

Blogs

c#(csharp)

C++(cpp)

Enlish

Forums(bbs)

My self

Often go

Useful Webs

Xml/Uml/html

搜索

  •  

積分與排名

  • 積分 - 1816904
  • 排名 - 5

最新評(píng)論

閱讀排行榜

青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
      <noscript id="pjuwb"></noscript>
            <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
              <dd id="pjuwb"></dd>
              <abbr id="pjuwb"></abbr>
              欧美aa在线视频| 亚洲一区免费| 国产麻豆日韩欧美久久| 免费日韩视频| 久久黄金**| 亚洲中字在线| 亚洲色无码播放| 亚洲毛片在线| 欧美激情一区在线观看| 久久午夜av| 欧美一区二区三区喷汁尤物| 亚洲免费观看在线视频| 亚洲第一福利社区| 国产主播一区二区三区| 国产欧美日韩在线播放| 欧美婷婷六月丁香综合色| 欧美激情成人在线| 欧美成人免费全部| 欧美v日韩v国产v| 久色婷婷小香蕉久久| 久久精品亚洲一区二区| 香蕉成人啪国产精品视频综合网| 在线一区二区日韩| 亚洲深夜福利视频| 一区二区三区四区五区视频| 亚洲精品偷拍| 日韩一区二区高清| 99re66热这里只有精品3直播| 亚洲黄色成人久久久| 欧美高清视频一二三区| 欧美 日韩 国产精品免费观看| 老色批av在线精品| 欧美成人亚洲| 亚洲国产日本| 亚洲精品自在久久| 一区二区三区视频观看| 亚洲一级网站| 性欧美暴力猛交69hd| 久久成人精品视频| 久久综合九色99| 免费成人美女女| 欧美日韩国产a| 欧美色大人视频| 国产精品午夜电影| 国产亚洲一区二区三区在线观看 | 久久综合九色综合欧美就去吻| 久久精品五月| 你懂的亚洲视频| 亚洲第一精品影视| 亚洲三级观看| 亚洲一区二区高清视频| 午夜久久影院| 久久一区二区三区av| 欧美高清在线观看| 欧美性片在线观看| 国产亚洲一区二区在线观看| 在线观看亚洲精品视频| 日韩视频一区| 欧美伊人久久| 欧美国产视频在线| 一本一道久久综合狠狠老精东影业| 亚洲综合视频一区| 久久视频在线视频| 欧美日韩免费观看中文| 国产婷婷精品| 最新亚洲一区| 亚洲欧美一区二区三区在线| 久久人人看视频| 亚洲精品日韩在线观看| 校园春色综合网| 欧美激情片在线观看| 国产酒店精品激情| 91久久精品日日躁夜夜躁国产| 亚洲综合国产精品| 欧美成年人视频| 中文精品一区二区三区 | 久久久久se| 亚洲九九精品| 久久国产精品久久久久久久久久 | 欧美亚洲视频一区二区| 欧美成人性生活| 国产视频观看一区| 亚洲最新在线视频| 久久久精品午夜少妇| 日韩视频一区二区三区| 久久久久久婷| 国产精品日本欧美一区二区三区| 亚洲精美视频| 久久精品人人做人人爽| 99re66热这里只有精品3直播| 久久精彩视频| 国产精品每日更新| 日韩午夜精品视频| 每日更新成人在线视频| 亚洲综合色丁香婷婷六月图片| 欧美大片专区| 一区二区三区中文在线观看 | 亚洲国产二区| 久久九九热re6这里有精品| 国产精品国产三级国产a| 亚洲精品麻豆| 美女黄毛**国产精品啪啪| 亚洲欧美文学| 国产精品va在线播放| 日韩午夜电影av| 欧美二区在线| 久久久午夜电影| 国产主播喷水一区二区| 欧美在线观看一区二区| 亚洲视频中文| 国产精品乱人伦一区二区| 一区二区三区www| 亚洲人成艺术| 欧美韩日一区| 亚洲精品视频二区| 亚洲国产成人久久综合一区| 久久伊人精品天天| 伊人激情综合| 欧美91大片| 久久频这里精品99香蕉| 黄色成人91| 开心色5月久久精品| 久久精品久久综合| 狠狠色丁香久久婷婷综合丁香| 久久高清免费观看| 欧美一区二区国产| 国产日韩欧美综合一区| 久久精品一本久久99精品| 性亚洲最疯狂xxxx高清| 国产日产欧产精品推荐色 | 久久av最新网址| 国产综合色在线视频区| 久久免费精品日本久久中文字幕| 西瓜成人精品人成网站| 国产一区二区三区无遮挡| 久久国产精彩视频| 欧美在线播放一区二区| 一区二区三区自拍| 欧美激情亚洲另类| 欧美日本在线一区| 亚洲影院在线观看| 午夜精品三级视频福利| 国内外成人免费视频| 六月婷婷一区| 欧美激情1区2区3区| 一区二区三区日韩| 亚洲天堂成人| 国产揄拍国内精品对白| 久久人人爽国产| 欧美a级在线| 亚洲在线播放| 欧美一区二粉嫩精品国产一线天| 国内一区二区三区| 亚洲国产日韩欧美在线动漫| 欧美日韩免费一区| 欧美在线免费看| 久久久综合精品| aa日韩免费精品视频一| 亚洲一区二区三区成人在线视频精品| 国产欧美短视频| 免费在线观看一区二区| 欧美国产高清| 欧美一区二区免费视频| 浪潮色综合久久天堂| 亚洲图片欧洲图片日韩av| 午夜亚洲性色视频| 亚洲国产片色| 中文无字幕一区二区三区| 狠狠色噜噜狠狠狠狠色吗综合| 亚洲国产欧美不卡在线观看 | 久久夜色精品亚洲噜噜国产mv| 久久综合九色综合久99| 一区二区三区欧美亚洲| 亚洲欧美国产日韩天堂区| 在线精品亚洲| 亚洲视频欧洲视频| 在线欧美不卡| 亚洲一区视频在线观看视频| 亚洲国产欧美另类丝袜| 在线视频亚洲欧美| 亚洲国产精品久久久久婷婷884| 亚洲国产精品久久久久婷婷884| 国产精品男女猛烈高潮激情| 蜜乳av另类精品一区二区| 欧美午夜宅男影院在线观看| 久久久久久高潮国产精品视| 美日韩精品视频| 久久激情五月婷婷| 欧美日韩一区二区三区| 久久偷看各类wc女厕嘘嘘偷窃| 欧美岛国在线观看| 久久久久国产免费免费| 欧美日韩精品一二三区| 欧美成年人网| 国产精品影音先锋| 夜夜嗨av一区二区三区四季av| 在线日韩中文| 欧美亚洲网站| 欧美一乱一性一交一视频| 欧美精品videossex性护士|