锘??xml version="1.0" encoding="utf-8" standalone="yes"?>
]]>
CPPUnit鏈鏂扮増鏈厤璐逛笅杞斤細
http://cppunit.sourceforge.net/
CPPUnit鏄熀浜嶤++鐨勫崟鍏冩祴璇曟鏋訛紝鍙互鏈夋晥鎻愰珮寮鍙戠殑緋葷粺璐ㄩ噺銆?br>寮曡█錛?br>QA榪囩▼甯擱噰鐢ㄤ袱縐嶆祴璇曟柟娉曪細
1銆佸崟鍏冩祴璇曪紙acceptance嫻嬭瘯錛夛細涓鴻蔣浠剁郴緇熶腑鐨勬瘡涓涓昏緫鍗曞厓鍒跺畾鐨勪竴緋誨垪楠岃瘉鏂規硶銆備粎嫻嬭瘯鍗曞厓鐨勫姛鑳斤紝鑰屼笉鑰冭檻鍚勪釜鍗曞厓涔嬮棿鐨勫崗浣滃叧緋匯?br>2銆佺郴緇熸祴璇曪紙闆嗘垚嫻嬭瘯錛夛細嫻嬭瘯緋葷粺鐨勫姛鑳斤紝灝ゅ叾鏄悇鍗曞厓妯″潡涔嬮棿鐨勫崗浣滃叧緋匯?br>涓嬮潰瑕佽鐨勬槸濡備綍閲囩敤CPPUnit瀵笴/C++宸ョ▼榪涜鍗曞厓嫻嬭瘯銆?br>鏂囩珷鍋囪璇昏呯啛鎮夊崟鍏冩祴璇曠殑姒傚康鍙婂叾閲嶈鎬с?br>鍗曞厓嫻嬭瘯璁捐錛?br>鎯充竴涓嬪紑鍙戝洟闃熶腑甯稿父鍑虹幇鐨勪竴縐嶅満鏅細紼嬪簭鍛樻鍦ㄤ嬌鐢―ebugger宸ュ叿嫻嬭瘯浠g爜銆傞噰鐢―ebugger宸ュ叿鍙互鍙互闅忔椂闅忓湴媯鏌ユ瘡涓彉閲忋傛姝ヨ窡韙紝媯鏌ュ彉閲忕殑鍊兼槸鍚﹀紓甯搞侱ebugger鏄竴縐嶅己鏈夊姏鐨勮皟璇曞伐鍏鳳紝浣嗘槸璋冭瘯閫熷害鐩稿綋鎱紝騫朵笖鍖呭惈涓嶅皯閿欒銆傚湪榪欑鎯呭喌涓嬭皟璇曟槸璁╀漢宕╂簝鐨勩傝繖浜涘鏉傛湁澶ч噺閲嶅鐨勯獙璇佹柟娉曟槸鍙互閫氳繃鑷姩鍖栫殑鎵嬫瀹屾垚鐨勶紝闇瑕佸仛鐨勬槸閫夋嫨鍚堥傜殑宸ュ叿騫剁紪鍐欏皯閲忎唬鐮併?br>涓嬮潰瑕佷粙緇嶇殑宸ュ叿鍙仛“鍗曞厓嫻嬭瘯妗嗘灦”錛屽熷姪榪欑宸ュ叿錛屽彲浠ラ氳繃緙栧啓涓浜涘皬鐨勬ā鍧楁潵瀹屾垚妯″潡錛堝彲浠ユ槸綾匯佸嚱鏁板拰搴擄級鐨勫崟鍏冩祴璇曘?br>涓嬮潰鏉ョ湅涓涓緥瀛愶細緙栧啓涓涓皬鐨勬ā鍧楋紝涓昏鍔熻兘鏄眰涓ゆ暟涔嬪拰銆傚叾C璇█浠g爜濡備笅錛?br>BOOL addition(int a, int b)
{
return (a + b);
}
嫻嬭瘯鍗曞厓緙栧啓鎴愬彟澶栦竴涓ā鍧楋紙C鍑芥暟錛夈傝妯″潡嫻嬭瘯鎵鏈夊彲鑳界殑姹備袱鏁頒箣鍜岀殑緇勫悎錛岄氳繃榪斿洖True鎴朏alse鏉ュ垽鏂嫻嬫ā鍧楁槸鍚﹂氳繃浜嗘祴璇曘備唬鐮佸涓嬶細
BOOL additionTest()
{
if ( addition(1, 2) != 3)
{
return (FALSE);
}
if ( addition(0, 0) != 0)
{
return (FALSE);
}
if ( addition(10, 0) != 10)
{
return (FALSE);
}
if ( addition(-8, 0) != -8)
{
return (FALSE);
}
if ( addition(5, -5) != 0)
{
return (FALSE);
}
if ( addition(-5, 2) != -3)
{
return (FALSE);
}
if ( addition(-4, -1) != -5)
{
return (FALSE);
}
return (TRUE);
}
嫻嬭瘯鐨勬儏鍐靛寘鎷細
姝f暟+姝f暟
0+0
姝f暟+0
璐熸暟+0
姝f暟+璐熸暟
璐熸暟+姝f暟
璐熸暟+璐熸暟
姣忎竴嬈℃祴璇曢兘鏄氳繃瀵規瘮琚祴妯″潡鐨勮繑鍥炲煎拰鏈熸湜鍊鹼紝濡傛灉浜岃呬笉鍚岋紝榪斿洖FALSE銆傚鏋滄渶緇堣繑鍥濼RUE錛岃鏄庢ā鍧楅氳繃浜嗘墍鏈夌殑嫻嬭瘯銆?br>榪欎釜鐢ㄤ互嫻嬭瘯鍏朵粬妯″潡鐨勫皬妯″潡錛堝嚱鏁幫級琚О涓篢est Case, 鍏朵腑鍖呭惈浜嗙▼搴忓憳闇瑕佸琚祴鍗曞厓鐨勪竴緋誨垪媯鏌ャ傛瘡涓涓‘璁わ紙瀵硅嫻嬪崟鍏冪殑涓嬈¤皟鐢級閮藉繀欏誨拰琚祴鍗曞厓鐩稿搴斻傚湪榪欎釜渚嬪瓙涓紝媯鏌ヤ簡“姹傚拰鎿嶄綔”鍦ㄦ搷浣滄暟絎﹀彿涓嶅悓鐨勬儏鍐典笅鐨勮繍琛屾儏鍐點傚綋鐒朵簡錛岃繕闇瑕佸彟澶栧啓涓浜汿est Case鏉ラ獙璇佸叾浠栨儏鍐典笅鐨勮繍琛屾儏鍐點傛瘮濡傚叾浠栦竴浜涘父瑙佺殑鍔犳硶緇勫悎銆備緥瀛愬涓嬶細
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);
}
涓婇潰鐨勪緥瀛愭祴璇曚簡澶氫釜鏁版嵁鐩稿姞欏哄簭涓嶅悓鐨勬儏鍐點?br>涓婅堪鐨勪袱涓猅est Case緇勬垚浜嗕竴涓猅est Suite錛孴est Suite鏄寚鐢ㄦ潵嫻嬭瘯鍚屼竴琚祴鍗曞厓鐨勪竴緇凾est Case銆?br>鍦ㄥ紑鍙戣嫻嬫ā鍧楁椂蹇呴』鍚屾椂緙栧啓榪欎簺Test Case鍜孴est Suite鐨勪唬鐮侊紝琚祴妯″潡鍙樻洿鏃訛紝瑕佸悓鏃跺彉鏇達紙鏈夋椂闇瑕佸鍔狅級鐩稿簲鐨凾est Case鍜孴est Suite銆?br>涓句緥鏉ヨ錛屽綋姹傚拰妯″潡鍗囩駭涓哄彲浠ュ灝忔暟姹傚拰鐨勬ā鍧楋紝灝卞繀欏誨彉鏇碩est Case鍜孴est Suite錛屽姞鍏ヨ濡俛ddDecimalNumbersTest涔嬬被鐨凾est Case銆?br>鏋侀檺緙栫▼寤鴻紼嬪簭鍛樺湪緙栧啓鐩爣妯″潡涔嬪墠灝卞紑鍙戝嚭鎵鏈夊崟鍏冩祴璇曚腑瑕佺敤鍒扮殑Test Case銆傚叾涓昏鐞嗙敱鏄細涓鏃︾▼搴忓憳澶勪簬寮鍙戣繃紼嬩箣涓紝閭d箞浠栧氨榪涘叆浜嗕竴涓寔緇敼榪涚殑闃舵錛屽繀欏誨悓鏃惰冭檻鍗曞厓妯″潡鍔熻兘銆侀渶瑕佸叕甯冪殑鎺ュ彛銆侀渶瑕佺粰鏂規硶浼犻掔殑鍙傛暟銆佸閮ㄨ闂佸唴閮ㄨ涓虹瓑絳夈傚湪緙栧啓鐩爣鍗曞厓涔嬪墠閫氳繃寮鍙慣est Case錛屽彲浠ュ闇瑕佽冭檻鐨勮繖浜涘洜绱犳湁鏇村ソ鐨勪簡瑙o紝榪欐牱緙栧啓鐩爣妯″潡涓庡叾浠栨柟娉曠浉姣旈熷害浼氭洿蹇紝浠g爜鐨勮川閲忎篃浼氭洿濂姐?br>姣忓綋寮鍙戝洟闃熼渶瑕佸彂甯冩柊鐗堟湰鐨勬椂鍊欙紝閮借榪涜褰誨簳鐨勫崟鍏冩祴璇曘傛墍鏈夌殑鍗曞厓蹇呴』閫氳繃鍗曞厓嫻嬭瘯錛岃繖鏍峰氨鍙互鍙戝竷鎴愬姛鐨勭増鏈傚鏋滄湁1涓垨浠ヤ笂鐨勫崟鍏冩病鏈夐氳繃鎵鏈夌殑嫻嬭瘯錛孊ug灝卞嚭鐜頒簡銆傞亣鍒拌繖縐嶆儏鍐靛氨闇瑕佸湪榪涜嫻嬭瘯錛屽鏋滈渶瑕佺殑璇濊繕闇瑕佸鍔犳柊鐨凾est Case錛屾鏌ュ彲浠ヤ嬌Bug鍐嶇幇鐨勬墍鏈夋儏鍐點傚鏋滄柊鐨凾est Case鍙互浣緽ug閲嶇幇錛屽氨鍙互淇榪欎釜Bug錛岀劧鍚庡啀榪涜嫻嬭瘯錛屽鏋滄ā鍧楅氳繃浜嗘祴璇曪紝灝卞彲浠ヨ涓築ug宸茬粡淇錛屽彲浠ュ彂甯冩柊鐨勬棤Bug鐗堟湰浜嗐?br>涓烘瘡涓涓彂鐜扮殑Bug娣誨姞鏂扮殑Test Case鏄緢鏈夊繀瑕佺殑錛屽洜涓築ug浼氬弽澶嶅嚭鐜幫紝褰撳叾閲嶅鍑虹幇鏃墮渶瑕佹湁鏁堢殑嫻嬭瘯鏉ユ嫻婤ug銆傝繖鏍風殑璇濓紝Test Bettery浼氶愭笎鑶ㄨ儉鐩磋嚦瑕嗙洊鎵鏈夌殑鍘嗗彶Bug鍜屾綔鍦ㄧ殑閿欒銆?br>嫻嬭瘯宸ュ叿錛?br>鏈変袱涓皬浼欏瓙錛屼竴涓彨Kent Beck錛屽彟涓涓彨Eric Gamma錛屼粬浠啓浜嗕竴緋誨垪鐨凧ava綾伙紝甯屾湜鍙互鎶婃祴璇曞仛鐨勫敖鍙兘鑷姩鍖栵紝騫剁О涔嬩負JUnit錛孞Unit浣挎暣涓崟鍏冩祴璇曠晫浜х敓鐨勫緢澶х殑闇囧姩銆傚叾浠栫殑寮鍙戣呬滑鎶奐Unit鐨勪唬鐮佺Щ妞嶅埌鍏朵粬璇█涓婏紝鏋勫緩浜嗕竴澶х郴鍒楃О涓簒Unit妗嗘灦鐨勪駭鍝併傚叾鎬誨寘鎷珻/C++鐨凜Unit鍜孋PPUnit錛孌elphi鐨凞Unit錛孷isual Basic鐨刅BUnit錛?NET騫沖彴涓婄殑NUnit錛岀瓑絳夈?br>鎵鏈夎繖浜涙鏋墮兘閲囩敤鍚屾牱鐨勮鍒欙紝瀵硅璦鐨勪緷璧栨у緢灝忥紝鐔熸倝鍏朵腑涓涓鏋跺氨鑳藉鐔熺粌搴旂敤鍏朵粬妗嗘灦銆?br>涓嬮潰瑕佽鐨勬槸濡備綍閫氳繃浣跨敤CPPUnit鏉ョ紪鍐欐祴璇曚唬鐮佸茍鎻愰珮鍗曞厓鐨勮川閲忋?br>CPPUnit閲囩敤闈㈠悜瀵硅薄鐨勭紪紼嬫柟娉曪紝涓棿浼氶亣鍒拌濡傚皝瑁呫佺戶鎵褲佸鎬佽繖浜涙蹇點傚彟澶栵紝CPPUnit閲囩敤C++ SEH錛圫tructured Exception Handling錛夛紝鎵浠ヨ繕浼氶亣鍒板紓甯哥殑姒傚康錛屼互鍙妕hrow, try, finally, catch榪欎簺鎸囦護銆?br>CPPUnit
姣忎竴涓猅est Case閮介渶瑕佸湪TestCase綾葷殑媧劇敓綾諱腑瀹氫箟銆俆estCase綾諱腑鍖呭惈浜嗚澶氬熀鏈殑鍔熻兘錛屾瘮濡傝繍琛屾祴璇曘佸湪Test Suite涓敞鍐孴est Case絳夈?br>姣斿鍦ㄩ渶瑕佸啓涓涓湪紓佺洏涓婂瓨鍌ㄦ暟鎹殑灝忔ā鍧楃殑鏃跺欙紝妯″潡錛堝畾涔変負DiskData綾伙級涓昏瀹炵幇涓や釜鍔熻兘錛氳鍙栨暟鎹拰瑁呰澆鏁版嵁銆備緥紼嬪涓嬶細
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;
};
姝ゆ椂錛岄鍏堣鍋氱殑浜嬫儏涓嶆槸寮勬槑鐧戒笂闈㈢殑浠g爜鏄浣曞彉鍑烘潵鐨勶紝鑰屾槸瑕佺‘瀹氫笂闈㈡墍瀹氫箟鐨勭被鏄惁瀹屾垚浜嗚璁$殑鍏ㄩ儴鍔熻兘鈥斺旀紜湴璇誨彇鍜屽瓨鍌ㄦ暟鎹?/p>
涓烘錛岄渶瑕佽璁′竴涓柊鐨凾est Suite錛屽叾涓寘鍚袱涓猅est Case錛氫竴涓鍙栨暟鎹佷竴涓瓨鍌ㄦ暟鎹?/p>
浣跨敤CPPUnit
鏈鏂扮増鏈殑CPPUnit鍙互鍦?a >http://cppunit.sourceforge.net/涓婂厤璐逛笅杞藉埌錛屽叾涓寘鍚墍鏈夌殑搴撴枃浠躲佹枃妗c佷緥瀛愮▼搴忓拰鍏朵粬鏈夎叮鐨勭礌鏉愩?/p>
鍦╓in32鐜涓嬶紝鍙互鍦╒C++錛?.0鎴栨洿鏂扮増鏈級涓嬌鐢–PPUnit錛岀敱浜嶤PPUnit閲囩敤鐨勬槸ANSI C++錛屾墍浠ュ彲搴旂敤浜嶤++ Builder絳夊紑鍙戠幆澧冧腑鐨勭増鏈緝灝戙?br>鏋勫緩搴撴枃浠剁殑姝ラ鍙互鍦–PPUnit鍙戝竷鐗堟湰鐨処NSTALL-WIN32.txt鏂囦歡涓壘鍒般傛瀯
寤哄ソ搴撴枃浠朵箣鍚庡氨鍙互鐫鎵嬬紪鍐橳est Suite浜嗐?/p>
鍦╒C++涓嬬紪鍐欏崟鍏冩祴璇曠▼搴忕殑姝ラ濡備笅錛?br> 鍒涘緩涓涓熀浜嶮FC鐨勫璇濇搴旂敤紼嬪簭錛堟垨鑰呮枃妗e簲鐢ㄧ▼搴忥級
寮鍚疪TTI:Project Settings -> C++ -> C++ Language
鍦╥nclude鐩綍涓姞鍏PPUnit\include:Tools -> Options -> Directories -> Include
榪炴帴cppunitd.lib(闈欐佽繛鎺?鎴栬卌ppunitd_dll.lib(鍔ㄦ佽繛鎺?錛宼estrunnerd.lib銆傚鏋滄槸鍦?#8220;Release”閰嶇疆涓嬬紪璇戯紝鍚屾牱闇瑕佽繛鎺ヨ繖浜涘簱鏂囦歡錛屽彧鏄渶瑕佹妸鍚嶇О涓殑“d”瀛楁瘝鍘繪帀銆?br> 鎷瘋礉testrunnerd.dll鏂囦歡鍒板彲鎵ц鏂囦歡澶圭殑涓嬮潰錛堟垨鑰呰礬寰勪笅鐨勫叾浠栨枃浠跺す涓級錛屽鏋滄槸鍔ㄦ佽繛鎺ョ殑璇濓紝榪橀渶瑕佹嫹璐漜ppunitd_dll.dll錛?#8220;Release”閰嶇疆涓嬮渶瑕佹嫹璐漷estrunner.dll鍜宑ppunit_dll.dll錛夈?/p>
閰嶇疆濂戒箣鍚庡嵆鍙互鐫鎵嬭繘琛屽崟鍏冩祴璇曠被緙栫爜浜嗐?/p>
寰呮祴璇曠殑DiskData綾伙紝涓昏瀹炵幇涓や釜鍔熻兘錛氳鍙栧拰瀛樺偍紓佺洏涓婄殑鏁版嵁銆傝嫻嬭瘯榪欎袱涓姛鑳斤紝闇瑕佷袱涓猅est Case錛氫竴涓礋璐h鍙栨暟鎹佷竴涓礋璐e瓨鍌ㄦ暟鎹?br>涓嬮潰鏄崟鍏冩祴璇曠被鐨勫畾涔夛細
#if !defined(DISKDATA_TESTCASE_H_INCLUDED)
#define DISKDATA_TESTCASE_H_INCLUDED
#if _MSC_VER > 1000
#pragma once
#endif // _MSC_VER > 1000
#include <cppunit/TestCase.h>//涓轟簡浠庡熀綾籘estCase媧劇敓鏂扮殑嫻嬭瘯綾?br>#include <cppunit/extensions/HelperMacros.h>//鏂逛究蹇熷畾涔夋祴璇曠被鐨勫畯
#include "DiskData.h"
class DiskDataTestCase : public CppUnit::TestCase
{
CPPUNIT_TEST_SUITE(DiskDataTestCase);//瀹氫箟Test Suite鐨勮搗鐐?br> CPPUNIT_TEST(loadTest);//瀹氫箟Test Case
CPPUNIT_TEST(storeTest);
CPPUNIT_TEST_SUITE_END();//瀹氫箟Test Suite鐨勭粓鐐?/p>
public:
void setUp();
void tearDown();
protected:
void loadTest();
void storeTest();
private:
DiskData *fixture;
};
#endif
渚嬬▼涓紝DiskDataTestCase綾婚噸杞戒簡涓や釜鏂規硶錛歴etUp()鍜宼earDown()銆傝繖涓や釜鏂規硶鍦═est Case寮濮嬪拰緇撴潫鐨勬椂鍊欒嚜鍔ㄨ繍琛屻?/p>
嫻嬭瘯閫昏緫鏄湪涓や釜Protected鏂規硶涓疄鐜扮殑錛岀◢鍚庤娑夊強鍒板浣曚負嫻嬭瘯閫昏緫緙栫爜銆?nbsp;
渚嬬▼鐨勬渶鍚庡畾涔変簡鎸囧悜DiskData綾誨瀷鏁版嵁鐨勬寚閽坒ixture錛岀敤浠ヤ繚瀛樻祴璇曡繃紼嬩腑鐨勭洰鏍囧璞°俿etUp()鏄垵濮嬪寲鍑芥暟錛屽湪璋冪敤姣忎竴涓猅est Case涔嬪墠璋冪敤setUp()錛屽悓鏃惰礋璐e垵濮嬪寲鐩爣瀵硅薄銆俆est Case榪愯榪囩▼涓浣跨敤fixture銆傚湪姣忎竴涓猅est Case榪愯緇撴潫涔嬪悗錛岃皟鐢╰earDown()閿姣乫ixture銆傝繖鏍鳳紝姣忔榪愯Test Case鏃舵墍浣跨敤鐨勯兘鏄柊浜х敓鐨刦ixture銆?/p>
嫻嬭瘯姝ラ濡備笅錛?br> 寮鍚祴璇曠▼搴?br> 鐐瑰嚮“Run”鎸夐敭
璋冪敤setUp()鏂規硶錛氬垵濮嬪寲fixture
璋冪敤絎竴涓猅est Case鍑芥暟
璋冪敤tearDown()鏂規硶錛氶噴鏀緁ixture
璋冪敤setUp()鏂規硶錛氬垵濮嬪寲fixture
璋冪敤絎簩涓猅est Case鍑芥暟
璋冪敤tearDown()鏂規硶錛氶噴鏀緁ixture
...
緇忚繃緙栫爜錛?br>#include "DiskDataTestCase.h"
CPPUNIT_TEST_SUITE_REGISTRATION(DiskDataTestCase);
void DiskDataTestCase::setUp()
{
fixture = new DiskData();
}
void DiskDataTestCase::tearDown()
{
delete fixture;
fixture = NULL;
}
void DiskDataTestCase::loadTest()
{
// our load test logic
}
void DiskDataTestCase::storeTest()
{
// our store test logic
}
鐜板湪錛岀紪鐮佸凡緇忓彉寰楅潪甯哥畝鍗曚簡錛歴etUp()鍜宼earDown()瀹炵幇浜嗗垱寤恒侀噴鏀緁ixture錛屼笅闈㈣鍋氱殑灝辨槸涓簂oadTest()銆乻toreTest()緙栫爜浜嗐?/p>
Test Case緙栫爜
鎼炴竻妤氶渶瑕佹祴璇曢偅浜涙柟闈箣鍚庣殑宸ヤ綔鏄紪鐮佸疄鐜般傚彲浠ラ氳繃浣跨敤搴撳嚱鏁般佺涓夋柟搴撳嚱鏁般乄in32 API鎴栬匔/C++鎿嶄綔絎﹀拰鎸囦護鐨勫唴閮ㄥ睘鎬с?/p>
鏈夋椂闇瑕佽緟鍔╃殑鏂囦歡鎴栬呮暟鎹簱琛ㄦ潵瀛樺偍姝g‘鐨勬暟鎹傚湪鏈緥涓紝閫氳繃瀵規瘮鍐呴儴涓嶆暟鎹拰澶栭儴鏂囦歡鐨勬暟鎹潵鍒ゆ柇緇撴灉鏄惁姝g‘銆?/p>
褰撳嚭鐜伴敊璇椂錛堟瘮濡傚唴閮ㄦ暟鎹拰澶栭儴鏁版嵁涓嶅悓錛夛紝闇瑕佹姏鍑哄紓甯搞傚彲浠ラ氳繃CPPUNIT_FAIL(message)瀹忓疄鐜幫紝涔熷彲浠ラ氳繃assertions瀹忓疄鐜般?br>浠ヤ笅鏄竴浜涘父鐢ㄧ殑assertion瀹?
CPPUNIT_ASSERT(condition): 媯鏌ondition錛屽涓篺alse錛屾姏鍑哄紓甯?br> CPPUNIT_ASSERT_MESSAGE(message, condition): 媯鏌ondition錛屽涓篺alse錛屾姏鍑哄紓甯革紝騫舵樉紺洪鍏堣瀹氱殑淇℃伅
CPPUNIT_ASSERT_EQUAL(expected,current): 媯鏌xpected涓巆urrent鐨勫兼槸鍚︾浉絳夛紝鎶涘嚭寮傚父錛屾樉紺篹xpected鍜宑urrent鐨勫?br> CPPUNIT_ASSERT_EQUAL_MESSAGE(message,expected,current): 媯鏌xpected鐨勫間笌actual鐨勫兼槸鍚︾浉絳夛紝鎶涘嚭寮傚父錛屾樉紺篹xpected,current鐨勫鹼紝騫舵樉紺洪鍏堣瀹氱殑淇℃伅
CPPUNIT_ASSERT_DOUBLES_EQUAL(expected,current,delta): 媯鏌xpected, current涔嬪樊鏄惁灝忎簬delta錛屽鏋滀笉灝忎簬錛屾樉紺篹xpected鍜宑urrent鐨勫?/p>
涓嬮潰璁蹭竴涓媗oadTest緙栫爜鐨勭紪鐮佹瀯鎯籌細棣栧厛闇瑕佷竴涓閮ㄦ枃浠訛紝鍏朵腑瀛樺偍榪欎竴涓狣ATA鍨嬫暟鎹紝鏂囦歡鐨勫垱寤烘柟寮忓茍涓嶉噸瑕侊紝鍏抽敭鏄淇濊瘉閲岄潰鐨勬暟鎹殑姝g‘鎬с傜劧鍚庯紝瑕佽繘琛岀殑鎿嶄綔鏄鏌oad鍑芥暟浠庡閮ㄦ枃浠朵腑璇誨嚭鐨勬暟鎹拰瀹炵幇瀛樺湪鍏朵腑鐨勬暟鎹槸鍚︿竴鑷淬備唬鐮佸涓嬶細
//
// 鍓嶆彁錛氬閮ㄦ枃浠朵腑宸插瓨鍌ㄤ簡姝g‘鐨勬暟鎹?br>//
#define AUX_FILENAME "ok_data.dat"
#define FILE_NUMBER 19
#define FILE_STRING "this is correct text stored in auxiliar file"
void DiskDataTestCase::loadTest()
{
// 鐩稿璺緞杞寲涓虹粷瀵硅礬寰?br> TCHAR absoluteFilename[MAX_PATH];
DWORD size = MAX_PATH;
strcpy(absoluteFilename, AUX_FILENAME);
CPPUNIT_ASSERT( RelativeToAbsolutePath(absoluteFilename, &size) );
// 鎵ц鎿嶄綔
CPPUNIT_ASSERT( fixture->load(absoluteFilename) );
// 閫氳繃assertion媯鏌ヨ繍琛岀粨鏋?br> LPDATA loadedData = fixture->getData();
CPPUNIT_ASSERT(loadedData != NULL);
CPPUNIT_ASSERT_EQUAL(FILE_NUMBER, loadedData->number);
CPPUNIT_ASSERT( 0 == strcmp(FILE_STRING,
fixture->getData()->string) );
}
閫氳繃榪欐牱涓涓畝鍗曠殑Test Case嫻嬭瘯浜?涓彲鑳藉瓨鍦ㄧ殑閿欒錛?br> load鍑芥暟榪斿洖鍊?br> getData鍑芥暟榪斿洖鍊?br> number緇撴瀯鐨勬垚鍛樺?br> string緇撴瀯鐨勬垚鍛樺?br>
storeTest瑕佸鏉備竴浜涳紝鍥犱負闇瑕佹妸fixture涓殑鏁版嵁瀛樺偍鍒頒復鏃舵枃浠朵腑錛屼箣鍚庢墦寮涓や釜鏂囦歡錛堟柊鐨勪復鏃舵枃浠跺拰澶栭儴鏂囦歡錛夛紝璇誨嚭鏁版嵁騫舵瘮鐓у唴瀹廣備唬鐮佸涓嬶細
void DiskDataTestCase::storeTest()
{
DATA d;
DWORD tmpSize, auxSize;
BYTE *tmpBuff, *auxBuff;
TCHAR absoluteFilename[MAX_PATH];
DWORD size = MAX_PATH;
// 濉厖緇撴瀯浣?br> d.number = FILE_NUMBER;
strcpy(d.string, FILE_STRING);
// 鐩稿璺緞杞寲涓虹粷瀵硅礬寰?/p>
strcpy(absoluteFilename, AUX_FILENAME);
CPPUNIT_ASSERT( RelativeToAbsolutePath(absoluteFilename, &size) );
// 鎵ц鎿嶄綔
fixture->setData(&d);
CPPUNIT_ASSERT( fixture->store("data.tmp") );
// 璇誨嚭涓ゆ枃浠剁殑鍐呭騫跺姣?br> // ReadAllFileInMemory 鏄竴涓垎閰嶇紦鍐插尯鐨勫閮ㄥ嚱鏁?br> // 鎶婃枃浠跺唴瀹瑰瓨鍏ュ叾涓? 璋冪敤鍑芥暟璐熻矗閲婃斁緙撳啿鍖?
tmpSize = ReadAllFileInMemory("data.tmp", tmpBuff);
auxSize = ReadAllFileInMemory(absoluteFilename, auxBuff);
// 鏂囦歡涓嶅瓨鍦ㄥ垯鎶涘嚭寮傚父
CPPUNIT_ASSERT_MESSAGE("New file doesn't exists?", tmpSize > 0);
CPPUNIT_ASSERT_MESSAGE("Aux file doesn't exists?", auxSize > 0);
// 鏂囦歡澶у皬鍙幏寰楋紝鍚﹀垯鎶涘嚭寮傚父
CPPUNIT_ASSERT(tmpSize != 0xFFFFFFFF);
CPPUNIT_ASSERT(auxSize != 0xFFFFFFFF);
// 緙撳啿鍖哄繀欏誨彲鐢紝鍚﹀垯鎶涘嚭寮傚父
CPPUNIT_ASSERT(tmpBuff != NULL);
CPPUNIT_ASSERT(auxBuff != NULL);
// 涓や釜鏂囦歡鐨勫ぇ灝忓繀欏誨拰DATA涓鑷?br> CPPUNIT_ASSERT_EQUAL((DWORD) sizeof(DATA), tmpSize);
CPPUNIT_ASSERT_EQUAL(auxSize, tmpSize);
// 涓ゆ枃浠剁殑鍐呭蹇呴』涓鑷?br> CPPUNIT_ASSERT( 0 == memcmp(tmpBuff, auxBuff, sizeof(DATA)) );
delete [] tmpBuff;
delete [] auxBuff;
::DeleteFile("data.tmp");
}
鍚姩鐢ㄦ埛鐣岄潰
鏈鍚庯紝鐪嬬湅濡備綍鏄劇ず鍩轟簬MFC鐨勭敤鎴風晫闈㈠璇濇錛堜簨鍏堝湪鍏跺唴閮ㄧ紪璇戜簡TestRunner.dll錛夈?/p>
鎵撳紑瀹炵幇綾葷殑鏂囦歡錛圥rojectNameApp.cpp錛夛紝鎶婁笅鍒椾唬鐮佸鍒跺埌InitInstance鏂規硶涓細
#include <cppunit/ui/mfc/TestRunner.h>
#include <cppunit/extensions/TestFactoryRegistry.h>
BOOL CMy_TestsApp::InitInstance()
{
....
// 澹版槑Test Runner錛岀敤浠ユ敞鍐岀殑嫻嬭瘯濉叆鍏朵腑錛屽茍榪愯
CppUnit::MfcUi::TestRunner runner;
runner.addTest( CppUnit::TestFactoryRegistry::getRegistry().makeTest() );
runner.run();
return TRUE;
}
寰堢畝鍗曪紝涓嶆槸鍚楋紵鍙渶瑕佸畾涔変竴涓?runner"瀹炰緥錛屾坊鍔犳敞鍐岃繃鐨則est錛坱est鏄氳繃CPP鏂囦歡涓殑CPPUNIT_TEST_SUITE_REGISTRATION瀹忔敞鍐岀殑錛夛紝灝卞彲浠ヨ繍琛宺un鍑芥暟浜嗐?/p>
緙栬瘧銆佽繍琛岋紝寮濮嬩綘鐨勫崟鍏冩祴璇曞惂:)