锘??xml version="1.0" encoding="utf-8" standalone="yes"?>亚洲国产专区校园欧美,99精品视频一区,亚洲肉体裸体xxxx137http://m.shnenglu.com/shuiyuan2004/鈥斺斿欓笩錛屽欒ˉ鐨勮彍楦熶篃zh-cnMon, 17 Nov 2025 00:57:22 GMTMon, 17 Nov 2025 00:57:22 GMT60[杞琞嫻嬭瘯椹卞姩寮鍙戝叏鍔熺暐http://m.shnenglu.com/shuiyuan2004/archive/2008/03/30/45751.html涓嶅?/dc:creator>涓嶅?/author>Sun, 30 Mar 2008 08:42:00 GMThttp://m.shnenglu.com/shuiyuan2004/archive/2008/03/30/45751.htmlhttp://m.shnenglu.com/shuiyuan2004/comments/45751.htmlhttp://m.shnenglu.com/shuiyuan2004/archive/2008/03/30/45751.html#Feedback0http://m.shnenglu.com/shuiyuan2004/comments/commentRss/45751.htmlhttp://m.shnenglu.com/shuiyuan2004/services/trackbacks/45751.htmlFrom: Brian Sun @ 鐖爲(wèi)鐨勬場(chǎng)娉http://www.blogjava.net/briansun]

{鍏抽敭瀛梷

嫻嬭瘯椹卞姩寮鍙?Test Driven Development/TDD
嫻嬭瘯鐢ㄤ緥/TestCase/TC
璁捐/Design
閲嶆瀯/Refactoring

{TDD鐨勭洰鏍噠

Clean Code That Works

榪欏彞璇濈殑鍚箟鏄紝浜嬪疄涓婃垜浠彧鍋氫袱浠朵簨鎯咃細(xì)璁╀唬鐮佸鏁堬紙Work錛夊拰璁╀唬鐮佹磥鍑錛圕lean錛夛紝鍓嶈呮槸鎶婁簨鎯呭仛瀵癸紝鍚庤呮槸鎶婁簨鎯呭仛濂姐傛兂鎯崇湅錛屽叾瀹炴垜浠鉤鏃舵墍鍋氱殑鎵鏈夊伐浣滐紝闄ゅ幓鏃犵敤鐨勫伐浣滃拰閿欒鐨勫伐浣滀互澶栵紝鐪熸姝g‘鐨勫伐浣滐紝騫朵笖鏄湡姝f湁鎰忎箟鐨勫伐浣滐紝鍏跺疄涔熷氨鍙湁涓ゅぇ綾伙細(xì)澧炲姞鍔熻兘鍜屾彁鍗囪璁★紝鑰孴DD 姝f槸鍦ㄨ繖涓師鍒欎笂浜х敓鐨勩傚鏋滄?zhèn)ㄧ殑宸ヤ綔迤堥潪鎴戜滑鎯宠薄鐨剺q欐牱錛岋紙榪欐剰鍛崇潃鎮(zhèn)ㄨ繕瀛樺湪絎笁綾繪紜湁鎰忎箟鐨勫伐浣滐紝鎴栬呮?zhèn)ㄦ墍瑕佸仛鐨勬牴鏈拰鎴戜滑鍦ㄨ鐨勬槸涓ゅ洖浜嬶級(jí)錛岄偅涔堣繖鍛婅瘔鎴戜滑鎮(zhèn)ㄥ茍涓嶉渶瑕乀DD錛屾垨鑰呬笉閫傜敤TDD銆傝屽鏋滄垜浠伓鐒剁寽瀵癸紙榪欏浜庢垜鏉ヨ鏄伓鐒?dòng)灱岃屽浜嶬ent Beck鍜孧artin Fowler榪欐牱鐨勫ぇ甯堟潵璇村垯鏄緵鍕ゅ伐浣滅殑鎴愭灉錛夛紝閭d箞鎭枩鎮(zhèn)紝TDD鏈夊彲鑳芥垚涓烘?zhèn)ㄦ樉钁楁彁鍗囧伐浣滄晥鐜囩殑涓浠舵硶瀹濄傝涓嶈灝嗕俊灝嗙枒錛岃嫢鍗寵嫢紱伙紝鍥犱負(fù)浠諱綍涓欏規(guī)柊鐨勬妧鏈斺斿彧瑕佹槸浠庢牴鏈笂鏀瑰彉浜虹殑琛屼負(fù)鏂瑰紡鐨勬妧鏈斺斿氨蹇呯劧浣垮緱鐩鎬俊瀹冪殑浜鴻秺鏉ヨ秺鐩鎬俊錛屼笉淇$殑浜鴻秺鏉ヨ秺涓嶄俊銆傝繖灝卞ソ姣斿娓告吵錛屽敮涓鑳藉浼?xì)娓告吵鐨勯斿緞灝辨槸浜茶嚜涓嬪幓娓革紝闄ゆ涔嬪鍒棤浠栨硶銆傝繖涔熷ソ姣旀垚鍔熷錛屽嵆浣挎妸鍗¤愬熀鎴栧笇灝?dāng)鍗氬+鐨勪功鍊掕儗濡傛祦涔熶笉鑳芥嫢鏈夌Н鏋佺殑蹇?jī)鎬侊紝鍙綋浣犱互縐瀬鐨勫績(jī)鎬佸幓鎴愬氨浜?jiǎn)涓鐣簨涓氫箣鍚庯紝浣犲氨鍐嶄篃紱諱笉寮瀹冧簡(jiǎn)銆傜浉淇℃垜錛孴DD涔熸槸榪欐牱錛佹兂璇曠敤TDD鐨勪漢浠紝璇烽伒寰笅闈㈢殑姝ラ錛?/p>

緙栧啓TestCase --> 瀹炵幇TestCase --> 閲嶆瀯
錛堢‘瀹氳寖鍥村拰鐩爣錛?/td>   錛堝鍔犲姛鑳斤級(jí)   錛堟彁鍗囪璁★級(jí)

[鍙嬫儏鎻愮ず錛氭晱鎹峰緩妯′腑鐨勪竴涓浉褰撻噸瑕佺殑瀹炶返琚О涓猴細(xì)Prove it With Code錛岃繖縐嶆兂娉曞拰TDD涓嶈皨鑰屽悎銆俔

{TDD鐨勪紭鐐箎

    銆庡厖婊″惛寮曞姏鐨勪紭鐐廣?/strong>

  1. 瀹屽伐鏃跺畬宸ャ傝〃鏄庢垜鍙互寰堟竻妤氱殑鐪嬪埌鑷繁鐨勮繖孌靛伐浣滃凡緇忕粨鏉熶簡(jiǎn)錛岃屼紶緇熺殑鏂瑰紡寰堥毦鐭ラ亾浠涔堟椂鍊欑紪鐮佸伐浣滅粨鏉熶簡(jiǎn)銆?
  2. 鍏ㄩ潰姝g‘鐨勮璇嗕唬鐮佸拰鍒╃敤浠g爜錛岃屼紶緇熺殑鏂瑰紡娌℃湁榪欎釜鏈轟細(xì)銆?
  3. 涓哄埄鐢ㄤ綘鎴愭灉鐨勪漢鎻愪緵Sample錛屾棤璁哄畠鏄鍒╃敤浣犵殑婧愪唬鐮侊紝榪樻槸鐩存帴閲嶇敤浣犳彁渚涚殑緇勪歡銆?
  4. 寮鍙戝皬緇勯棿闄嶄綆浜?jiǎn)浜箒鎴愭湰锛屾彁楂樹簡(jiǎn)鐩镐簰淇¤禆绋嬪害銆?
  5. 閬垮厤浜?jiǎn)杩囨浮璁捐銆?
  6. 緋葷粺鍙互涓庤灝界殑嫻嬭瘯闆嗕竴璧峰彂甯冿紝浠庤屽紼嬪簭鐨勫皢鏉ョ増鏈殑淇敼鍜屾墿灞曟彁渚涙柟渚褲?
  7. TDD緇欎簡(jiǎn)鎴戜滑鑷俊錛岃鎴戜滑浠婂ぉ鐨勯棶棰樹粖澶╄В鍐籌紝鏄庡ぉ鐨勯棶棰樻槑澶╄В鍐籌紝浠婂ぉ涓嶈兘瑙e喅鏄庡ぉ鐨勯棶棰橈紝鍥犱負(fù)鏄庡ぉ鐨勯棶棰樿繕娌℃湁鍑虹幇(娌℃湁TestCase)錛岄櫎闈炴湁TestCase鍚﹀垯鎴戝喅涓嶅啓浠諱綍浠g爜錛涙槑澶╀篃涓嶅繀鎷呭績(jī)浠婂ぉ鐨勯棶棰橈紝鍙鎴戜寒浜?jiǎn)缁跨伅銆?

    銆庝笉鏄捐屾槗瑙佺殑浼樼偣銆?/strong>

  8. 閫冮伩浜?jiǎn)璁捐瑙掕墝觻傚浜庝竴涓晱鎹風(fēng)殑寮鍙戝皬緇勶紝姣忎釜浜洪兘鍦ㄥ仛璁捐銆?
  9. 澶ч儴鍒嗘椂闂翠唬鐮佸鍦ㄩ珮璐ㄩ噺鐘舵侊紝100錛呯殑鏃墮棿閲屾垚鏋滄槸鍙鐨勩?
  10. 鐢變簬鍙互淇濊瘉緙栧啓嫻嬭瘯鍜岀紪鍐欎唬鐮佺殑鏄浉鍚岀殑紼嬪簭鍛橈紝闄嶄綆浜?jiǎn)鐞嗚В浠g爜鎵鑺辮垂鐨勬垚鏈?
  11. 涓哄噺灝戞枃妗e拰浠g爜涔嬮棿瀛樺湪鐨勭粏寰殑宸埆鍜岀敱榪欑宸埆鎵寮曞叆鐨凚ug浣滃嚭鏉板嚭璐$尞銆?
  12. 鍦ㄩ鍏堣璁″拰绱фヨ璁′箣闂村緩绔嬩竴縐嶅鉤琛$偣錛屼負(fù)浣犲尯鍒嗗摢浜涜璁¤浜嬪厛鍋氥佸摢浜涜璁¤榪唬鏃跺仛鎻愪緵浜?jiǎn)涓涓彲闈犵殑鍒ゆ柇渚濇嵁銆?

    銆庢湁浜夎鐨勪紭鐐廣?/strong>

  13. 浜嬪疄涓婃彁楂樹簡(jiǎn)寮鍙戞晥鐜囥傛瘡涓涓鍦ㄤ嬌鐢═DD騫剁浉淇DD鐨勪漢閮戒細(xì)鐩鎬俊榪欎竴鐐癸紝浣嗚鏈涜呭垯涓嶅悓錛屼笉鐩鎬俊TDD鐨勪漢鐢氳嚦鍧氬喅鍙嶅榪欎竴鐐癸紝榪欏緢姝e父錛屼笘鐣屾繪槸榪欐牱銆?
  14. 鍙戠幇姣斾紶緇熸祴璇曟柟寮忔洿澶氱殑Bug銆?
  15. 浣縄DE鐨勮皟璇曞姛鑳藉け鍘繪剰涔夛紝鎴栬呭簲璇ヨ錛岄伩鍏嶄簡(jiǎn)浠や漢澶寸棝鐨勮皟璇曞拰鑺傜害浜?jiǎn)璋冭瘯鐨勬棄櫁淬?
  16. 鎬繪槸澶勫湪瑕佷箞緙栫▼瑕佷箞閲嶆瀯鐨勭姸鎬佷笅錛屼笉浼?xì)鋴射汉鎶撶媯銆傦紙涓ら《甯藉瓙錛?
  17. 鍗曞厓嫻嬭瘯闈炲父鏈夎叮銆?
{TDD鐨勬楠
緙栧啓TestCase --> 瀹炵幇TestCase --> 閲嶆瀯
錛堜笉鍙繍琛岋級(jí)   錛堝彲榪愯錛?/td>   錛堥噸鏋勶級(jí)
姝ラ 鍒跺搧
錛?錛夊揩閫熸柊澧炰竴涓祴璇曠敤渚?/td> 鏂扮殑TestCase
錛?錛夌紪璇戞墍鏈変唬鐮侊紝鍒氬垰鍐欑殑閭d釜嫻嬭瘯寰堝彲鑳界紪璇戜笉閫氳繃 鍘熷鐨凾ODO List
錛?錛夊仛灝藉彲鑳藉皯鐨勬敼鍔紝璁╃紪璇戦氳繃 Interface
錛?錛夎繍琛屾墍鏈夌殑嫻嬭瘯錛屽彂鐜版渶鏂扮殑嫻嬭瘯涓嶈兘緙栬瘧閫氳繃 錛?Red Bar)
錛?錛夊仛灝藉彲鑳藉皯鐨勬敼鍔紝璁╂祴璇曢氳繃 Implementation
錛?錛夎繍琛屾墍鏈夌殑嫻嬭瘯錛屼繚璇佹瘡涓兘鑳介氳繃 錛?Green Bar)
錛?錛夐噸鏋勪唬鐮侊紝浠ユ秷闄ら噸澶嶈璁?/td> Clean Code That Works

{FAQ}

[浠涔堟椂鍊欓噸鏋勶紵]
濡傛灉鎮(zhèn)ㄥ湪杞歡鍏徃宸ヤ綔錛屽氨鎰忓懗鐫鎮(zhèn)ㄦ垚澶╅兘浼?xì)鍜屾兂閫氳繃閲嶆瀯鏀瑰杽浠g爜璐ㄩ噺鐨勬兂娉曟墦浜ら亾錛屼笉浠呮?zhèn)ㄥ姝ゅQ屾?zhèn)ㄧ殑澶ч儴鍒嗗悓浜嬩篃閮藉姝ゃ傚彲鏄紝絀剁珶浠涔堟椂鍊欒閲嶆瀯錛屼粈涔堟儏鍐典笅搴旇閲嶆瀯鍛紵鎴戠浉淇℃?zhèn)ㄥ拰鎮(zhèn)ㄧ殑鍚屼簨鍙兘鏈夊緢澶氫笉鍚岀殑鐪嬫硶锛屾渶甯歌鐨勭瓟妗堟槸“璇ラ噸鏋勬椂閲嶆瀯”錛?#8220;鍐欎笉涓嬪幓鐨勬椂鍊欓噸鏋?#8221;錛屽拰“涓嬩竴嬈¤凱浠e紑濮嬩箣鍓嶉噸鏋?#8221;錛屾垨鑰呭共鑴嗗氨鏄?#8220;鏈榪戞病鏃墮棿錛屽氨涓嶉噸鏋勪簡(jiǎn)錛屼笅嬈℃湁鏃墮棿鐨勬椂鍊欓噸鏋勫惂”銆傛濡傛?zhèn)ㄥ凡缁忛瑙佸埌鎴戞儗櫙寸殑鈥斺旇繖浜涙兂娉曢兘鏄閲嶆瀯鐨勮瑙c傞噸鏋勪笉鏄竴縐嶆瀯寤鴻蔣浠剁殑宸ュ叿錛屼笉鏄竴縐嶈璁¤蔣浠剁殑妯″紡錛屼篃涓嶆槸涓涓蔣浠跺紑鍙戣繃紼嬩腑鐨勭幆鑺傦紝姝g‘鐞嗚В閲嶆瀯鐨勪漢搴旇鎶婇噸鏋勭湅鎴愪竴縐嶄功鍐欎唬鐮佺殑鏂瑰紡錛屾垨涔?fàn)鎯Q岄噸鏋勬椂鏃跺埢鍒繪湁鍙兘鍙戠敓銆傚湪TDD涓紝闄ゅ幓緙栧啓嫻嬭瘯鐢ㄤ緥鍜屽疄鐜版祴璇曠敤渚嬩箣澶栫殑鎵鏈夊伐浣滈兘鏄噸鏋勶紝鎵浠ワ紝娌℃湁閲嶆瀯浠諱綍璁捐閮戒笉鑳藉疄鐜般傝嚦浜庝粈涔堟椂鍊欓噸鏋勫槢錛岃繕瑕佸垎寮鐪嬶紝鏈変笁鍙ヨ瘽鏄垜鐨勭粡楠岋細(xì)瀹炵幇嫻嬭瘯鐢ㄤ緥鏃墮噸鏋勪唬鐮侊紝瀹屾垚鏌愪釜鐗規(guī)ф椂閲嶆瀯璁捐錛屼駭鍝佺殑閲嶆瀯瀹屾垚鍚庤繕瑕佽寰楅噸鏋勪竴涓嬫祴璇曠敤渚嬪摝銆?/p>

[浠涔堟椂鍊欒璁★紵]
榪欎釜闂姣斿墠闈竴涓闅懼洖絳旂殑澶氾紝瀹炶瘽瀹炶錛屾湰浜哄湪渚濈収TDD寮鍙戣蔣浠剁殑鏃跺欎篃甯稿父琚繖涓棶棰樺洶鎵幫紝鎬繪槸瑙夊緱鏈変簺闂搴旇鍦ㄥ啓嫻嬭瘯鐢ㄤ緥涔嬪墠瀹氫笅鏉ワ紝鑰屾湁浜涢棶棰樺簲璇ュ湪鏂板涓涓竴涓祴璇曠敤渚嬬殑榪囩▼涓嚜鐒跺嚭鐜幫紝姘村埌娓犳垚銆傛墍浠ワ紝鎴戠殑寤鴻鏄紝璁捐鐨勬椂鏈哄簲璇ョ敱寮鍙戣呰嚜宸辨妸鎻★紝涓嶈鍙楀埌TDD鏂瑰紡鐨勯檺鍒訛紝浣嗘槸錛屼笉闇瑕佷簨鍏堢‘瀹氱殑浜嬩竴瀹氫笉鑳戒簨鍏堢‘瀹氾紝鍏嶅緱鎹嗕綇浜?jiǎn)鑷忿q殑鎵嬭剼銆?/p>

[浠涔堟椂鍊欏鍔犳柊鐨凾estCase錛焆
娌′簨鍋氱殑鏃跺欍傞氬父鎴戜滑璁や負(fù)錛屽鏋滀綘瑕佸鍔犱竴涓柊鐨勫姛鑳斤紝閭d箞鍏堝啓涓涓笉鑳介氳繃鐨?TestCase錛涘鏋滀綘鍙戠幇浜?jiǎn)涓涓猙ug錛岄偅涔堝厛鍐欎竴涓笉鑳介氳繃鐨凾estCase錛涘鏋滀綘鐜板湪浠涔堥兘娌℃湁錛屼粠0寮濮嬶紝璇峰厛鍐欎竴涓笉鑳介氳繃鐨?TestCase銆傛墍鏈夌殑宸ヤ綔閮芥槸浠庝竴涓猅estCase寮濮嬨傛澶栵紝榪樿娉ㄦ剰鐨勬槸錛屼竴浜涘ぇ甯堣姹傛垜浠瘡嬈″彧鍏佽鏈変竴涓猅estCase浜孩鐏紝鍦ㄨ繖涓?TestCase娌℃湁Green涔嬪墠涓嶅彲浠ュ啓鍒殑TestCase錛岃繖縐嶈姹傚彲浠ラ傚綋鑰冭檻錛屼絾鍗充嬌鏈夊涓猅estCase浜孩鐏篃涓嶈绱э紝騫舵湭榪濆弽TDD 鐨勪富瑕佺簿紲炪?/p>

[TestCase璇ユ庝箞鍐欙紵]
嫻嬭瘯鐢ㄤ緥鐨勭紪鍐欏疄闄呬笂灝辨槸涓や釜榪囩▼錛氫嬌鐢ㄥ皻涓嶅瓨鍦ㄧ殑浠g爜鍜屽畾涔夎繖浜涗唬鐮佺殑鎵ц緇撴灉銆傛墍浠ヤ竴涓?TestCase涔熷氨搴旇鍖呮嫭涓や釜閮ㄥ垎鈥斺斿満鏅拰鏂█銆傜涓嬈″啓TestCase鐨勪漢浼?xì)鏈夊緢澶х殑涓嶉傚簲鐨勬劅瑙夛紝鍥犱負(fù)浣犱箣鍓嶆墍鍐欑殑鎵鏈変笢瑗塊兘鏄湪瑙e喅闂錛岀幇鍦ㄨ浣犳彁鍑洪棶棰樼‘瀹炰笉澶т範(fàn)鎯紝涓嶈繃涓嶇敤鎷呭績(jī)錛屼綘姝e湪鍋氭紜殑浜嬫儏錛岃岃繖涓笘鐣屼笂鏈闅劇殑浜嬫儏涔熶笉鍦ㄤ簬濡備綍瑙e喅闂錛岃屽湪浜巃sk the right question錛?/p>

[TDD鑳藉府鍔╂垜娑堥櫎Bug鍚楋紵]
絳旓細(xì)涓嶈兘錛佸崈涓囦笉瑕佹妸“嫻嬭瘯”鍜?#8220;闄よ櫕”娣蜂負(fù)涓璋堬紒“闄よ櫕”鏄寚紼嬪簭鍛橀氳繃鑷繁鐨勫姫鍔涙潵鍑忓皯bug鐨勬暟閲忥紙娑堥櫎bug榪欐牱鐨勫瓧鐪兼垜浠繕鏄笉瑕佽涓哄ソ^_^錛夛紝鑰?#8220;嫻嬭瘯”鏄寚紼嬪簭鍛樹功鍐欎駭鍝佷互澶栫殑涓孌典唬鐮佹潵紜繚浜у搧鑳芥湁鏁堝伐浣溿傝櫧鐒禩DD鎵緙栧啓鐨勬祴璇曠敤渚嬪湪涓瀹氱▼搴︿笂涓哄鎵綽ug鎻愪緵浜?jiǎn)渚濇嵁锛屼絾浜嬪疄涓婂Q屾寜鐓DD鐨勬柟寮忚繘琛岀殑杞歡寮鍙戞槸涓嶅彲鑳介氳繃TDD鍐嶆壘鍒癰ug鐨勶紙鎯蟲兂鎴戜滑鍓嶉潰璇寸殑“瀹屽伐鏃跺畬宸?#8221;錛夛紝浣犳兂鍟婏紝褰撴垜浠殑浠g爜瀹屾垚鐨勬椂鍊欙紝鎵鏈夌殑嫻嬭瘯鐢ㄤ緥閮戒寒浜?jiǎn)缁跨伅锛寴q欐椂闅愯棌鍦ㄤ唬鐮佷腑鐨刡ug涓涓兘涓嶄細(xì)闇插嚭椹剼鏉ャ?/p>

浣嗘槸錛屽鏋滆闂?#8220;嫻嬭瘯”鍜?#8220;闄よ櫕”涔嬮棿鏈変粈涔堣仈緋伙紝鎴戠浉淇¤繕鏄湁寰堝璇濆彲浠ヨ鐨勶紝姣斿TDD浜嬪疄涓婂噺灝戜簡(jiǎn)bug鐨勬暟閲忥紝鎶婃煡鎵綽ug鎴樺焦鐨勫叧娉ㄧ偣浠庡叏綰挎垬鍦烘彁鍗囧埌浠g爜鎴樺満浠ヤ笂銆傝繕鏈夛紝bug鐨勬渶鍙曚箣澶勪笉鍦ㄤ簬闅愯棌涔嬫繁錛岃屽湪浜庢弧澶╅亶閲庛傚鏋滀綘鍙戠幇浜?jiǎn)涓涓敤鎴峰緢涓嶅鏄撴墠鑳藉彂鐜扮殑bug錛岄偅涔堜笉涓瀹氬宸ヤ綔鍋氬嚭浜?jiǎn)浠涔堟澃鍑鴻礎(chǔ)鐚紝浣嗘槸濡傛灉浣犲彂鐜頒竴孌典唬鐮佷腑錛宐ug鐨勫瘑搴︽垨紱繪暎紼嬪害榪囬珮錛岄偅涔堟伃鍠滀綘錛屼綘搴旇鎶涘純騫墮噸鍐欒繖孌典唬鐮佷簡(jiǎn)銆俆DD閬垮厤浜?jiǎn)杩櫩U嶆儏鍐碉紝鎵浠ュ皢瀵繪壘bug鐨勫伐浣滈檷浣庡埌浜?jiǎn)涓涓柊鐨勪綆搴︺?/p>

[鎴戣涓轟竴涓狥eature緙栧啓TestCase榪樻槸涓轟竴涓被緙栧啓TestCase錛焆
鍒濆鑰呭父闂殑闂銆傝櫧鐒舵垜浠粠TDD 鐨勮鏄庝功涓婄湅鍒板簲璇ヤ負(fù)涓涓壒鎬х紪鍐欑浉搴旂殑TestCase錛屼絾涓轟粈涔堣憲鍚嶇殑TDD澶у笀鎵鍐欑殑TestCase閮芥槸鍜岀被/鏂規(guī)硶涓涓瀵瑰簲鐨勫憿錛熶負(fù)浜?jiǎn)瑙i噴杩欎釜闂锛屾垜鍜屾垜鐨勫悓浜嬩滑閮藉仛浜?jiǎn)寰堝璇曢獙錛屾渶鍚庢垜浠緱鍒頒簡(jiǎn)涓涓粨璁猴紝铏界劧鎴戜笉鐭ラ亾鏄惁姝g‘錛屼絾鏄鏋滄?zhèn)ㄦ病鏈壗{旀錛屽彲浠ュ涓旂浉淇℃垜浠?/p>

鎴戜滑鐨勭爺絀剁粨鏋滆〃鏄庯紝閫氬父鍦ㄤ竴涓壒鎬х殑寮鍙戝紑濮嬫椂錛屾垜浠拡瀵圭壒鎬х紪鍐欐祴璇曠敤渚嬶紝濡傛灉鎮(zhèn)ㄥ彂鐜拌繖涓壒鎬ф棤娉曠敤TestCase琛ㄨ揪錛岄偅涔堣灝嗚繖涓壒鎬х粏鍒嗭紝鐩磋嚦鎮(zhèn)ㄥ彲浠ヤ負(fù)鎵嬩笂鐨勭壒鎬у啓鍑篢estCase涓烘銆備粠榪欓噷寮濮嬫槸鏈瀹夊叏鐨勶紝瀹冧笉浼?xì)瀵艰嚧鋼Q浣曡璁′笂閲嶅ぇ鐨勫け璇備絾鏄紝闅忕潃鎮(zhèn)ㄤ笉鏂殑閲嶆瀯浠g爜錛屼笉鏂殑閲嶆瀯 TestCase錛屼笉鏂殑渚濇嵁TDD鐨勬濇兂鍋氫笅鍘伙紝鏈鍚庡綋浜у搧浼撮殢嫻嬭瘯鐢ㄤ緥闆嗕竴璧峰彂甯冪殑鏃跺欙紝鎮(zhèn)ㄥ氨浼?xì)涓嵕l忔剰鐨勫彂鐜扮粡榪囬噸鏋勪互鍚庣殑嫻嬭瘯鐢ㄤ緥寰堝彲鑳芥槸鍜屼駭鍝佷腑鐨勭被/鏂規(guī)硶涓涓瀵瑰簲鐨勩?/p>

[浠涔堟椂鍊欏簲璇ュ皢鍏ㄩ儴嫻嬭瘯閮借繍琛屼竴閬嶏紵]
Good Question錛佸ぇ甯堜滑瑕佹眰鎴戜滑姣忔閲嶆瀯涔嬪悗閮借瀹屾暣鐨勮繍琛屼竴閬嶆祴璇曠敤渚嬨傝繖涓姹傚彲浠ョ悊瑙o紝鍥犱負(fù)閲嶆瀯寰堝彲鑳戒細(xì)鏀瑰彉鏁翠釜浠g爜鐨勭粨鏋勬垨璁捐錛屼粠鑰屽鑷翠笉鍙瑙佺殑鍚庢灉錛屼絾鏄鏋滄垜姝e湪寮鍙戠殑鏄竴涓狤RP鎬庝箞鍔烇紵榪愯涓閬嶅畬鏁寸殑嫻嬭瘯鐢ㄤ緥鍙兘灝嗚姳璐規(guī)暟涓皬鏃訛紝鍐典笖鐜板湪寰堝閲嶆瀯閮芥槸鐢卞伐鍏峰仛鍒扮殑錛岃繖涓姹傜殑鍙鎬у拰鍓嶆彁鏉′歡閮芥湁鎵鍔ㄦ憞銆傛墍浠ユ垜璁や負(fù)鍘熷垯涓婁綘鍙互鎸戝嚑涓綘瑙夊緱鍙兘鍙楀埌鏈閲嶆瀯褰卞搷鐨凾estCase鍘籸un錛屼絾鏄鏋滆繍琛屾暣涓祴璇曞寘鍙鑺辮垂鏁扮鐨勬椂闂達(dá)紝閭d箞涓嶄粙鎰忎綘鎸夊ぇ甯堢殑瑕佹眰鍘誨仛銆?/p>

[浠涔堟椂鍊欐敼榪涗竴涓猅estCase錛焆
澧炲姞鐨勬祴璇曠敤渚嬫垨閲嶆瀯浠ュ悗鐨勪唬鐮佸鑷翠簡(jiǎn)鍘熸潵鐨凾estCase鐨勫け鍘諱簡(jiǎn)鏁堟灉錛屽彉寰楁棤鎰忎箟錛岀敋鑷沖彲鑳藉鑷撮敊璇殑緇撴灉錛岃繖鏃舵槸鏀硅繘TestCase鐨勬渶濂芥椂鏈恒備絾鏄湁鏃朵綘浼?xì)鍙戠帋图寴q欐牱鍋氫粎浠呭鑷翠簡(jiǎn)鍘熸潵鐨凾estCase鍦ㄨ璁′笂鏄噧鑲跨殑錛屾垨鑰呮槸鍐椾綑鐨勶紝榪欓兘涓嶈绱э紝鍙瀹冩病鏈夊け鏁堬紝浣犱粛鐒朵笉鐢ㄥ幓鏀硅繘瀹冦傝浣忥紝TestCase涓嶆槸浣犵殑浜у搧錛屽畠涓嶈濂界湅錛屼篃涓嶈鎬庝箞澶瀛︼紝鐢氳嚦娌℃湁鎬ц兘瑕佹眰錛屽畠鍙鑳藉畬鎴愬畠鐨勪嬌鍛藉氨鍙互浜?jiǎn)鈥斺旇繖涔熻瘉鏄庝簡(jiǎn)鎴戜滑鍚庨潰鎵璇寸殑“鐢–trl-C/Ctrl-V緙栧啓嫻嬭瘯鐢ㄤ緥”鐨勫彲琛屾с?/p>

浣嗘槸錛岀編鍥戒漢鐨勬兂娉曞叾瀹炶窡鎴戜滑榪樻槸涓嶅お涓鏍鳳紝鎷挎墭灝煎反璧炵殑MindMap鏉ヨ鍚э紝鍏跺疄鐢籑indMap鍙槸涓轟簡(jiǎn)琛ㄧ幇鑷繁鐨勬濊礬錛屾垨璁板繂鏌愪簺閲嶈鐨勪簨鎯咃紝浣嗘墭灝煎嵈寤鴻澶у鎶奙indMap鐢繪垚涓浠惰壓鏈搧錛岀敋鑷寵繕鏈夊緢澶氳壓鏈鎶婅嚜宸辯敾鐨勬娊璞℃淳MindMap鎷垮嚭鏉ュ府鍔╂墭灝煎仛瀹d紶銆傚悓鏍鳳紝澶у笀浠篃瑕佹眰鎴戜滑鎶奣estCase鍐欑殑璺熶唬鐮佷竴鏍瘋川閲忕簿鑹紝鍙垜鎯寵鐨勬槸錛岀幇鍦ㄥ浗鍐呮湁鍑犱釜鍏徃鑳芥妸浜у搧鐨勪唬鐮佸啓鐨勭簿鑹紵錛熻繕鏄竴姝ヤ竴姝ユ參鎱㈡潵鍚с?/p>

[涓轟粈涔堝師鏉ラ氳繃鐨勬祴璇曠敤渚嬬幇鍦ㄤ笉鑳介氳繃浜?jiǎn)锛焆
榪欐槸涓涓鎶ワ紝Red Alert錛佸畠鍙兘琛ㄨ揪浜?jiǎn)涓ゅ眰鎰忔濃斺旈兘涓嶆槸浠涔堝ソ鎰忔濃斺?錛変綘鍒氬垰榪涜鐨勯噸鏋勫彲鑳藉け璐ヤ簡(jiǎn)錛屾垨瀛樺湪涓浜涢敊璇湭琚彂鐜幫紝鑷沖皯閲嶆瀯鐨勭粨鏋滃拰鍘熸潵鐨勪唬鐮佷笉絳変環(huán)浜?jiǎn)銆?錛変綘鍒氬垰澧炲姞鐨凾estCase鎵琛ㄨ揪鐨勬剰鎬濊窡鍓嶉潰宸茬粡鏈夌殑TestCase鐩稿啿紿侊紝涔熷氨鏄錛屾柊澧炵殑鍔熻兘榪濊儗浜?jiǎn)宸叉湁鐨勮璁″Q岃繖縐嶆儏鍐靛ぇ閮ㄥ垎鍙兘鏄箣鍓嶇殑璁捐閿欎簡(jiǎn)銆備絾鏃犺鍝敊浜?jiǎn)锛屾棤璁烘槸閭e眰鎰忔濓紝鎯蟲壘鍒拌繖涓棶棰樼殑鏍規(guī)簮閮芥瘮TDD鐨勬甯稿伐浣滆闅俱?/p>

[鎴戞庝箞鐭ラ亾閭i噷璇ユ湁涓涓柟娉曡繕鏄鏈変竴涓被錛焆
榪欎釜闂涔熸槸甯稿父鍑虹幇鍦ㄦ垜鐨勮剳嫻蜂腑錛屾棤璁轟綘鏄涓嬈℃帴瑙DD鎴栬呭凡緇忔垚涓?TDD涓撳錛岃繖涓棶棰橀兘浼?xì)缂牼l曠潃浣犱笉鏀俱備笉榪囬棶棰樼殑絳旀鍙互鍙傝冨墠闈㈢殑“浠涔堟椂鍊欒璁?#8221;涓鑺傦紝絳旀涓嶆槸鍞竴鐨勩傚叾瀹炲鏁版椂鍊欎綘涓嶅繀鑰冭檻鏈潵錛屼粖澶╁彧鍋氫粖澶╃殑浜嬶紝鍙鏈夐噸鏋勫伐鍏鳳紝浠庢柟娉曞埌綾誨拰浠庣被鍒版柟娉曢兘寰堝鏄撱?/p>

[鎴戣鍐欎竴涓猅estCase錛屽彲鏄笉鐭ラ亾浠庡摢閲屽紑濮嬶紵]
浠庢渶閲嶈鐨勪簨寮濮嬶紝what matters most錛熶粠鑴氫笅寮濮嬶紝浠庢墜澶翠笂鐨勫伐浣滃紑濮嬶紝浠庣溂鍓嶇殑浜嬪紑濮嬨備粠涓涓病鏈塙I鐨勬牳蹇?jī)鐗规у紑濮嬶紝浠庣畻娉曞紑濮嬶紝鎴栬呬粠鏈鏈夊彲鑳借借鏃墮棿鐨勬ā鍧楀紑濮嬶紝浠庝竴涓渶涓ラ噸鐨刡ug寮濮嬨傝繖鏄疶DD涓諱箟鑰呭拰榧犵洰瀵稿厜鑰呯殑涓涓叡鍚岀偣錛屼笉鍚岀偣鏄墠鑰呮棭宸叉垚绔瑰湪鑳搞?/p>

[涓轟粈涔堟垜鐨勬祴璇曟繪槸鐪嬭搗鏉ユ湁鐐規(guī)剼锠紵]
鍝︼紵鏄悧錛熸潵錛屾彙涓墜錛屾垜鐨勪篃鏄紒涓嶅繀鎷呭績(jī)榪欎竴鐐癸紝浜嬪疄涓婏紝澶у笀浠粰鐨勪緥瀛愪篃鐩稿綋鎰氳牏錛屾瘮濡備竴涓瀬绔殑渚嬪瓙鏄鍐欎竴涓袱涓猧nt鍙橀噺鐩稿姞鐨勬柟娉曪紝澶у笀鍏堟柇璦2+3=5錛屽啀鏂█5+5=10錛岄毦閬撹繖浜涗唬鐮佷笉鏄緢鎰氳牏鍚楋紵鍏跺疄榪欏彧鏄竴涓瀬绔殑渚嬪瓙錛屽綋浣犲垵嬈℃帴瑙DD鏃訛紝鍐欒繖鏍風(fēng)殑浠g爜娌′粈涔堜笉濂斤紝浠ュ悗褰撲綘鐔熺粌鏃跺氨浼?xì)鍙戠幇杩欐牱鍐欐病蹇呰浜?jiǎn)錛岃璁頒綇錛岃唉铏氭槸閫氬線TDD鐨勫繀緇忎箣璺紒浠庣粡鍏稿紑鍙戞柟娉曡漿鍚慣DD灝卞儚浠庨潰鍚戣繃紼嬭漿鍚戦潰鍚戝璞′竴鏍峰洶闅撅紝浣犲彲鑳戒粈涔堥兘鎳傦紝浣嗕綘鍐欏嚭鏉ョ殑綾繪病鏈変竴涓函OO鐨勶紒鎴戠殑鍚屼簨榪樺憡璇夋垜鐪熸鐨勫お鏋佹嫵錛屽叾閫熷害鏄緢蹇殑錛屼笉姣斾換浣曚竴涓揩鎷寵鎱紝浣嗘槸鍒濆鑰咃紙閫氬父鏄寚瀛︿範(fàn)澶瀬鎷崇殑鍓?0騫達(dá)級(jí)澶笉瀹規(guī)槗鎶婃瘡涓Э鍔塊兘鍋氬錛屾墍浠ュ彧鑳芥參鎱㈡潵銆?/p>

[浠涔堝満鍚堜笉閫傜敤TDD錛焆
闂殑濂斤紝紜疄鏈夊緢澶氬満鍚堜笉閫傚悎浣跨敤TDD銆傛瘮濡傚杞歡璐ㄩ噺瑕佹眰鏋侀珮鐨勫啗浜嬫垨縐戠爺浜у搧鈥斺旂宸炲叚鍙鳳紝浜哄懡鍏沖ぉ鐨勮蔣浠垛斺斿尰鐤楄澶囷紝絳夌瓑錛屽啀姣斿璁捐寰堥噸瑕佸繀欏繪彁鍓嶅仛濂界殑杞歡錛岃繖浜涢兘涓嶉傚悎TDD錛屼絾鏄笉閫傚悎TDD涓嶄唬琛ㄤ笉鑳藉啓TestCase錛屽彧鏄綔鐢ㄤ笉鍚岋紝鍦頒綅涓嶅悓緗簡(jiǎn)銆?/p>

{Best Practise}

[寰瑧闈㈠緙栬瘧閿欒]
瀛︾敓鏃朵唬鏈瀹蟲曠殑灝辨槸緙栬瘧閿欒錛岀紪璇戦敊璇彲鑳戒細(xì)琚佸笀瑙嗕負(fù)涓婅涓嶈鐪熷惉璇劇殑璇佹嵁錛屾垨鑰呭悓瀛﹂棿鐩鎬簰鍢茬瑧鐨勭牆鐮併傜敋鑷崇寮瀛︽牎寰堝騫寸殑鑰佺▼搴忓憳渚濈劧瀹蟲曞畠?yōu)鍍忓x曡繜鍒頒竴鏍鳳紝娼滄剰璇嗛噷浼間箮緙栬瘧閿欒鏋佹湁鍙兘鍜屽伐璧勬寕閽╋紙鎴栬呭拰鏅哄晢鎸傞挬錛屽弽姝i兘涓嶆槸浠涔堝ソ浜嬶級(jí)銆傚叾瀹烇紝鍙鎻愪氦鍒扮増鏈鐞嗙殑浠g爜娌℃湁緙栬瘧閿欒灝卞彲浠ヤ簡(jiǎn)錛屼笉瑕佹媴蹇?jī)鑷繁鎵嬩笂鐨勪唬鐮佺殑缂栬瘧閿欒锛岄氬父錛岀紪璇戦敊璇兘闆嗕腑鍦ㄤ笅闈笁涓柟闈細(xì)
錛?錛変綘鐨勪唬鐮佸瓨鍦ㄤ綆綰ч敊璇?br>錛?錛夌敱浜庢煇浜汭nterface鐨勫疄鐜板皻涓嶅瓨鍦紝鎵浠ヨ嫻嬭瘯浠g爜鏃犳硶緙栬瘧
錛?錛夌敱浜庢煇浜涗唬鐮佸皻涓嶅瓨鍦紝鎵浠ユ祴璇曚唬鐮佹棤娉曠紪璇?br>璇鋒敞鎰忕浜岀偣涓庣涓夌偣瀹屽叏涓嶅悓錛屽墠鑰呰〃鏄庤璁″凡瀛樺湪錛岃屽疄鐜頒笉瀛樺湪瀵艱嚧鐨勭紪璇戦敊璇紱鍚庤呭垯鎸囦粎鏈塗estCase鑰屽叾瀹冧粈涔堥兘娌℃湁鐨勬儏鍐碉紝璁捐鍜屽疄鐜伴兘涓嶅瓨鍦紝娌℃湁Interface涔熸病鏈塈mplementation銆?/p>

鍙﹀錛岀紪璇戝櫒榪樻湁涓涓紭鐐癸紝閭e氨鏄互鏈鏁忔嵎鐨勮韓鎵嬪憡璇変綘錛屼綘鐨勪唬鐮佷腑鏈夐偅浜涢敊璇傚綋鐒跺鏋滀綘鎷ユ湁Eclipse榪欐牱鍙互鍙?qiáng)鏃舵彁绀壕~栬瘧閿欒鐨処DE錛屽氨涓嶉渶瑕佽繖鏍風(fēng)殑鍔熻兘浜?jiǎn)銆?/p>

[閲嶈浣犵殑璁″垝娓呭崟]
鍦ㄩ潪TDD鐨勬儏鍐典笅錛屽挨鍏舵槸浼犵粺鐨勭戝竷妯″瀷鐨勬儏鍐典笅錛岀▼搴忓憳涓嶄細(xì)涓嶇煡閬撹鍋氫粈涔堬紝浜嬪疄涓婏紝鎬繪槸鏈夎璁℃垨鑰呭埆鐨勪粈涔堝埗鍝佸湪寮曞紼嬪簭鍛樺紑鍙戙備絾鏄湪TDD鐨勬儏鍐典笅錛岃繖縐嶄紭鍔挎病鏈変簡(jiǎn)錛屾墍浠ヤ竴涓鍒掓竻鍗曞浣犳潵璇村崄鍒嗛噸瑕侊紝鍥犱負(fù)浣犲繀欏昏嚜宸卞彂鐜拌鍋氫粈涔堛備笉鍚屾ф牸鐨勪漢瀵逛簬榪欎竴鐐逛細(xì)鏈変笉鍚岀殑鍙嶅簲錛屾垜鐩鎬俊騫蟲椂鍋氫簨娌′粈涔堣鍒掕渚濋潬鍒漢瀹夋帓鐨勪漢錛堟墍璋撳皢鎵嶏級(jí)鍙兘鐣ユ湁涓嶉傚簲錛屼笉榪囦笉瑕佺揣錛孴asks鍜孋alendar錛堝張縐版晥鐜囨墜鍐岋級(jí)鏃╁凡鎴愪負(fù)鐜頒唬涓婄彮鏃忕殑蹇呭宸ュ叿浜?jiǎn)锛涜屽鉤鏃跺伐浣滅敓媧誨氨寰堟湁璁″垝鎬х殑浜猴紝姣斿鎴?)錛屽氨浼?xì)鏇村枩娆q欑鑷繁鍙互鎺屾帶Plan鐨勬柟寮忎簡(jiǎn)銆?/p>

[搴熼粶姣忔棩浠g爜璐ㄩ噺媯(gè)鏌
濡傛灉鎴戞病鏈夎閿欑殑璇濓紝PSP瀵逛簬涓漢浠g爜媯(gè)鏌ョ殑瑕佹眰鏄洰涓ユ牸鐨勶紝鑰屽悓鏍鋒槸鍦ㄩ拡瀵逛釜浜虹殑闂涓婏紝 TDD鍗村緩璁綘搴熼粶姣忔棩浠g爜璐ㄩ噺媯(gè)鏌ワ紝鍒搗鐤戝績(jī)錛屽洜涓轟綘鎬繪槸鍦ㄥ仛TestCase瑕佹眰浣犲仛鐨勪簨鎯咃紝騫朵笖鎬繪槸鏈夊姙娉曪紙鑷姩鐨勶級(jí)媯(gè)鏌ヤ唬鐮佹湁娌℃湁鍋氬埌榪欎簺浜嬫儏 鈥斺旂孩鐏仠緇跨伅琛岋紝鎵浠ユ瘡鏃ヤ唬鐮佹鏌ョ殑鏃墮棿鍙兘琚妭鐪侊紝瀵逛簬涓涓弗鏍肩殑PSP瀹炶返鑰呮潵璇達(dá)紝榪欎釜鎴愭湰榪樻槸寰堝彲瑙傜殑錛?/p>

姝ゅ錛屽浜庢瘡鏃ヤ唬鐮佽川閲忔鏌ョ殑鍙︿竴涓ソ澶勶紝灝辨槸甯姪浣犺璇嗚嚜宸辯殑浠g爜錛屽叏闈㈢殑浠庡畯瑙傘佸井瑙傘佸悇涓搴﹀瑙嗚嚜宸辯殑鎴愭灉錛岀幇鍦紝褰撲綘渚濈収TDD鍋氫簨鏃訛紝榪欎釜浼樼偣涔熶笉闇瑕佷簡(jiǎn)錛岃繕璁板緱鍓嶉潰璇寸殑TDD鐨勭浜屼釜浼樼偣鍚楋紝鍥犱負(fù)浣犲凡緇忓叏闈㈢殑浣跨敤浜?jiǎn)涓閬嶄綘鐨勪唬鐮侊紝榪欏畬鍏ㄥ彲浠ヨ揪鍒扮洰鐨勩?/p>

浣嗘槸錛岄棶棰樺線寰涔熷茍涓嶉偅涔堢畝鍗曪紝鐜板湪鏈夋病鏈変漢鑳藉憡璇夋垜錛屾垜濡備綍鍏ㄩ潰瀹¤鎴戞墍鍐欑殑嫻嬭瘯鐢ㄤ緥鍛紵鍒繕浜?jiǎn)锛屽畠浠篃鏄互浠g爜鐨勫舰寮忓瓨鍦ㄧ殑鍝︺傚懙鍛碉紝浣嗘効榪欎釜闂娌℃湁鎶婁綘鍚撳埌錛屽洜涓烘垜鐩鎬俊鍒扮洰鍓嶄負(fù)姝紝瀹冭繕涓嶆槸鐡墮闂錛屽喌涓斿湪緙栧啓浜у搧浠g爜鐨勬椂鍊欎綘榪樻槸浼?xì)鑷溉潥勫彂鐜板緢澶殝箣璇曚唬鐮佷笂鐨勬病鑰冭檻鍒扮殑鍦版柟錛屽彲浠ュ氨姝や慨鏀逛竴涓嬨傞亾鐞嗗氨鏄姝わ紝涓栫晫涓婃病鏈変換浣曟柟娉曡兘浠f浛浣犳濊冪殑榪囩▼錛屾墍浠ヤ篃娌℃湁浠諱綍鏂規(guī)硶鑳介樆姝綘鐘敊璇紝TDD浠呰兘璁╀綘鏇村鏄撳彂鐜拌繖浜涢敊璇屽凡銆?/p>

[濡傛灉鏃犳硶瀹屾垚涓涓ぇ鐨勬祴璇曪紝灝變粠鏈灝忕殑寮濮媇
濡傛灉鎴戞棤娉曞紑濮嬫庝箞鍔烇紝鏁欑涔︿笂鏈変釜寰堝ソ鐨勪緥瀛愶細(xì)鎴戣鍐欎竴涓數(shù)褰卞垪琛ㄧ殑綾伙紝鎴戜笉鐭ラ亾濡備綍涓嬫墜錛屽浣曞啓嫻嬭瘯鐢ㄤ緥錛屼笉瑕佺揣錛岄鍏堟兂璞¢潤(rùn)鎬佺殑緇撴灉錛屽鏋滄垜鐨勭數(shù)褰卞垪琛ㄥ垰鍒氬緩绔嬪憿錛岄偅涔堝畠搴旇鏄┖鐨勶紝OK錛屽氨鍐欒繖涓柇璦鍚э紝鏂█涓涓垰鍒氬垵濮嬪寲鐨勭數(shù)褰卞垪琛ㄦ槸絀虹殑銆傝繖涓嶆槸鎰氳牏錛岃繖鏄粏鑺傦紝濂ヨ繍浼?xì)浜敊骞鍏ㄨ兘鐨勯噾鐗屽緱涓荤帥涓借?#183;閲戞槸榪欐牱璇寸殑錛?#8220;鎴愬姛浜哄+鐨勫叡鍚岀偣鍦ㄤ簬……濡傛灉鐩爣涓嶅娓呮櫚錛屼粬浠細(xì)棣栧厛鍋氶氬線鎴愬姛閬撹礬涓婄殑姣忎竴涓粏灝忔楠?#8230;…”銆?/p>

[灝濊瘯緙栧啓鑷繁鐨剎Unit]
Kent Beck寤鴻澶у姣忓綋鎺ヨЕ涓涓柊鐨勮璦鎴栧紑鍙戝鉤鍙扮殑鏃跺欙紝灝辮嚜宸卞啓榪欎釜璇█鎴栧鉤鍙扮殑xUnit錛屽叾瀹炲嚑涔庢墍鏈夊父鐢ㄧ殑璇█鍜屽鉤鍙伴兘宸茬粡鏈変簡(jiǎn)鑷繁鐨?xUnit錛岃屼笖閮芥槸澶у悓灝忓紓錛屼絾鏄負(fù)浠涔堝ぇ甯堢粰鍑轟簡(jiǎn)榪欐牱鐨勫緩璁憿銆傚叾瀹濳ent Beck鐨勬剰鎬濇槸璇撮氳繃榪欐牱鐨勬柟寮忎綘鍙互寰堝揩鐨勪簡(jiǎn)瑙h繖涓璦鎴栧鉤鍙扮殑鐗規(guī)э紝鑰屼笖xUnit紜疄寰堢畝鍗曪紝鍙鐭ラ亾鍘熺悊寰堝揩灝辮兘鍐欏嚭鏉ャ傝繖瀵逛簬閭d簺鍠滄鑷繁鍐欏簳灞備唬鐮佺殑浜猴紝鎴栬呭枩嬈㈡帶鍒跺姏鐨勪漢鑰岃█鏄釜濂芥秷鎭?/p>

[鍠勪簬浣跨敤Ctrl-C/Ctrl-V鏉ョ紪鍐橳estCase]
涓嶅繀鎷呭績(jī)TestCase浼?xì)鏈変唬鐮佸啑浣欑殑闂锛岃瀹冨啑浣欏ソ浜?jiǎn)銆?/p>

[姘歌繙閮芥槸鍔熻兘First錛屾敼榪涘彲浠ョ◢鍚庤繘琛宂
涓婇潰榪欎釜鏍囬榪樺彲浠ユ敼鎴愬彟澶栦竴鍙ヨ瘽錛氶伩鍏嶈繃娓¤璁★紒

[娣樻卑闄堟棫鐨勭敤渚媇
鑸嶄笉寰楀瀛愬涓嶇潃鐙箋備笉瑕佸彲鎯滈檲鏃х殑鐢ㄤ緥錛屽洜涓哄畠浠彲鑳戒粠姒傚康涓婂凡緇忔槸閿欒鐨勪簡(jiǎn)錛屾垨浠呬粎浼?xì)寰楀嚭閿欒鐨劸l撴灉錛屾垨鑰呭湪鏌愭閲嶆瀯涔嬪悗澶卞幓浜?jiǎn)鎰忎箟銆傚綋鐒朵篃涓嶄竴瀹氶潪瑕佸垹闄ゅ畠浠紝浠嶵estSuite涓櫎鍘伙紙JUnit錛夋垨鍔犱笂Ignored錛圢Unit錛夋爣絳句篃鏄竴涓ソ鍔炴硶銆?/p>

[鐢═estCase鍋氳瘯楠宂
濡傛灉浣犲湪寮濮嬫煇涓壒鎬ф垨浜у搧鐨勫紑鍙戜箣鍓嶅鏌愪釜棰嗗煙涓嶅お鐔熸?zhèn)夋垨涓鏃犳墍鐭ワ紝鎴栬呭鑷繁鍦ㄨ棰嗗煙閲岀殑鑳藉姏涓鏃犳墍鐭ワ紝閭d箞浣犱竴瀹氫細(xì)閫夋嫨鍋氳瘯楠岋紝鍦ㄦ湁鍗曞厓嫻嬭瘯浣滃伐鍏風(fēng)殑鎯呭喌涓嬶紝寤鴻浣犵敤TestCase鍋氳瘯楠岋紝榪欑湅璧鋒潵灝卞儚浣犲湪鍐欎竴涓獙璇佸姛鑳芥槸鍚﹀疄鐜扮殑 TestCase涓鏍鳳紝鑰屼簨瀹炰笂涔熶竴鏍鳳紝鍙笉榪囦綘鎵楠岃瘉鐨勪笉鏄唬鐮佹湰韜紝鑰屾槸榪欎簺浠g爜鎵渚濊禆鐨勭幆澧冦?/p>

[TestCase涔嬮棿搴旇灝介噺鐙珛]
淇濊瘉鍗曠嫭榪愯涓涓猅estCase鏄湁鎰忎箟鐨勩?/p>

[涓嶄粎嫻嬭瘯蹇呴』瑕侀氳繃鐨勪唬鐮侊紝榪樿嫻嬭瘯蹇呴』涓嶈兘閫氳繃鐨勪唬鐮乚
榪欐槸涓涓皬鎶宸э紝涔熸槸涓嶅悓浜庤璁℃濊礬鐨勪笢瑗褲傚儚瓚婄晫鐨勫兼垨鑰呬貢鐮侊紝鎴栬呯被鍨嬩笉絎︾殑鍙橀噺錛岃繖浜涜緭鍏ラ兘鍙兘浼?xì)瀵艰嚧鏌愪釜寮傚父鐨勬姏鍑哄Q屾垨鑰呭鑷翠竴涓爣紺?#8220;illegal parameters”鐨勮繑鍥炲鹼紝榪欎袱縐嶆儏鍐典綘閮藉簲璇ユ祴璇曘傚綋鐒舵垜浠棤娉曟灇涓炬墍鏈夐敊璇殑杈撳叆鎴栧閮ㄧ幆澧冿紝榪欏氨鍍忔垜浠棤娉曟灇涓炬墍鏈夋紜殑杈撳叆鍜屽閮ㄧ幆澧冧竴鏍鳳紝鍙TestCase鑳借鏄庨棶棰樺氨鍙互浜?jiǎn)銆?/p>

[緙栧啓浠g爜鐨勭涓姝ワ紝鏄湪TestCase涓敤Ctrl-C]
榪欐槸涓涓珮綰ф妧宸э紝鍛冿紝鏄殑錛屾垜鏄繖涓剰鎬濓紝鎴戜笉鏄榪欎釜鎶宸ч毦浠ユ帉鎻★紝鑰屾槸璇磋繖涓妧宸у綋涓斾粎褰撲綘宸茬粡鏄竴涓猅DD楂樻墜鏃訛紝浣犳墠鑳戒綋浼?xì)鍒板畠鐨剻靺鍔涖傚嬈′嬌鐢═DD鐨勪漢閮芥湁榪欐牱鐨勪綋浼?xì)锛屾棦鐒舵垜鐨凾estCase宸茬粡鍐欑殑寰堝ソ浜?jiǎn)锛屽緢鑳借鏄庨棶棰樺Q屼負(fù)浠涔堟垜鐨勪唬鐮佷笉鑳戒粠TestCase鎷瘋礉涓浜涗笢瑗挎潵鍛€傚綋鐒?dòng)灱寴q欒姹備綘鐨凾estCase宸茬粡鍏鋒湁寰堝ソ鐨勮〃杈捐兘鍔涳紝姣斿鏂█f (5)=125鐨勬柟寮忔樉鐒舵病鏈夋柇璦f(5)=5^(5-2)琛ㄨ揪鏇村鐨勫唴瀹廣?/p>

[嫻嬭瘯鐢ㄤ緥鍖呭簲璇ュ敖閲忚璁℃垚鍙互鑷姩榪愯鐨刔
濡傛灉浜у搧鏄渶瑕佷氦浠樻簮浠g爜鐨勶紝閭f垜浠簲璇ュ厑璁哥敤鎴峰浠g爜榪涜淇敼鎴栨墿鍏呭悗鍦ㄨ嚜宸辯殑鐜涓媟un鏁翠釜嫻嬭瘯鐢ㄤ緥鍖呫傛棦鐒墮氬父鎯呭喌涓嬬殑浜у搧鏄彲浠ヨ嚜鍔ㄨ繍琛岀殑錛岄偅涓轟粈涔堝悓鏍蜂綔涓轟氦浠樼敤鎴風(fēng)殑鍒跺搧錛屾祴璇曠敤渚嬪寘灝變笉鏄嚜鍔ㄨ繍琛岀殑鍛紵鍗充嬌浜у搧涓嶉渶瑕佷氦浠樻簮浠g爜錛屾祴璇曠敤渚嬪寘涔熷簲璇ヨ璁℃垚鍙互鑷姩榪愯鐨勶紝榪欎負(fù)嫻嬭瘯閮ㄩ棬鎴栦笅涓鐗堟湰鐨勫紑鍙戜漢鍛樻彁渚涗簡(jiǎn)鏋佸ぇ鐨勪究鍒┿?/p>

[鍙寒涓鐩忕孩鐏痌
澶у笀鐨勫緩璁紝鍓嶉潰宸茬粡鎻愬埌浜?jiǎn)锛屼粎浠呮槸寰忚銆?/p>

[鐢═estCase鎻忚堪浣犲彂鐜扮殑bug]
濡傛灉浣犲湪鍙︿竴涓儴闂ㄧ殑鍚屼簨浣跨敤浜?jiǎn)浣犵殑浠g爜锛岒q朵笖錛屼粬鍙戠幇浜?jiǎn)涓涓猙ug錛屼綘鐚滀粬浼?xì)鎬庝箞鍋氾紵浠栦細(xì)绔嬪嵆璧板埌浣犵殑宸ヤ綅杈逛笂錛屽ぇ澹版枼璐h錛?#8220;浣犳湁bug錛?#8221;鍚楋紵濡傛灉浠栬儐鏁㈣繖鏍峰浣狅紝瀵逛笉璧鳳紝浣犱竴瀹氳鍐烽潤(rùn)涓嬫潵錛屼笉瑕佸綋闈㈠洖楠備粬錛岀浉鍙嶄綘鍙互寰井涓絎戯紝鐒跺悗蹇?jī)邈^姘斿拰鐨勫浠栬錛?#8220;鍝︼紝鏄悧錛熼偅涔堝ソ鍚э紝緇欐垜涓涓猅estCase璇佹槑涓涓嬨?#8221;鐜板湪灞鍔垮凡緇忓掑悜浣犺繖涓杈逛簡(jiǎn)錛屽鏋滀粬榪樻病鏈夊噯澶囧ソ鍥炵瓟浣犺繖鑷村懡鐨勪竴鍑伙紝鎴戠寽浠栦細(xì)鎰熷埌闈炲父緹炴劎錛屽茍鍦ㄥ唴蹇?jī)璐f嚜宸卞お鑾芥挒銆備簨瀹炰笂錛屽鏋滀粬鐨凾estCase娌℃湁榪囧鐨勮姹備綘鐨勪唬鐮侊紙鑰屾槸鎸変綘浠簨鍓嶇殑濂戠害錛夛紝騫朵笖浜簡(jiǎn)綰㈢伅錛岄偅涔堝氨鍙互紜畾鏄綘鐨刡ug錛屽弽涔嬶紝瀵規(guī)柟鍒欐棤鐞嗕簡(jiǎn)銆傜敤TestCase鎻忚堪bug鐨勫彟涓涓ソ澶勬槸錛屼笉浼?xì)鍥犱皋Z互鍚庣殑淇敼鑰屽啀嬈℃毚闇茶繖涓猙ug錛屽畠宸茬粡鎴愪負(fù)浣犲彂甯冩瘡涓涓増鏈箣鍓嶆墍蹇呴』媯(gè)鏌ョ殑鍐呭浜?jiǎn)銆?/p>

{鍏充簬鍗曞厓嫻嬭瘯}

鍗曞厓嫻嬭瘯鐨勭洰鏍囨槸

Keep the bar green to keep the code clean

榪欏彞璇濈殑鍚箟鏄紝浜嬪疄涓婃垜浠彧鍋氫袱浠朵簨鎯咃細(xì)璁╀唬鐮佸鏁堬紙Keep the bar green錛夊拰璁╀唬鐮佹磥鍑錛圞eep the code clean錛夛紝鍓嶈呮槸鎶婁簨鎯呭仛瀵癸紝鍚庤呮槸鎶婁簨鎯呭仛濂斤紝涓よ呮棦鏄疶DD涓殑涓ら《甯藉瓙錛屽張鏄痻Unit鏋舵瀯涓殑鍥犳灉鍏崇郴銆?/p>

鍗曞厓嫻嬭瘯浣滀負(fù)杞歡嫻嬭瘯鐨勪竴涓被鍒紝騫墮潪鏄痻Unit鏋舵瀯鍒涢犵殑錛岃屾槸寰堟棭灝辨湁浜?jiǎn)銆備絾鏄痻Unit鏋舵瀯浣垮緱鍗曞厓嫻嬭瘯鍙樺緱鐩存帴銆佺畝鍗曘侀珮鏁堝拰瑙勮寖錛岃繖涔熸槸鍗曞厓嫻嬭瘯鏈榪戝嚑騫撮閫熷彂灞曟垚涓鴻 閲忎竴涓紑鍙戝伐鍏峰拰鐜鐨勪富瑕佹寚鏍囦箣涓鐨勫師鍥犮傛濡侻artin Fowler鎵璇達(dá)細(xì)“杞歡宸ョ▼鏈夊彶浠ユ潵浠庢病鏈夊姝や紬澶氱殑浜哄ぇ澶ф敹鐩婁簬濡傛綆鍗曠殑浠g爜錛?#8221;鑰屼笖澶氭暟璇█鍜屽鉤鍙扮殑xUnit鏋舵瀯閮芥槸澶у悓灝忓紓錛屾湁鐨勪粎鏄璦涓嶅悓錛屽叾涓渶鏈変唬琛ㄦх殑鏄疛Unit鍜孨Unit錛屽悗鑰呮槸鍓嶈呯殑鍒涙柊鍜屾墿灞曘備竴涓崟鍏冩祴璇曟鏋秞Unit搴旇錛?錛変嬌姣忎釜TestCase鐙珛榪愯錛?錛変嬌姣忎釜TestCase鍙互鐙珛媯(gè)嫻嬪拰鎶ュ憡閿欒錛?錛夋槗浜庡湪姣忔榪愯涔嬪墠閫夋嫨TestCase銆備笅闈㈡槸鎴戞灇涓懼嚭鐨剎Unit妗嗘灦鐨勬蹇碉紝榪欎簺姒傚康鏋勬垚浜?jiǎn)褰撳墠涓氱晫鍗曞厓娴嬭瘯鐞嗚鍜屽伐鍏风殑鏍稿績(jī)锛?xì)

[嫻嬭瘯鏂規(guī)硶/TestMethod]
嫻嬭瘯鐨勬渶灝忓崟浣嶏紝鐩存帴琛ㄧず涓轟唬鐮併?/p>

[嫻嬭瘯鐢ㄤ緥/TestCase]
鐢卞涓祴璇曟柟娉曠粍鎴愶紝鏄竴涓畬鏁寸殑瀵硅薄錛屾槸寰堝TestRunner鎵ц鐨勬渶灝忓崟浣嶃?/p>

[嫻嬭瘯瀹瑰櫒/TestSuite]
鐢卞涓祴璇曠敤渚嬫瀯鎴愶紝鎰忓湪鎶婄浉鍚屽惈涔夌殑嫻嬭瘯鐢ㄤ緥鎵嬪姩瀹夋帓鍦ㄤ竴璧鳳紝TestSuite鍙互鍛堟爲(wèi)鐘剁粨鏋勫洜鑰屼究浜庣鐞嗐傚湪瀹炵幇鏃訛紝TestSuite褰㈠紡涓婂線寰涔熸槸涓涓猅estCase鎴朤estFixture銆?/p>

[鏂█/Assertion]
鏂█涓鑸湁涓夌被錛屽垎鍒槸姣旇緝鏂█錛堝assertEquals錛夛紝鏉′歡鏂█錛堝isTrue錛夛紝鍜屾柇璦宸ュ叿錛堝fail錛夈?/p>

[嫻嬭瘯璁懼/TestFixture]
涓烘瘡涓祴璇曠敤渚嬪畨鎺掍竴涓猄etUp鏂規(guī)硶鍜屼竴涓猅earDown鏂規(guī)硶錛屽墠鑰呯敤浜庡湪鎵ц璇ユ祴璇曠敤渚嬫垨璇ョ敤渚嬩腑鐨勬瘡涓祴璇曟柟娉曞墠璋冪敤浠ュ垵濮嬪寲鏌愪簺鍐呭錛屽悗鑰呭湪鎵ц璇ユ祴璇曠敤渚嬫垨璇ョ敤渚嬩腑鐨勬瘡涓柟娉曚箣鍚庤皟鐢紝閫氬父鐢ㄦ潵娑堥櫎嫻嬭瘯瀵圭郴緇熸墍鍋氱殑淇敼銆?/p>

[鏈熸湜寮傚父/Expected Exception]
鏈熸湜璇ユ祴璇曟柟娉曟姏鍑烘煇縐嶆寚瀹氱殑寮傚父錛屼綔涓轟竴涓?#8220;鏂█”鍐呭錛屽悓鏃朵篃闃叉鍥犱負(fù)鍚堟儏鍚堢悊鐨勫紓甯歌屾剰澶栫殑緇堟浜?jiǎn)娴嬭瘯杩嚱E嬨?/p>

[縐嶇被/Category]
涓烘祴璇曠敤渚嬪垎綾伙紝瀹為檯浣跨敤鏃朵竴鑸湁TestSuite灝變笉鍐嶄嬌鐢–ategory錛屾湁Category灝變笉鍐嶄嬌鐢═estSuite銆?/p>

[蹇界暐/Ignored]
璁懼畾璇ユ祴璇曠敤渚嬫垨嫻嬭瘯鏂規(guī)硶琚拷鐣ワ紝涔熷氨鏄笉鎵ц鐨勬剰鎬濄傛湁浜涜鎶涘純鐨凾estCase涓嶆効鍒犻櫎錛屽彲浠ュ畾涓篒gnored銆?/p>

[嫻嬭瘯鎵ц鍣?TestRunner]
鎵ц嫻嬭瘯鐨勫伐鍏鳳紝琛ㄧず浠ヤ綍縐嶆柟寮忔墽琛屾祴璇曪紝鍒浼?xì)锛寴q欏彲涓嶆槸鍦ㄤ唬鐮佷腑瑙勫畾鐨勶紝瀹屽叏鏄笌嫻嬭瘯鍐呭鏃犲叧鐨勮涓恒傛瘮濡傛枃鏈柟寮忥紝AWT鏂瑰紡錛宻wing鏂瑰紡錛屾垨鑰匛clipse鐨勪竴涓鍥劇瓑絳夈?/p>

{瀹炰緥錛欶ibonacci鏁板垪}

涓嬮潰鐨凷ample灞曠ずTDDer鏄浣曠紪鍐欎竴涓棬鍦ㄤ駭鐢烣ibonacci鏁板垪鐨勬柟娉曘?br>錛?錛夐鍏堝啓涓涓猅C錛屾柇璦fib(1) = 1;fib(2) = 1;榪欒〃紺鴻鏁板垪鐨勭涓涓厓绱犲拰絎簩涓厓绱犻兘鏄?銆?/p>

public   void  testFab() {
        assertEquals(
1 , fib( 1 ));
        assertEquals(
1 , fib( 2 ));
}

錛?錛変笂闈㈣繖孌典唬鐮佷笉鑳界紪璇戦氳繃錛孏reat錛佲斺旀槸鐨勶紝鎴戞槸璇碐reat錛佸綋鐒?dòng)灱屽鏋滀綘姝e湪鐢ㄧ殑鏄疎clipse閭d綘涓嶉渶瑕佺紪璇戯紝Eclipse 浼?xì)鍛婅瘔浣犱笉瀛樺湪fib鏂規(guī)硶錛屽崟鍑籱ark浼?xì)闂綘瑕佷笉瑕佹柊寰忎竴涓猣ib鏂規(guī)硶錛孫h錛屽綋鐒?dòng)灱佷皋Z簡(jiǎn)璁╀笂闈㈤偅涓猅C鑳介氳繃錛屾垜浠繖鏍峰啓錛?/p>

public   int  fib(  int  n ) {
        
return   1 ;
}

錛?錛夌幇鍦ㄩ偅涓猅C浜簡(jiǎn)緇跨伅錛寃ow錛佸簲璇ュ簡(jiǎn)紲濅竴涓嬩簡(jiǎn)銆傛帴涓嬫潵瑕佸鍔燭C鐨勯毦搴︿簡(jiǎn)錛屾祴絎笁涓厓绱犮?/p>

public   void  testFab() {
        assertEquals(
1 , fib( 1 ));
        assertEquals(
1 , fib( 2 ));
        assertEquals(
2 , fib( 3 ));
}

涓嶈繃榪欐牱鍐欒繕涓嶅お濂界湅錛屼笉濡傝繖鏍峰啓錛?/p>

public   void  testFab() {
        assertEquals(
1 , fib( 1 ));
        assertEquals(
1 , fib( 2 ));
        assertEquals(fib(
1 ) + fib( 2 ), fib( 3 ));
}

錛?錛夋柊澧炲姞鐨勬柇璦瀵艱嚧浜?jiǎn)绾㈢伅锛屼皋Z簡(jiǎn)鎵漿榪欎竴灞鍔挎垜浠繖鏍蜂慨鏀筬ib鏂規(guī)硶錛屽叾涓儴鍒嗕唬鐮佹槸浠庝笂闈㈢殑浠g爜涓瑿trl-C/Ctrl-V鏉ョ殑錛?/p>

public   int  fib(  int  n ) {
        
if  ( n  ==   3  )  return  fib( 1 ) + fib( 2 );
        
return   1 ;
}

錛?錛夊ぉ鍝紝榪欑湡鏄釜璐變漢鍐欑殑浠g爜錛佹槸鍟婏紝涓嶆槸鍚楋紵鍥犱負(fù)TC灝辨槸浜у搧鐨勮摑鏈紝浜у搧鍙鎭板ソ婊¤凍TC灝眔k銆傛墍浠ヤ簨鎯呭彂灞曞埌榪欎釜鍦版涓嶆槸fib鏂規(guī)硶鐨勯敊錛岃屾槸TC鐨勯敊錛屼簬鏄疶C榪樿榪涗竴姝ヨ姹傦細(xì)

public   void  testFab() {
        assertEquals(
1 , fib( 1 ));
        assertEquals(
1 , fib( 2 ));
        assertEquals(fib(
1 ) + fib( 2 ), fib( 3 ));
        assertEquals(fib(
2 ) + fib( 3 ), fib( 4 ));
}

錛?錛変笂鏈夋斂絳栦笅鏈夊絳栥?/p>

public   int  fib(  int  n ) {
        
if  ( n  ==   3  )  return  fib( 1 ) + fib( 2 );
        
if  ( n  ==   4  )  return  fib( 2 ) + fib( 3 );
        
return   1 ;
}

錛?錛夊ソ浜?jiǎn)锛屼笉鐜╀簡(jiǎn)銆傜幇鍦ㄥ凡緇忎笉鏄幢涓嶈幢鐨勯棶棰樹簡(jiǎn)錛岀幇鍦ㄧ殑闂鏄唬鐮佸嚭鐜頒簡(jiǎn)鍐椾綑錛屾墍浠ユ垜浠鍋氱殑鏄斺旈噸鏋勶細(xì)

public   int  fib(  int  n ) {
        
if  ( n  ==   1   ||  n  ==   2  錛?nbsp; return   1 ;
        
else   return  fib( n  -   1  )  +  fib( n  -   2  );
}

錛?錛夊ソ錛岀幇鍦ㄤ綘宸茬粡fib鏂規(guī)硶宸茬粡鍐欏畬浜?jiǎn)鍚楀Q熼敊浜?jiǎn)锛屼竴涓嵄闄╃殑閿欒錛屼綘蹇樹簡(jiǎn)閿欒鐨勮緭鍏ヤ簡(jiǎn)銆傛垜浠護(hù)0琛ㄧずFibonacci涓病鏈夎繖涓欏廣?/p>

public   void  testFab() {
        assertEquals(
1 , fib( 1 ));
        assertEquals(
1 , fib( 2 ));
        assertEquals(fib(
1 ) + fib( 2 ), fib( 3 ));
        assertEquals(fib(
2 ) + fib( 3 ), fib( 4 ));
        assertEquals(
0 , fib( 0 ));
        assertEquals(
0 , fib( - 1 ));
}

then change the method fib to make the bar grean錛?/p>

public   int  fib(  int  n ) {
        
if  ( n  <=   0  )  return   0 ;
        
if  ( n  ==   1   ||  n  ==   2  錛?nbsp; return   1 ;
        
else   return  fib( n  -   1  )  +  fib( n  -   2  );
}

錛?錛変笅鐝墠鏈鍚庝竴浠朵簨鎯咃紝鎶奣C涔熼噸鏋勪竴涓嬶細(xì)

public   void  testFab() {
        
int  cases[][]  =  {
                {
0 0 }, { - 1 0 },   // the wrong parameters
                { 1 1 }, { 2 1 }};   // the first 2 elements

        
for  ( int  i  =   0 ; i  <  cases.length; i ++ )
                assertEquals( cases[i][
1 ], fib(cases[i][ 0 ]) );

        
// the rest elements
         for  ( int  i  =   3 ; i  <   20 ; i ++ )
                assertEquals(fib(i
- 1 ) + fib(i - 2 ), fib(i));
}

錛?0錛夋墦瀹屾敹宸ャ?/p>

{鍏充簬鏈枃鐨勫啓浣渳

鍦ㄦ湰鏂囩殑鍐欎綔榪囩▼涓紝浣滆呬篃鐢ㄥ埌浜?jiǎn)TDD鐨勬濈淮錛屼簨瀹炰笂浣滆呭厛鏋勬濊鍐欎竴綃囦粈涔堟牱鐨勬枃绔狅紝鐒跺悗鍐欏嚭榪欑瘒鏂囩珷搴旇婊¤凍鐨勫嚑涓姹傦紝鍖呮嫭鍔熻兘鐨勮姹傦紙瑕佸啓浜涗粈涔堬級(jí)鍜屾ц兘鐨勮姹傦紙鍙鎬у浣曪級(jí)鍜岃川閲忕殑瑕佹眰錛堟枃瀛楃殑瑕佹眰錛夛紝榪欎簺瑕佹眰璧峰垵鏄竴涓篃杈句笉鍒扮殑錛堝洜涓烘鏂囪繕涓涓瓧娌℃湁錛夛紝鍦ㄨ繖縐嶆儏鍐典笅浣滆呯殑鏂囩珷鏃犳硶緙栬瘧閫氳繃錛屼負(fù)浜?jiǎn)杈惧埌杩欎簺瑕佹眰锛屼綔鑰呬笉鍋滅殑鍐欏晩鍐欏晩錛岀粓浜庡湪鑺卞敖浜?jiǎn)涓や釜鏈堢殑蹇?jī)琛涔嬪悗瀹屾垚浜?jiǎn)褰撳垵鏃㈠畾鐨勬墍鏈夎姹傦紙make the bar green錛夛紝闅忓悗浣滆呮暣鐞嗕簡(jiǎn)涓涓嬫枃绔犵殑緇撴瀯錛堥噸鏋勶級(jí)錛屽湪婊℃剰鐨勬彁浜ょ粰浜?jiǎn)Blog緋葷粺涔嬪悗錛屼綔鑰呯┛涓婁簡(jiǎn)涓浠剁豢鑹茬殑姹楄~錛岃洞鍦ㄥ湴涓婏紝瀛︿簡(jiǎn)涓ゅ0闈掕洐鍙傘傘傘傘傘傘俕_^

{鍚庤錛歁artin Fowler鍦ㄤ腑鍥絵

浠庢湰鏂囨寮忓畬鎴愬埌鍙戣〃鐨勫嚑涓皬鏃墮噷錛屾垜鍋剁劧璇誨埌浜?jiǎn)Martin Fowler鍏堢敓鍖椾含璁胯皥褰曪紝鍏墮棿鎻愬埌浜?jiǎn)寰堝瀵箣箣璇曢┍鍔ㄥ紑鍙戠殑鐪嬫硶錛屾憳鎶勫湪姝わ細(xì)

Martin Fowler錛氬綋鐒?dòng)灱堝煎緱鑺變竴鍗婄殑鏃墮棿鏉ュ啓鍗曞厓嫻嬭瘯錛夛紒鍥犱負(fù)鍗曞厓嫻嬭瘯鑳藉浣夸綘鏇村揩鐨勫畬鎴愬伐浣溿傛棤鏁版鐨勫疄璺靛凡緇忚瘉鏄庤繖涓鐐廣備綘鐨勬椂闂磋秺鏄揣寮狅紝灝辮秺瑕佸啓鍗曞厓嫻嬭瘯錛屽畠鐪嬩笂鍘繪參錛屼絾瀹為檯涓婅兘澶熷府鍔╀綘鏇村揩銆佹洿鑸掓湇鍦拌揪鍒扮洰鐨勩?br>Martin Fowler錛氫粈涔堝彨閲嶈錛熶粈涔堝彨涓嶉噸瑕侊紵榪欐槸闇瑕侀愭笎璁よ瘑鐨勶紝涓嶆槸鎯沖綋鐒剁殑銆傛垜涓虹粷澶у鏁扮殑妯″潡鍐欏崟鍏冩祴璇曪紝鏄湁鐐圭儲(chǔ)浜猴紝浣嗘槸褰撲綘鎰忚瘑鍒拌繖宸ヤ綔鐨勪環(huán)鍊兼椂錛屼綘浼?xì)娆g劧鐨勩?br>Martin Fowler錛氬鍏ㄤ笘鐣岀殑紼嬪簭鍛樻垜閮芥槸閭d箞鍑犳潯寤鴻錛?#8230;…絎簩錛屽涔?fàn)娴嬭瘯椹卞姩寮鍙戯紝榪欑鏂扮殑鏂規(guī)硶浼?xì)鏀瑰彉浣犲浜庤蒋錃g寮鍙戠殑鐪嬫硶銆?#8230;…

鈥斺斻婄▼搴忓憳銆嬶紝2005騫?鏈堝垔

{楦h阿}

fhawk
Dennis Chen
鑸嫢鑿╂彁
Kent Beck
Martin Fowler
c2.com



]]>
[杞琞Boost Test Libraryhttp://m.shnenglu.com/shuiyuan2004/archive/2008/03/29/45677.html涓嶅?/dc:creator>涓嶅?/author>Sat, 29 Mar 2008 07:39:00 GMThttp://m.shnenglu.com/shuiyuan2004/archive/2008/03/29/45677.htmlhttp://m.shnenglu.com/shuiyuan2004/comments/45677.htmlhttp://m.shnenglu.com/shuiyuan2004/archive/2008/03/29/45677.html#Feedback1http://m.shnenglu.com/shuiyuan2004/comments/commentRss/45677.htmlhttp://m.shnenglu.com/shuiyuan2004/services/trackbacks/45677.htmlboost 鐨?Test

test 搴撲腑鏈夊涓嬬殑緇勪歡錛?br>Execution Monitor  涓涓熀鏈敤浜?program 鍜?test program 鐨勫紓甯鎬笌閿欒媯(gè)嫻嬩笌鎶ュ憡鏈哄埗錛孍xecution Monitor 璋冪敤鐢ㄦ埛鎻愪緵鐨勫嚱鏁板茍鎶ュ憡鎵鏈夋崟鑾風(fēng)殑榪愯鏃剁殑寮傚父錛屽畠鍙鍏朵粬 Boost Test Library components 鍐呴儴璋冪敤錛屽綋鐒朵篃鍙互鐢ㄤ簬涓浜?production environment 鎺у埗閭d簺浼?xì)瀵艰嚧绋嬪簭宕╂簝鐨勫嚱鏁扮殑璋冪敤锛?br>
Program Execution Monitor  涓涓畝鍗曠殑 helper facility 鐢ㄤ簬鐩戞帶涓涓▼搴忕殑榪愯錛孭rogram Execution Monitor 鎻愪緵浜?main() 鍑芥暟鍜?Execution Monitor 鐩戞帶紼嬪簭鐨勬墽琛岋紝鍙互鐢ㄤ互 production environment 浜х敓涓鑷撮敊璇姤鍛婏紝鎺у埗鍦?test environment 鐜涓繍琛岀殑紼嬪簭錛岀洿鎺ヤ嬌鐢?Test Execution Monitor錛?br>
Test Tools  涓涓敤浠ヨ繘琛?testing 鐨勪竴涓?toolbox錛孴est Tools 琚敤鏉ユ祴璇曞湪 Test Execution Monitor 鎴?Unit Test Framework 鎺у埗涓嬭繍琛岀殑紼嬪簭錛?br>
Test Execution Monitor  璁╀竴涓祴璇曠▼搴忓湪 monitored environment 鐜涓繍琛岋紝Test Execution Monitor 鎻愪緵浜?main() 鏉ユ帶鍒惰嫻嬭瘯紼嬪簭鐨勮繍琛屽茍鍙互璁?Test Tools 瀹炵幇嫻嬭瘯鐨勯昏緫錛屽畠琚敤鍦?test environment錛屽鏋滆鎺у埗 production code 鐨勮繍琛屼嬌鐢?Program Execution Monitor錛?br>
Unit Test Framework  鐢ㄤ互綆鍖栫紪鍐欏拰緇勭粐 test cases 鐨?framework錛屾敮鎸佺畝鍗曞嚱鏁版垨鑰呮槸鎴愬憳鍑芥暟緙栧啓鐨?test cases 騫跺皢浠栦滑緇勭粐鎴愪竴涓?test suites 鐨?tree錛岃 framework 浣跨敤 Test Tools 鏉ュ疄鐜?test cases 騫舵彁渚涗簡(jiǎn)涓縐嶆満鍒剁敤浠ョ鐞?log report level 鍜?result report level錛?br>
minimal testing facility  鎻愪緵 Boost Test 鏈鍒濈増鏈殑鎻愪緵鐨勫姛鑳界殑綆鍗?facility錛屾彁渚涗簡(jiǎn)鍜?Test Execution Monitor 涓鏍風(fēng)殑鏈哄埗錛屼絾棰濆瀹氫箟浜?jiǎn)涓浜涚畝鍗曟彁渚?Test Tools 綾諱技鍔熻兘鐨?test tools錛屽畠涓嶉渶瑕佸拰浠諱綍鐨勫閮ㄧ粍浠?link錛岄傚悎綆鍗曞拰蹇熸祴璇曠殑闇瑕侊紝浣跨敤浜?test environment銆?br>(http://yaekees.spaces.live.com/blog/cns!1955EE8C6707277A!146.entry)


boost Test 鐨?Execution Monitor

浣跨敤 Execution Monitor 鐨勪笁閮ㄦ洸錛?br>1. #include <boost/test/execution_monitor.hpp>
2. Make an instance of boost::execution_monitor
3. Optionally register custom exception translators for exception classes you want special processing
 
璋冪敤 execution_monitor::execute( function_to_monitor, catch_system_exception, timeout ) 榪愯 monitored function銆傚鏋滆皟鐢ㄦ垚鍔熷垯榪斿洖涓涓?integer value錛屽鏋滄湁濡備笅鐨勪簨鎯呭彂鐢?br>1. Uncaught C++ exception
2. hardware or software signal, trap, or other exception
3. Timeout reached
4. debug assert event occurred (under Microsoft Visual C++ or compatible compiler)
the method execution_monitor::execute( ... ) throws the boost::execution_exception
濡傛灉甯屾湜紼嬪簭 error message 琚漿鍖栦負(fù)  execution_exception 鐨?error message錛屽垯鎵斿嚭濡備笅鐨勪笁綾誨紓甯革細(xì)C string錛宻td:string錛宎ny exception class in std::exception hierarchy銆?br> 
緇堟 monitored function 鑰屼笉璁?Execution Monitor 鎶ュ憡 any error 鐨勬渶浣蟲柟娉曟槸鎶涘嚭 boost::execution_aborted銆傚鏋滀笉鍠滄 "unknown exception caught" message 鑰屾洿鎰挎剰浣跨敤鑷畾涔夌殑 exception錛屽彲浠ュ悜 execution monitor 涓?any exception types 娉ㄥ唽 translator 鍑芥暟錛屽
ex_mon.register_exception_translator<my_exception1>( &translate_my_exception1 );
my_exception1 鏄紓甯哥被鍨嬶紝translate_my_exception1 鏄紓甯稿鐞嗗嚱鏁般?br>class execution_monitor {
public:
    virtual     ~execution_monitor();
   
    template<typename Exception, typename ExceptionTranslator>
    void        register_exception_translator( ExceptionTranslator const& tr, boost::type<Exception>* = 0 );
 
    int         execute( unit_test::callback0<int> const& F, bool catch_system_errors = true, int timeout = 0 );
}; // exception monitor
 
Execution Monitor 鐢?boost::execution_exception 鎶ュ憡鎹曡幏鐨勯棶棰橈紝鍏舵渶澶х殑鐗圭偣鏄笉鍒嗛厤浠諱綍 memory 鍥犳鍦ㄥ唴瀛樼█緙虹幆澧冧腑浣跨敤銆?br>class execution_exception {
public:
    execution_exception( error_code ec, const_string what_msg );
    enum error_code {
        cpp_exception_error,    // see note (1) below
        user_error,             // user reported nonfatal error
        system_error,           // see note (2) below
        timeout_error,          // only detectable on certain platforms
        user_fatal_error,       // user reported fatal error
        system_fatal_error      // see note (2) below
    };
    error_code   code() const;  // use this method to get an error code for the exception
    const_string what() const;  // use this method to get an error message for the exception
};
Note 1 錛歶ncaught C++ exceptions 琚綋鍋?error錛屽鏋滃簲鐢ㄧ▼搴忔崟鑾峰埌 C++ exception錛屽垯璇?exception 涓嶄細(xì)鍒?boost::execution_monitor錛?br>Note 2 錛氳繖浜?error 鍖呮嫭 UNIX signals 鍜?Windows structured exceptions錛岃繖浜涚粡甯哥敱 hardware traps 瑙﹀彂銆?br>
execution_monitor 鍙互鍔ㄦ佽繛鎺ワ紝搴撲腑娌℃湁鎻愪緵 main 鍑芥暟銆傜敱浜庡彧鏈変竴涓?libs/test/execution_monitor.cpp 鏂囦歡錛屽洜姝ゅ彲浠ョ洿鎺?copy 璇ユ枃浠躲?br>(http://yaekees.spaces.live.com/blog/cns!1955EE8C6707277A!148.entry)


boost Test 鐨?Program Execution Monitor

C++ program 鍙互閫氳繃 return value 鍜?throwing an exception 鎶ュ憡 user-detected errors錛岃屽 dereferencing an invalid pointer 鐨?System-detected errors 鍒欎互鍏朵粬鏂瑰紡鎶ュ憡銆?br> 
Boost Test Library 鐨?Program Execution Monitor 鍑忚交浜?jiǎn)鐢ㄦ埛澶勭悊澶嶆潅鐨?error detection 鍜?reporting錛屽茍鎻愪緵浜?main() 鍑芥暟鍦?monitored environment 鏉ヨ皟鐢ㄧ敤鎴鋒彁渚涚殑 cpp_main() 鍑芥暟錛宮ain() 鍑芥暟浠ヤ竴鑷寸殑鏂瑰紡媯(gè)嫻嬪拰鎶ュ憡澶氱 errors 鐨勫彂鐢燂紝灝嗗叾杞寲涓轟竴鑷寸殑 return code 榪斿洖緇?host enviroment銆?br>BOOST_TEST_CATCH_SYSTEM_ERRORS 璁劇疆鍏佽 Execution Monitor 鎹曡幏 system errors錛岄粯璁ゅ間負(fù) "yes"銆?br>BOOST_PRG_MON_CONFIRM 璁劇疆鏄惁鍏佽鐢ㄦ埛浜や簰紜紼嬪簭姝g‘榪愯錛岄粯璁ゅ間負(fù)"yes"銆?br> 
Program Execution Monitor 浣跨敤 Execution Monitor 鐩戣鐢ㄦ埛鎻愪緵鐨?cpp_main() 鍑芥暟鐨勮繍琛屻傚敖綆?Program Execution Monitor 鍦?libs/test/src/cpp_main.cpp 鎻愪緵浜?main() 鍑芥暟錛屼絾鏄負(fù)浜?link 姝g‘錛岀敤鎴峰繀欏繪彁渚涗竴涓笌 main() 鍑芥暟涓鏍鋒帴鍙g殑 cpp_main() 鍑芥暟銆傚 cpp_main() 鎶涘嚭寮傚父鎴栬繑鍥為潪 0 鍊鹼紝Program Execution Monitor 灝辮涓虹▼搴忓彂鐢熼敊璇?br>Program Execution Monitor 鍦?cout 鍜?cerr 嫻佷笂鍒嗗埆鎻愪緵璇︾粏鍜岀畝瑕佺殑閿欒鎶ュ憡銆侾rogram Execution Monitor 鎻愪緵鐨?main() 鍑芥暟榪斿洖濡備笅鐨勫?br>1. boost::exit_success - no errors
2. boost::exit_failure - non-zero and non-boost::exit_success return code from cpp_main().
3. boost::exit_exception_failure - cpp_main() throw an exception.
(http://yaekees.spaces.live.com/blog/cns!1955EE8C6707277A!149.entry)


boost Test 鐨?Test Tools

Test Tools 涓轟簡(jiǎn)璁╃敤鎴蜂嬌鐢ㄦ柟渚匡紝鎻愪緵浜?jiǎn)涓緋誨垪鐨勫畯錛岃繖浜涘畯鍒嗕笁綰э紝鍏舵晥鏋滄槸涓嶅悓鐨勶細(xì)
WARN 涓嶅鍔犲紩鐢ㄨ鏁幫紝緇х畫鎵ц紼嬪簭
CHECK 澧炲姞搴旂敤璁℃暟錛岀戶緇墽琛岀▼搴?br>REQUIRE 澧炲姞搴旂敤璁℃暟錛屼腑鏂▼搴忕殑榪愯
 
浣跨敤 CHECK level tools 瀹炵幇 assertions錛屼嬌鐢?WARN level tools 媯(gè)楠屼笉澶噸瑕佷絾鏄紜殑鏂歸潰錛屽錛氭ц兘銆佸彲縐繪鎬с佹湁鐢ㄦэ紝濡?assertions 澶辮觸灝變笉搴旇璁╃▼搴忕戶緇繍琛屽垯浣跨敤 REQUIRE level tools銆?br> 
Test Tools 鎻愪緵浜?jiǎn)涓や?.hpp 鏂囦歡 boost/test/test_tools.hpp 鍜?boost/test/floating_point_comparison.hpp錛屼竴涓?.cpp 鏂囦歡 libs/test/test_tools.cpp
BOOST_WARN( P )
BOOST_CHECK( P )
BOOST_REQUIRE( P )
BOOST_WARN_MESSAGE( P, M )
BOOST_CHECK_MESSAGE( P, M )
BOOST_REQUIRE_MESSAGE( P, M )
BOOST_ERROR( M )BOOST_FAIL( M )
BOOST_MESSAGE( M )
BOOST_CHECKPOINT( M )
BOOST_WARN_THROW( S, E )
BOOST_CHECK_THROW( S, E )
BOOST_REQUIRE_THROW( S, E )
BOOST_WARN_EXCEPTION( S, E, P )
BOOST_CHECK_EXCEPTION( S, E, P )
BOOST_REQUIRE_EXCEPTION( S, E, P )
BOOST_IGNORE_CHECK( e )
BOOST_WARN_NO_THROW( S )
BOOST_CHECK_NO_THROW( S )
BOOST_REQUIRE_NO_THROW( S )
BOOST_WARN_CLOSE( L, R, T )
BOOST_CHECK_CLOSE( L, R, T )
BOOST_REQUIRE_CLOSE( L, R, T )
BOOST_WARN_SMALL( FPV, T )
BOOST_CHECK_SMALL( FPV, T )
BOOST_REQUIRE_SMALL( FPV, T )
BOOST_WARN_PREDICATE( P, ARGS )
BOOST_CHECK_PREDICATE( P, ARGS )
BOOST_REQUIRE_PREDICATE( P, ARGS )
BOOST_WARN_EQUAL_COLLECTIONS( L_begin, L_end, R_begin, R_end )
BOOST_CHECK_EQUAL_COLLECTIONS( L_begin, L_end, R_begin, R_end )
BOOST_REQUIRE_EQUAL_COLLECTIONS( L_begin, L_end, R_begin, R_end )
BOOST_WARN_BITWISE_EQUAL( L, R )
BOOST_CHECK_BITWISE_EQUAL( L, R )
BOOST_REQUIRE_BITWISE_EQUAL( L, R )
BOOST_IS_DEFINED( symb )
BOOST_BITWISE_EQUAL( L, R )
(http://yaekees.spaces.live.com/blog/cns!1955EE8C6707277A!145.entry)


boost Test 鐨?Test Execution Monitor

Test Execution Monitor 緇撳悎浜?Test Tools 鍜?Execution Monitor 鐨勭壒鐐圭畝鍖栦簡(jiǎn)鐑?chǔ)鐞悑箣璇曞伐浣滃Q屽畠鎻愪緵浜?main() 鍑芥暟璋冪敤鐢ㄦ埛鎻愪緵鐨?test_main() 鍑芥暟錛岀敤鎴峰彲浠ヤ嬌鐢?Test Tools 鏉ヨ繘琛屽鏉傜殑楠岃瘉宸ヤ綔銆?br> 
Test Execution Monitor 琚璁$敤鏉ヨ繘琛屾祴璇曠畝鍗曠殑紼嬪簭鎴栬呬粠宸插瓨鍦ㄧ殑 production code 涓?dig a problem銆侾rogram Execution Monitor 鏇撮傚悎鐩戞帶 production (non-test) programs錛堝洜涓哄畠涓嶅獎(jiǎng)鍝嶇▼搴忕殑鎬ц兘錛夛紝鑰?Unit Test Framework 鏇撮傚悎 complex test programs錛屽洜涓?Unit Test Framework 鍙互
1. 鍙互灝?test 鍒嗗壊鍒板涓?test cases錛屽畠浼?xì)湄?fù)姣忎竴涓?test case 鍒嗗埆浜х敓 pass/fail 鐨勭粺璁′俊鎭紱
2. 鍋囧鏌愪竴涓?test case 澶辮觸浜?jiǎn)涓嶄細(xì)濯?jiǎng)鍝嶅叾浠栫殑 test錛?br>3. 鍙互閫氳繃鎸囧畾 name 鏉ヨ繍琛岀壒瀹氱殑 test case
4. 鍒嗙鐨?test cases 榪愯鏇存竻妤氬彂鐜扮壒瀹氭祴璇曟ā鍧楃殑鐩殑
5. 鍙互璁劇疆鏇村鐨勯夐」
(http://yaekees.spaces.live.com/blog/cns!1955ee8c6707277a!150.entry)


boost Test 鐨?Unit Test Framework

regression testing 鍙叧娉ㄧ▼搴忚繍琛岀殑鏃跺欐槸鍚︽湁閿欒鍙戠敓錛岃?unit test 鍒欓渶瑕佸敖鍙兘璇︾粏鐨勮緭鍑洪敊璇殑淇℃伅銆俇nit Test Framework 鐢?test tools 綆鍖栦簡(jiǎn) test cases 鐨勭紪鍐欏茍灝嗗叾緇勭粐涓烘湁灞傛鐨?test suites銆傚畠鎻愪緵浜?main() 鍑芥暟鍒濆鍖?framework錛岄氳繃鍛戒護(hù)琛屽弬鏁版垨鑰呮槸鐜鍙橀噺璁劇疆鍙傛暟錛屽茍閫氳繃 init_unit_test_suite(argc, argv)錛岀劧鍚庤繍琛岀敤鎴風(fēng)殑 test suite銆侳ramework 璺熻釜鎵鏈夌殑 passed/failed 鐨?Test Tools assertions錛屽彲浠ラ氳繃 test cases 鐨勬暟鐩紙part 鍜?total錛夊緱鍒版祴璇曡繘搴︼紝騫朵笖鍙互澶氱褰㈠紡鎻愪緵緇撴灉銆俇nit Test Framework 鍙鐢ㄦ潵榪涜綆鍗曟祴璇曞拰澶嶆潅閲嶈嫻嬭瘯錛屽畠涓嶉傚悎鐢ㄥ湪 production code錛屽悓鏃跺畠浠ヨ繍琛屾椂鐨勬晥鐜囦負(fù)浠d環(huán)鍔犻熺紪璇戙?br> 
璇ュ嚱鏁拌礋璐e垱寤哄拰鍒濆鍖栭《灞傜殑 test_suite 瀹炰緥錛屽 test_suite 鍒涘緩澶辮觸璇ュ嚱鏁拌繑鍥?NULL 鎸囬拡錛屾祴璇曠粓姝㈠茍榪斿洖涓涓?boost::exit_test_failure銆侳ramework 鍦ㄦ祴璇曡繍琛屾椂浼犻掔壒瀹氱殑鍛戒護(hù)琛屽弬鏁幫紝鍚屾椂鎺掓枼鍏朵粬 framework 鎸囧畾鐨勫弬鏁幫紝鍚屾椂 framework 璐熻矗 test_suite 鐨勭敓鍛藉懆鏈燂紝鍦?test 緇堟鏃朵細(xì)琚攢姣併?br> 
鍋囧 test cases 浼?xì)涓㈠國檱畾涔夌殑寮傚父锛屽彲浠ュ?Execution Monitor 閭f牱娉ㄥ唽鐗瑰畾鐨?translator錛屾敞鍐屽嚱鏁扮殑鍘熷瀷瀹氫箟濡備笅
template<typename Exception, typename ExceptionTranslator>
void boost::unit_test::register_exception_translator( ExceptionTranslator const& tr, boost::type<Exception>* d = 0 )
 
涓鏃︽祴璇曠粨鏉燂紝framework 浼?xì)鎶ュ憡缁撴灉迤垬q斿洖 return code銆備笅闈㈡槸闆嗘垚鍦?unit test framework 鍐呴儴鐨勭殑榪斿洖鍊?br>boost::exit_success  returned if no errors occurred during test or success result code was explicitly requested with the no result code framework parameter
boost::exit_test_failure  returned if nonfatal errors detected and no uncaught exceptions thrown or the framework fails to initialize the test suite
boost::exit_exception_failure  returned if fatal errors detected or uncaught exceptions thrown
 
鍦?VC7.1+stlport 4.62 涓?unit_test_example3.cpp 娌℃湁閫氳繃(瀵瑰縐嶇戶鎵挎病鏈夐氳繃)
 
綆鍗曠殑浣跨敤鏂規(guī)硶錛?br>1. 棣栧厛瀹氫箟 #define BOOST_AUTO_TEST_MAIN
2. 鍖呭惈 #include <boost/test/auto_unit_test.hpp>
3. 鍒涘緩涓涓?test_suite
BOOST_AUTO_TEST_CASE( test )
{
    BOOST_CHECK( true );
}
鐒跺悗 link libboost_test_exec_monitor-vc71-mt-sp-1_33.lib 灝卞彲浠ヤ簡(jiǎn)銆?br> 
鍙︿竴綾諱嬌鐢ㄦ柟娉曪紝棣栧厛鍖呭惈濡備笅
#include <boost/test/unit_test.hpp>
#include <boost/test/unit_test_monitor.hpp>
using namespace boost::unit_test;
鐒跺悗澹版槑 test_suite* init_unit_test_suite(int /*argc*/, char* /*argv*/[]) {}
涓涓吀鍨嬬敤娉曟槸
test_suite* init_unit_test_suite( int /*argc*/, char* /*argv*/[] ) {
    test_suite* test = BOOST_TEST_SUITE("custom_exception_test");
    unit_test_monitor.register_exception_translator<my_exception1>( &my_exception1_translator );
    unit_test_monitor.register_exception_translator<my_exception2>( &my_exception2_translator );
    test->add( BOOST_TEST_CASE( &throw_my_exception1 ) );
    test->add( BOOST_TEST_CASE( &throw_my_exception2 ) );
    return test;
}
(http://yaekees.spaces.live.com/blog/cns!1955EE8C6707277A!151.entry)


boost 鐨?minimal testing facility

鍙傚悎浣跨敤鍦?test environment 涓紝涓嶉渶瑕?link 浠諱綍澶栭儴鐨勭粍浠躲傜敤鎴峰彧闇瑕佹彁渚涗簡(jiǎn)濡備笅鐨勫嚱鏁?br>int test_main( int argc, char* argv[] ) 灝卞彲浠ヤ簡(jiǎn)銆俶inimal testing facility 鎻愪緵浜?BOOST_CHECK(predicate)錛孊OOST_REQUIRE(predicate)錛孊OOST_ERROR(message)錛?BOOST_FAIL(message)銆傞櫎浜?jiǎn)杩欏洓涓?MACRO 浠ュ鍙互閫氳繃鎶涘嚭寮傚父鍜?return 榪斿洖鍊兼姤鍛婇敊璇備笅闈㈡槸 boost 鎻愪緵鐨勪竴涓ず渚嬨?br>#include <boost/test/minimal.hpp>
int add( int i, int j ) { return i+j; }
int test_main( int, char *[] )             // note the name!
{
    // six ways to detect and report the same error:
    BOOST_CHECK( add( 2,2 ) == 4 );        // #1 continues on error
    BOOST_REQUIRE( add( 2,2 ) == 4 );      // #2 throws on error
    if( add( 2,2 ) != 4 )
      BOOST_ERROR( "Ouch..." );            // #3 continues on error
    if( add( 2,2 ) != 4 )
      BOOST_FAIL( "Ouch..." );             // #4 throws on error
    if( add( 2,2 ) != 4 ) throw "Oops..."; // #5 throws on error
    return add( 2, 2 ) == 4 ? 0 : 1;       // #6 returns error code
}
BOOST_CHECK 濡傛灉璇ヨ〃杈懼紡澶辮觸浜?jiǎn)锛屼細(xì)鍑虹幇婧愪唬鐮佹枃錃g鍚嶃佷唬鐮佽鍙楓佸茍涓斾細(xì)澧炲姞 error count錛屼竴鏃︾▼搴忕粓姝?error count 浼?xì)鏄窘C哄湪 std::cout錛?br>BOOST_REQUIRE 綾諱技浜?BOOST_CHECK錛屼絾鏄細(xì)鎶涘嚭琚?nbsp; Minimal testing facility 鎹曡幏鐨勫紓甯搞?br>(http://yaekees.spaces.live.com/blog/cns!1955EE8C6707277A!147.entry)



涓嶅?/a> 2008-03-29 15:39 鍙戣〃璇勮
]]>CxxTest浣跨敤鎸囧崡錛堝叆闂ㄧ瘒錛?/title><link>http://m.shnenglu.com/shuiyuan2004/archive/2007/08/31/31322.html</link><dc:creator>涓嶅?/dc:creator><author>涓嶅?/author><pubDate>Fri, 31 Aug 2007 10:42:00 GMT</pubDate><guid>http://m.shnenglu.com/shuiyuan2004/archive/2007/08/31/31322.html</guid><wfw:comment>http://m.shnenglu.com/shuiyuan2004/comments/31322.html</wfw:comment><comments>http://m.shnenglu.com/shuiyuan2004/archive/2007/08/31/31322.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://m.shnenglu.com/shuiyuan2004/comments/commentRss/31322.html</wfw:commentRss><trackback:ping>http://m.shnenglu.com/shuiyuan2004/services/trackbacks/31322.html</trackback:ping><description><![CDATA[  <p><span>CxxTest</span><span>浣跨敤鎸囧崡錛堝叆闂ㄧ瘒錛?/span></p> <p><span>鍑嗗宸ヤ綔錛?/span></p> <p><span><span>1銆?nbsp;</span></span><span>瀹夎</span><span>perl/Python</span></p> <p><span><span>2銆?nbsp;</span></span><span>涓嬭澆瑙e帇</span><span>CxxTest</span></p> <p><span><span>3銆?nbsp;</span></span><span>璁劇疆鐜鍙橀噺錛?/span></p> <p align=left><span>濡傛灉浣跨敤<span>Perl,</span>鍒欒緗竴涓悕涓?span>PERL</span>鐨勭幆澧冨彉閲忥紝鍊間負(fù)<span>perl.exe</span>鐨勪綅緗傦紙姣斿<span>D:\Perl\Bin\Perl.exe</span>錛夛紱</span></p> <p align=left><span>濡傛灉瀹夎<span>Python,</span>鍒欒緗竴涓悕涓?span>PYTHON</span>鐨勭幆澧冨彉閲忥紝鍊間負(fù)浣犲畨瑁呯殑<span>Python</span>鐩綍涓嬬殑<span>python.exe</span>璺緞錛堟瘮濡?span>D:\Python25\python.exe</span>錛夛紱</span></p> <p align=left><span>璁劇疆涓涓悕涓?span>CXXTESTDIR </span>鐨勭幆澧冨彉閲忥紝鍊間負(fù)<span>CxxTest</span>瑙e帇鍚庣殑鐩綍銆傦紙姣斿<span>D:\Cxxtest</span>錛夈傦紙璁劇疆<span>CXXTESTDIR</span>鐨勫師鍥狅細(xì)鍏嶅幓姣忔鍦?span>makefile</span>鏂囦歡涓寚瀹?span>CXXTESTDIR</span>鐨勭洰褰曪級(jí)</span></p> <p align=left> </p> <p align=left><span>鏂瑰紡涓錛氫嬌鐢?span>CxxTest</span></span><span> </span><span>\sample\msvc</span><span>涓殑妗嗘灦</span></p> <p align=left><span><span>1銆?nbsp;</span></span><span>鎷瘋礉<span>msvc</span>鏂囦歡澶瑰埌宸ョ▼鐩綍涓?/span></p> <p align=left><span>鎵撳紑<span>CxxTest_Workspace.sln</span>錛屽彲浠ョ湅鍒頒笁涓」鐩細(xì)</span></p> <p align=left><span>- CxxTest_3_Generate </span><span>榪愯</span><span> cxxtestgen.pl </span><span>鐢熸垚</span><span> runner.cpp </span><span>鏂囦歡錛?/span></p> <p align=left><span>- CxxTest_2_Build </span><span>緙栬瘧鐢熸垚鐨?/span><span>runner.cpp</span><span>鏂囦歡錛?/span></p> <p align=left><span>- CxxTest_1_Run </span><span>榪愯嫻嬭瘯錛?/span></p> <p align=left><span><span>2銆?nbsp;</span></span><span>淇敼鍏朵腑鐨?span>makefile</span>鏂囦歡<span>:</span></span></p> <p align=left><span>1</span><span>錛夊皢浠ヤ笅鍐呭錛?/span></p> <p align=left><span># Where to look for the tests</span></p> <p align=left><span>TESTS<span>            </span>= ..\gui\*.h ..\*.h</span></p> <p align=left><span>淇敼涓猴細(xì)</span></p> <p align=left><span># Where to look for the tests</span></p> <p align=left><span>TESTS<span>            </span>= *.h</span></p> <p align=left><span>榪欐璇濈殑浣滅敤鏄煡鎵炬祴璇曟枃浠訛紝鎴戜滑鐨勬祴璇曟枃浠舵槸<span>.h</span>鏍煎紡鐨勶紝鏀懼湪褰撳墠鐩綍涓嬨傦紙濡傛灉鏄?span>.hpp</span>鏍煎紡鐨勮瘽錛岃嚜鐒舵敼鎴?span>*.hpp</span>錛涙斁鍦ㄥ叾瀹冪洰褰曠殑璇濓紝榪樿淇敼璺緞錛?/span></p> <p align=left><span>2</span><span>錛夊皢浠ヤ笅鍐呭鍒犻櫎錛?/span></p> <p align=left><span># Where the CxxTest distribution is unpacked</span></p> <p align=left><span>CXXTESTDIR<span>       </span>= ..\..</span></p> <p align=left><span>鍥犱負(fù)鍏堝墠宸茬粡瀹氫箟浜?span>CXXTESTDIR</span>鐨勭幆澧冨彉閲忥紝榪欓噷鐨勫畾涔夊彲浠ョ渷鎺夈?/span></p> <p align=left><span><span>3銆?nbsp;</span></span><span>鍦?/span><span>CxxTest_3_Generate</span><span>欏圭洰涓坊鍔犳祴璇曟枃浠?/span></p> <p align=left><span>榪欐槸嫻嬭瘯鏂囦歡鐨勪竴涓畝鍗曠殑渚嬪瓙錛?/span></p> <p align=left><span>// Sampletest.h</span></p> <p align=left><span>#include</span><span> <span><cxxtest/TestSuite.h></span></span></p> <p align=left><span>//</span><span>瀹氫箟涓涓祴璇曞浠剁被錛屽皢嫻嬭瘯鐢ㄤ緥鏀懼叆鍏朵腑</span></p> <p align=left><span>class</span><span> <span>SampletestSuite</span> : <span>public</span> <span>CxxTest</span>::<span>TestSuite</span><span>    </span></span></p> <p align=left><span>{</span></p> <p align=left><span>public</span><span>:</span></p> <p align=left><span><span>     </span><span>//</span></span><span>瀹氫箟嫻嬭瘯錛屼互<span>test</span>浣滀負(fù)嫻嬭瘯鍑芥暟鍓嶇紑錛?/span></p> <p align=left><span><span>     </span><span>//</span></span><span>榪欐槸<span>cxxtestgen.pl</span>鎴?span>cxxtestgen.py</span>瀵規(guī)祴璇曟枃浠惰繘琛屾壂鎻忥紝鎶藉彇嫻嬭瘯鐢ㄤ緥鐨勪緷鎹?/span></p> <p align=left><span><span>     </span><span>void</span> <span>testMultiplication</span>( <span>void</span> )<span>    </span></span></p> <p align=left><span><span>     </span>{</span></p> <p align=left><span><span>         </span><span>TS_ASSERT_EQUALS</span>( 2 * 2, 5 );</span></p> <p align=left><span><span>     </span>}</span></p> <p><span>};</span></p> <p><span><span>4銆?nbsp;</span></span><span>榪愯嫻嬭瘯錛屽嵆鐢熸垚</span><span>CxxTest_1_Run</span><span>錛屽彲鍦ㄨ緭鍑虹獥鍙g湅鍒版祴璇曠粨鏋滐紝騫跺弻鍑葷粨鏋滆鍙畾浣嶅埌婧愪唬鐮併?/span></p> <p> </p> <p><span>鏂規(guī)硶浜岋細(xì)綆鍖?span>msvc</span>錛屽皢</span><span>Generate</span><span>錛?/span><span>Build</span><span>錛?/span><span>Run</span><span>闆嗘垚鍒頒竴涓」鐩腑</span></p> <p><span><span>1銆?nbsp;</span></span><span>鍦ㄥ伐紼嬩腑娣誨姞鏂伴」鐩細(xì)</span><span>Unit</span><span>_<span>Test</span></span></p> <p><span>灝嗕慨鏀瑰悗鐨?span>makefile</span>鏂囦歡鎷瘋礉鍒?span>Unit_Test</span>鐩綍涓?/span></p> <p><span><span>2銆?nbsp;</span></span><span>鍦?span>Unit_Test</span>欏圭洰婧愭枃浠朵腑娣誨姞鏂板緩欏?span>dummy</span></span></p> <p><span>鏃犺娣誨姞榪涙潵鐨勬槸<span>.cpp,</span>榪樻槸<span>.h,</span>灝嗗悗緙鍚嶅幓鎺夈?/span></p> <p><span>鍙沖嚮<span>dummy</span>錛岄夋嫨灞炴э紝鍦ㄥ脊鍑虹殑灞炴ч〉涓紝“鑷畾涔夌敓鎴愭楠?#8221;閫夐」<span>-></span>“鍛戒護(hù)琛?#8221;閫夐」錛岃緭鍏ワ細(xì)</span></p> <p><span>ECHO Don't Delete this file!!! > Dummy</span></p> <p><span>ECHO -</span></p> <p><span>ECHO -</span></p> <p><span>ECHO -------------------- Generating test cases --------------------</span></p> <p><span>if exist runner.cpp <st1:place w:st="on"><st1:state w:st="on">del</st1:state></st1:place> runner.cpp /Q</span></p> <p><span>NMAKE runner.cpp /nologo</span></p> <p><span>ECHO -</span></p> <p><span>ECHO –</span></p> <p> </p> <p><span>鍦?#8220;杈撳嚭”閫夐」涓緭鍏ワ細(xì)</span></p> <p><span>Runner.cpp</span></p> <p> </p> <p align=left><span>Dummy</span><span>鍙槸涓涓枃浠訛紝閲岃竟鍙互鏄換浣曞唴瀹癸紝</span><span>鍏抽敭鐐瑰湪浜庡<span>Dummy</span>鏂囦歡榪涜緙栬瘧鐨勬椂鍊欐墍鎵ц鐨勬搷浣滐紝榪欐槸涓涓壒澶勭悊鏂囦歡錛岃繖涓壒澶勭悊鏂囦歡鎵ц鐢熸垚<span> testcase </span>鐨勬搷浣滐紝涔熷氨鏄皟鐢?span>Python/Perl</span>鐢熸垚嫻嬭瘯鐢ㄤ緥錛堜篃灝辨槸<span>runner.cpp</span>鏂囦歡錛夈備負(fù)浜?jiǎn)淇濇寔姣弸啤缂栬瘧閮藉彲浠ョ敓鎴愭柊鐨?span>runner</span>鏂囦歡錛屽氨蹇呴』淇濊瘉</span></p> <p align=left><span>1</span><span>錛?span>Dummy</span>鏂囦歡鍦?span>runner.cpp</span>涔嬪墠榪涜緙栬瘧錛?/span></p> <p align=left><span>2</span><span>錛?span>Dummy</span>鏂囦歡姣忔閮藉繀欏昏閲嶆柊緙栬瘧銆?/span> </p> <p align=left><span>絎竴鐐規(guī)槸閫氳繃鏂囦歡欏哄簭鏉ョ殑錛岀浜岀偣鏄湪鐢熸垚浜嬩歡閲岃竟閲嶆柊鐢熸垚<span>Dummy</span>鏂囦歡鏉ヤ繚璇佺殑錛?span>VS2005</span>浼間箮娌¢棶棰橈紝<span>VC6</span>浼間箮榪樻槸鏈変簺闂鐨勶級(jí)銆?/span></p> <p align=left><span>浠庡彟澶栦竴涓搴﹁錛岃繖涓?span>Dummy</span>鏂囦歡鐩稿綋浜?span> samples/msvc </span>絎竴鍜岀浜屼釜欏圭洰鐨勫姛鑳姐傦紙鍗?/span><span>Generate</span><span>鍜?/span><span>Build</span><span>錛?/span></p> <p align=left> </p> <p><span><span>3銆?nbsp;</span></span><span>緙栬瘧<span>dummy</span>鏂囦歡錛岀敓鎴?span>runner.cpp</span>錛屽皢鍏舵坊鍔犲埌<span>Unit_Test</span>“婧愭枃浠?#8221;涓?/span></p> <p><span>紜畾褰撳墠鐩綍涓凡鏈?span>.h</span>嫻嬭瘯鏂囦歡錛屽惁鍒欏彲鑳芥彁紺洪敊璇?/span></p> <p><span><span>4銆?nbsp;</span></span><span>鍙沖嚮<span>Unit_Test</span>錛岄夋嫨灞炴э紝鍦ㄥ脊鍑烘潵鐨勫睘鎬ч〉涓紝 “鐢熸垚浜嬩歡”閫夐」<span>-></span>“鐢熸垚鍚庝簨浠?span>”</span>閫夐」<span>-></span>“鍛戒護(hù)琛?#8221;閫夐」涓緭鍏ワ細(xì)</span></p> <p><span>ECHO -</span></p> <p><span>ECHO -</span></p> <p><span>ECHO -------------------- Running Unit Test Cases --------------------</span></p> <p><span>$(OutDir)\$(TargetName).exe</span></p> <p><span>ECHO -</span></p> <p><span>ECHO -</span></p> <p><span>ECHO -------------------------------------------------------------------------------</span></p> <p><st1:place w:st="on"><st1:state w:st="on"><span>DEL</span></st1:state></st1:place><span> runner.cpp</span></p> <p> </p> <p><span>鏀懼湪欏圭洰“鐢熸垚鍚庝簨浠?#8221;涓殑榪欎竴孌靛懡浠わ紝榪愯鐢熸垚鐨勬祴璇曪紝鐩稿綋浜?/span><span>samples/msvc </span><span>絎笁涓」鐩殑鍔熻兘銆傦紙鍗?/span><span>Run</span><span>錛?/span></p> <p> </p> <p><span><span>5銆?nbsp;</span></span><span>鍦?span>Unit_Test</span>“澶存枃浠?#8221;涓紝娣誨姞鏂扮殑<span>.h</span>嫻嬭瘯鏂囦歡銆?/span></p> <p><span>鐢熸垚<span>Unit_Test</span>錛屽嵆鍙湪杈撳嚭紿楀彛鍒嗗壊綰夸笅鐪嬪埌榪愯嫻嬭瘯鐨勭粨鏋滐紝鍙屽嚮緇撴灉琛屽彲浠ュ畾浣嶅埌婧愪唬鐮併?/span></p> <p><span>濡傦細(xì)</span></p> <p align=left><span>1>-------------------- Running Unit Test Cases --------------------</span></p> <p align=left><span>1>Running 1 test</span></p> <p align=left><span>1>In MathsTestSuite::testMultiplication:</span></p> <p align=left><span>1>f:\test\cxxunittest\cxxunittest\sampletest.h(9): Error: Expected (2 * 2 == 5), found (4 != 5)</span></p> <p align=left><span>1>Failed 1 of 1 test</span></p> <p align=left><span>1>Success rate: 0%</span></p> <p><span>1>----------------------------------------------------------------------------------</span></p> <p> </p> <p><span>鏂規(guī)硶涓夛細(xì)鎶藉彇鍑轟竴涓?span>Unit_Test</span>鏂囦歡澶?/span></p> <p><span>鎵璋撴柟娉曚笁錛屼笉榪囨槸灝嗘柟娉曚簩涓殑<span>Unit_Test</span>鏂囦歡澶癸紝鏇夸唬鏂規(guī)硶涓涓殑<span>msvc</span>鏂囦歡澶癸紝縐誨姩鍒板叾瀹冪殑欏圭洰涓嬌鐢ㄨ屽凡銆?/span></p> <p><span>涓嶅儚鏂規(guī)硶涓鐨?span>msvc</span>閭f牱闇瑕佷笁涓」鐩紝涔熶笉闇鍍忔柟娉曚簩閭f牱錛屾瘡嬈¢兘淇敼<span>dummy</span>錛屽拰欏圭洰灞炴э紝娣誨姞鍛戒護(hù)琛屻傚皢<span>Unit_Test</span>鏂囦歡澶瑰悇涓睘鎬ч兘閰嶇疆濂戒箣鍚庯紝鐙珛鍑烘潵闅忔椂澶囩敤銆?/span></p> <p> </p> <p><span>鍑嗗宸ヤ綔錛屽鍓嶆墍璦銆?/span></p> <p><span>瑕佽繘琛屾祴璇曟椂錛?/span></p> <p><span>灝?/span><span>Unit_test</span><span>鏂囦歡澶規(guī)嫹璐濇斁鍒板伐紼嬬洰褰曚腑錛屽湪宸ョ▼涓坊鍔犻噷闈㈢殑</span><span>Unit_Test</span><span>欏圭洰錛屼豢鐓?/span><span>Sampletest.h</span><span>鍐欒嚜宸辯殑嫻嬭瘯鏂囦歡銆?/span></p> <p><span>榪愯嫻嬭瘯鏃訛細(xì)</span></p> <span>鍏堢紪璇?/span><span>dummy</span><span>錛屽啀鐢熸垚璇ユ祴璇曢」鐩?/span><span>(</span><span>濡傛灉娌℃湁鍙﹀娣誨姞</span><span>*.h</span><span>鏂囦歡錛岀洿鎺ョ敓鎴愬氨鍙互浜?/span><span>) </span> <img src ="http://m.shnenglu.com/shuiyuan2004/aggbug/31322.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://m.shnenglu.com/shuiyuan2004/" target="_blank">涓嶅?/a> 2007-08-31 18:42 <a href="http://m.shnenglu.com/shuiyuan2004/archive/2007/08/31/31322.html#Feedback" target="_blank" style="text-decoration:none;">鍙戣〃璇勮</a></div>]]></description></item><item><title>C++鍗曞厓嫻嬭瘯妗嗘灦鐨勬瘮杈僛me]http://m.shnenglu.com/shuiyuan2004/archive/2007/08/29/31105.html涓嶅?/dc:creator>涓嶅?/author>Wed, 29 Aug 2007 01:30:00 GMThttp://m.shnenglu.com/shuiyuan2004/archive/2007/08/29/31105.htmlhttp://m.shnenglu.com/shuiyuan2004/comments/31105.htmlhttp://m.shnenglu.com/shuiyuan2004/archive/2007/08/29/31105.html#Feedback1http://m.shnenglu.com/shuiyuan2004/comments/commentRss/31105.htmlhttp://m.shnenglu.com/shuiyuan2004/services/trackbacks/31105.htmlC++鍗曞厓嫻嬭瘯妗嗘灦鐨勬瘮杈?/span>

鍗曞厓嫻嬭瘯鐜板湪宸茬粡鎴愪負(fù)鏍囧噯鐨勭紪紼嬪疄璺碉紝浣嗘槸C++緙哄皯Java鍜?/span>.Net騫沖彴璇█鐨勫弽灝勬満鍒訛紝鎵浠ユ棤娉曟灇涓炬祴璇曟柟娉曪紝蹇呴』鎵嬪伐娣誨姞錛屾垨鑰呬嬌鐢ㄤ竴浜涚壒鍒殑瀹忥紝寮勫緱浠g爜闈炲父闅劇湅銆?/span>Java璇█鍗曞厓嫻嬭瘯鏄?/span>JUnit鐨勫ぉ涓嬶紝C#鍩烘湰涓婇兘鐢?/span>NUnit錛岃?/span>C++鍒欑兢鑺辨掓斁錛屽崟鍏冩祴璇曟鏋墮潪甯稿錛?/span>JUnit縐繪榪囨潵鐨?/span>CppUnit錛?/span>Boost::test錛?/span>CppTest錛?/span>CxxTest錛?/span> TUT絳夌瓑銆備絾鏄В鍐蟲柟妗堟渶濂界殑鏄?/span>CxxTest鍜?/span>TUT錛?/span>CxxTest閲囩敤鐨勬柟娉曟瘮杈冪壒孌婏紝鐢?/span>Perl鍒嗘瀽C++鐨勬簮鏂囦歡錛屼粠涓娊鍙栨祴璇曟柟娉曪紝鍒涘緩TestSuite銆傝娉曚笌JUnit闈炲父鐩鎬技錛屾病鏈変嬌鐢ㄩ珮綰х殑C++鐗規(guī)э紝涔熸病鏈夊畾涔夌壒鍒殑瀹忥紝鏃犻』鍐欓澶栫殑浠g爜銆?/span>TUT涔熸槸涓涓笉閿欑殑瑙e喅鏂規(guī)錛屽埄鐢ㄩ珮綰?/span>C++ Template鍔熻兘錛屽繀欏繪瘮杈冩柊鐨勭紪璇戝櫒鎵嶆敮鎸侊紝姣斿VC6鍜?/span>VS.NET 2002灝變笉鏀寔錛屽繀欏?/span>VS.NET 2003浠ヤ笂鎴栬?/span>Intel C++ Complier 8.1浠ヤ笂銆?/span>

 

1銆?nbsp;TUT

緇撴瀯妗嗘灦綆鍗曘傛坊鍔犳柊鐨勬祴璇曞伐浣滈噺灝忥紱鏃犻』娉ㄥ唽嫻嬭瘯錛涘彲縐繪鎬уソ錛堝洜鍏跺彧闇涓や釜澶存枃浠訛紝灝卞彲浠ュ畬鎴愭祴璇曞伐浣滐級(jí)錛涗究浜庤鍗革紱鎻愪緵鎺ュ彛鍙互鎵╁睍鍏惰緭鍑烘柟寮忕瓑銆?/span>

鏈澶х殑浼樼偣錛氳交閲忕駭錛屼究浜庤鍗稿拰鍙墿灞曞叾杈撳嚭鏂瑰紡錛?/span>

緙虹偣錛氭柇璦浼間箮涓嶆槸寰堝ソ錛屽彧鐢ㄤ簡(jiǎn)涓涓?/span>ensure()鍑芥暟錛屼笉鐭ラ亾瀵瑰鏉傜殑嫻嬭瘯鏄惁鏀寔錛涜緭鍑虹殑嫻嬭瘯緇撴灉杈冧負(fù)綆鍗曘?/span>

2銆?nbsp;Boost::test

緇撴瀯妗嗘灦杈冧負(fù)澶嶆潅銆傛坊鍔犳柊鐨勬祴璇曞伐浣滈噺涔熶笉澶э紱鎻愪緵澶氱嫻嬭瘯鏂規(guī)硶錛屽彲娉ㄥ唽嫻嬭瘯鐢ㄤ緥錛屼篃鍙笉娉ㄥ唽錛涘彲縐繪鎬т竴鑸紱瑁呭嵏涓嶆槗錛涘湪鎺у埗寮傚父銆佸穿婧冩柟闈㈢殑鑳藉姏鑳滆繃鍏跺畠鎵鏈夊鎵嬶紱鎷ユ湁鑹ソ鐨勬柇璦鍔熻兘錛涘ぇ姒傝兘鏀寔澶氱杈撳嚭鏂瑰紡錛屼絾鏇存敼杈撳嚭鏂瑰紡涓嶆槗錛涙敮鎸佹祴璇曞浠躲?/span>

鏈澶х殑浼樼偣錛氭帶鍒跺紓甯稿穿婧冪殑鑳藉姏銆佽壇濂界殑鏂█銆佽緭鍑虹粨鏋滆緝涓鴻緇嗐佺紪鍐欐祴璇曠殑鏂規(guī)硶鐏墊椿錛?/span>

緙虹偣錛氱粨鏋勬鏋惰緝涓哄鏉傦紝鏇存敼杈撳嚭鏂瑰紡涓嶆槗錛岃鍗鎬笉鏄撱?/span>

3銆?nbsp;CXXTest

緇撴瀯妗嗘灦鐨勫鏉傛у浜?/span>TUT涓?/span>boost::test涔嬮棿銆傛坊鍔犳柊鐨勬祴璇曞伐浣滈噺闈炲父灝忥紱鏃犻』娉ㄥ唽嫻嬭瘯鐢ㄤ緥錛涘彲縐繪鎬у緢濂斤紱渚夸簬瑁呭嵏錛涙帶鍒跺紓甯搞佸穿婧冩柟闈㈢殑鑳藉姏涔熶笉閿欙紱鎷ユ湁鑹ソ鐨勬柇璦鍔熻兘錛涙敮鎸佸縐嶈緭鍑烘柟寮忥紱鏀寔嫻嬭瘯濂椾歡銆?/span>

鏈澶х殑浼樼偣錛?/span>緙栬瘧鍗蟲祴璇曟柟寮忥紝騫朵笖鍙互鍙屽嚮緇撴灉琛岀珛鍗沖畾浣嶅埌鐩稿簲鐨勬簮浠g爜錛岀浉褰撳惛寮曚漢錛涙敮鎸佸縐嶈緭鍑猴紝杈撳嚭緇撴灉杈冧負(fù)璇︾粏錛涚紪鍐欐祴璇曠畝鍗曪紱

緙虹偣錛氶渶瑕佺敤鍒?/span>perl瀵規(guī)祴璇曚唬鐮佽繘琛屾枃娉曟壂鎻忥紝鐢熸垚鍙墽琛屼唬鐮侊紝闇瑕佺敤鍒?/span>makefile鏂囦歡錛堜笉鏄繀欏伙級(jí)錛涘噯澶囧伐浣滄瘮杈冮夯鐑?chǔ)銆?/span>



]]>
C++嫻嬭瘯妗嗘灦鐨勯夋嫨[杞琞http://m.shnenglu.com/shuiyuan2004/archive/2007/08/26/30852.html涓嶅?/dc:creator>涓嶅?/author>Sun, 26 Aug 2007 06:34:00 GMThttp://m.shnenglu.com/shuiyuan2004/archive/2007/08/26/30852.htmlhttp://m.shnenglu.com/shuiyuan2004/comments/30852.htmlhttp://m.shnenglu.com/shuiyuan2004/archive/2007/08/26/30852.html#Feedback2http://m.shnenglu.com/shuiyuan2004/comments/commentRss/30852.htmlhttp://m.shnenglu.com/shuiyuan2004/services/trackbacks/30852.html

http://www.gamesfromwithin.com/articles/0412/000061.html錛?/font>鍦ㄨ繖綃囨枃绔犱腑錛孨oel Llopis鎻愬嚭浜?jiǎn)涓涓C++ test framework璇勫垽鐨勪竴浜涗緷鎹紝鎸夌収Noel Llopis緇欏嚭鐨勯噸瑕佹э紝鎴戣妭鐣ュ湪榪欓噷銆?/p>

1.鍔犲叆鏂版祴璇曟渶灝忓寲宸ヤ綔閲?/p>

2.渚夸簬淇敼鍜岀Щ妞嶏紙浣滆呯殑鎰忔濇槸璇存瘮濡俁TTI錛孲TL錛孍xception榪欎簺楂樼駭鐗規(guī)у彲鑳藉Θ紕嶅湪涓嶅悓鐨勫鉤鍙幫紝涓嶅悓鐗堟湰緙栬瘧鍣ㄤ笅闈㈢殑鍙Щ妞嶆э級(jí)

3.渚夸簬瑁呴厤/鎷嗗嵏嫻嬭瘯鐜

4.瀵瑰紓甯鎬互鍙?qiáng)宕╂簝寰堝ソ鐨勬帶鍒?/p>

5.濂界殑鏂█鍔熻兘

6.鏀寔涓嶅悓鐨勮緭鍑烘柟寮?/p>

7.鏀寔嫻嬭瘯濂椾歡(suites)

 

鎸夌収榪欎釜鏍囧噯錛孨oel Llopis瀵逛笅闈㈢殑test framework榪涜浜?jiǎn)璇勪?/p>

CPPUnit

1.宸ヤ綔閲忓

2.CPPUnit鑳藉湪Windows , Linux涓婇潰榪愯錛屽姛鑳借繘琛屼簡(jiǎn)寰堝ソ鐨勬ā鍧楀寲錛屼絾鏄彟涓鏂歸潰錛孋PPUnit闇瑕丷TTI錛孲TL錛屾垨鑰呭紓甯革紙浣滆呬笉鏄緢鑲畾錛?/p>

3.

4.CPPUnit浣跨敤protectors鍖呰嫻嬭瘯錛屽茍涓旀崟鎹夋墍鏈夌殑寮傚父錛堝皾璇曡瘑鍒煇浜涘紓甯革級(jí)錛孡inux涓嬮潰涓嶄細(xì)鎹曟崏緋葷粺寮傚父錛屼絾鏄澧炲姞鑷畾涔夌殑鍖呰鏄緢瀹規(guī)槗鐨勩?/p>

5.寰堝ソ錛屾敮鎸佷竴涓渶灝忛泦鍚堢殑鏂█璇彞錛屽寘鎷瘮杈冩誕鐐規(guī)暟銆?/p>

6.鏀寔

7.鏀寔

鎬諱綋璇勪環(huán)錛歄verall, CppUnit is frustrating because it's almost exactly what I want, except for my most wanted feature. (CPPUnit澶熼椃鐨勶紝涓嶈繃鎴戣寰楁敼榪涙槗鐢ㄦу簲璇ュ彲浠ユ湡寰咃級(jí)

 

Boost.Test錛堟垜灝濊瘯浣跨敤錛屽湪VC.Net 2003涓嬮潰閬囧埌閾炬帴闂錛岃繕娌℃湁瑙e喅錛?/p>

1.鍩烘湰婊¤凍

2.鍜孋PPUnit綾諱技錛屼絾寮鴻皟鐨勬槸鏀逛唬鐮佺殑闅懼害浠ュ強(qiáng)渚濊禆Boost鏈韓

3.閬垮紑浜?jiǎn)甯歌鐨剆etup/teardown緇撴瀯錛屽彲浠ヤ笉闇瑕佸姩鎬佺敓鎴恌ixture 瀵硅薄錛屽彲浠ュ皢fixture瀵硅薄鏀懼埌stack閲岄潰銆?/p>

4.Boost.Test鍦ㄨ繖鏂歸潰瓚呰繃浜?jiǎn)鎵鏈夌殑鍏朵粬绔炰簤瀵規(guī)墜

5.Yes

6.澶ф鑳芥敮鎸侊紝浣嗘敼鍙樿緭鍑鴻繖浠朵簨鎯呭茍涓嶆槸寰堝鏄?/p>

7.鏀寔錛?..錛堣繖鍙ュ浣曠悊瑙o紵Yes, but with a big catch錛?/p>

Overall,Boost.Test is a library with a huge amount of potential. It has great support for exception handling and advanced assert statements. It also has other fairly unique functionality such as support for checking for infinite loops, and different levels of logging. On the other hand, it's very verbose to add new tests that are part of a suite, and it might be a bit heavy weight for game console environments.

 

CppUnitLite(鐢變簬浣滆呮瘮杈冧簡(jiǎn)涓涓浠栨敼鍔ㄧ殑鐗堟湰錛屾垜涓嶅啀鍏蟲敞錛?/p>

 

NanoCppUnit錛堣繖涓簱鐢氳嚦闇瑕佷綘鍘諱粠web pages涓婇潰copy浠g爜錛岀劧鍚庤嚜宸辨悶涓涓伐紼嬶紝鎴戣寰楁垜涓嶅お鍠滄榪欑鏂瑰紡鐨刾ackage鍙戝竷錛屾瘯绔燂紝鎴戝笇鏈涘皯鎿嶅績(jī)錛屾墍浠ユ垜涔熶笉鍏蟲敞錛?/p>

 

Unit++

棣栧厛鎸囧嚭涓涓嫭鐗圭殑鐗規(guī)э細(xì)More C++ Like錛屼綔鑰呯殑鎰忔濇槸瀹冩病鏈変嬌鐢ㄥ畯錛岀殑紜紝鍓嶉潰鍑犵framework寮濮嬩竴涓祴璇曠殑鏃跺欓兘浣跨敤浜?jiǎn)瀹忓Q岃繖鍦ㄨ澶欳++ Library涓槸鎯緥錛岀敤鏉ョ畝鍖栦竴浜涗唬鐮併傛垜浠氳繃浠庡熀綾葷戶鎵夸粠鑰屽垱寤烘祴璇曞寘錛屽綋鐒跺湪鍏朵粬framework閲岄潰鏈川涔熸槸榪欐牱錛屼絾鏄兘鏀懼湪騫曞悗榪涜錛屽畯鎺╃洊浜?jiǎn)鍏蜂綋鎯呭嘃c(diǎn)?/p>

1.涓嶅ソ

2.涓鑸埇

3.涓嶆敮鎸?/p>

4.琛ㄧ幇騫沖潎

5.鏂囨。娌¤濡備綍鏀寔涓嶅悓鐨勮緭鍑?/p>

6.涓嶆敮鎸佹誕鐐規(guī)暟

7.鏀寔

 

CxxTest

棣栧厛浣滆呰涓烘枃妗f渶濂斤紙寰堥噸瑕侊紵錛夊彟澶栦綔鑰呮寚鍑?CxxTest鐨勪綔鑰匛rez Volk鎰忚瘑鍒版垜浠槸鍦ㄥ啓宸ュ叿甯姪嫻嬭瘯C++紼嬪簭錛屾墍浠ヤ笉蹇呭彈闄愪簬C++鐨勭壒寰併?

1.闈炲父濂?/p>

2.寰堝ソ

3.鏀寔

4.寰堝ソ

5.yes

6.yes

7.yes

 

 

鏂囩珷鏈鍚庣粰鍑轟竴涓患榪幫細(xì)鏄釜琛ㄧ幇濂界殑錛孋PPUnit, CppUnitLite, Boost.Test, CxxTest錛屼綔鑰呮湰浜哄枩嬈xxTest.

(瀹?

 

杞嚜錛?a >http://hi.baidu.com/fangfang%5Fi/blog/item/32876bfb5d140a64024f56e6.html

]]>
鍏ㄩ潰浠嬬粛鍗曞厓嫻嬭瘯 錛嶈漿璐?/title><link>http://m.shnenglu.com/shuiyuan2004/archive/2007/08/26/30851.html</link><dc:creator>涓嶅?/dc:creator><author>涓嶅?/author><pubDate>Sun, 26 Aug 2007 06:33:00 GMT</pubDate><guid>http://m.shnenglu.com/shuiyuan2004/archive/2007/08/26/30851.html</guid><wfw:comment>http://m.shnenglu.com/shuiyuan2004/comments/30851.html</wfw:comment><comments>http://m.shnenglu.com/shuiyuan2004/archive/2007/08/26/30851.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://m.shnenglu.com/shuiyuan2004/comments/commentRss/30851.html</wfw:commentRss><trackback:ping>http://m.shnenglu.com/shuiyuan2004/services/trackbacks/30851.html</trackback:ping><description><![CDATA[<span id="hvzpftn" class=smalltxt><span id="hvzpftn" class=bold><font size=2> <p><font size=2><span id="hvzpftn" class=smalltxt><span id="hvzpftn" class=bold>鍏ㄩ潰浠嬬粛鍗曞厓嫻嬭瘯 錛嶈漿璐?/span></span><br><br></font><span style="FONT-SIZE: 12px"><font size=2>榪欐槸涓綃囧叏闈粙緇嶅崟鍏冩祴璇曠殑緇忓吀涔嬩綔錛屽鐞嗚В鍗曞厓嫻嬭瘯鍜孷isual Unit寰堟湁甯姪錛屼綔鑰呰佺撼錛屾敹褰曟椂浣滀簡(jiǎn)灝戦噺淇敼<br><br>涓銆鍗曞厓嫻嬭瘯姒傝堪<br>銆銆宸ュ巶鍦ㄧ粍瑁呬竴鍙扮數(shù)瑙嗘満涔嬪墠錛屼細(xì)瀵規(guī)瘡涓厓浠墮兘榪涜嫻嬭瘯錛岃繖錛屽氨鏄崟鍏冩祴璇曘?br>銆銆鍏跺疄鎴戜滑姣忓ぉ閮藉湪鍋氬崟鍏冩祴璇曘備綘鍐欎簡(jiǎn)涓涓嚱鏁幫紝闄や簡(jiǎn)鏋佺畝鍗曠殑澶栵紝鎬繪槸瑕佹墽琛屼竴涓嬶紝鐪嬬湅鍔熻兘鏄惁姝e父錛屾湁鏃惰繕瑕佹兂鍔炴硶杈撳嚭浜涙暟鎹紝濡傚脊鍑轟俊鎭獥鍙d粈涔堢殑錛岃繖錛屼篃鏄崟鍏冩祴璇曪紝鑰佺撼鎶婅繖縐嶅崟鍏冩祴璇曠О涓轟復(fù)鏃跺崟鍏冩祴璇曘傚彧榪涜浜?jiǎn)鋸?fù)鏃跺崟鍏冩祴璇曠殑杞歡錛岄拡瀵逛唬鐮佺殑嫻嬭瘯寰堜笉瀹屾暣錛屼唬鐮佽鐩栫巼瑕佽秴榪?0%閮藉緢鍥伴毦錛屾湭瑕嗙洊鐨勪唬鐮佸彲鑳介仐鐣欏ぇ閲忕殑緇嗗皬鐨勯敊璇紝榪欎簺閿欒榪樹細(xì)浜掔浉褰卞搷錛屽綋BUG鏆撮湶鍑烘潵鐨勬椂鍊欓毦浜庤皟璇曪紝澶у箙搴︽彁楂樺悗鏈熸祴璇曞拰緇存姢鎴愭湰錛屼篃闄嶄綆浜?jiǎn)寮鍙戝晢鐨勭珵浜夊姏銆傚彲浠ヨ錛岃繘琛屽厖鍒嗙殑鍗曞厓嫻嬭瘯錛屾槸鎻愰珮杞歡璐ㄩ噺錛岄檷浣庡紑鍙戞垚鏈殑蹇呯敱涔嬭礬銆?br>銆銆瀵逛簬紼嬪簭鍛樻潵璇達(dá)紝濡傛灉鍏繪垚浜?jiǎn)瀵硅嚜宸卞啓鐨勪唬鐮仒q涜鍗曞厓嫻嬭瘯鐨勪範(fàn)鎯紝涓嶄絾鍙互鍐欏嚭楂樿川閲忕殑浠g爜錛岃屼笖榪樿兘鎻愰珮緙栫▼姘村鉤銆?br>銆銆瑕佽繘琛屽厖鍒嗙殑鍗曞厓嫻嬭瘯錛屽簲涓撻棬緙栧啓嫻嬭瘯浠g爜錛屽茍涓庝駭鍝佷唬鐮侀殧紱匯傝佺撼璁や負(fù)錛屾瘮杈冪畝鍗曠殑鍔炴硶鏄負(fù)浜у搧宸ョ▼寤虹珛瀵瑰簲鐨勬祴璇曞伐紼嬶紝涓烘瘡涓被寤虹珛瀵瑰簲鐨勬祴璇曠被錛屼負(fù)姣忎釜鍑芥暟錛堝緢綆鍗曠殑闄ゅ錛夊緩绔嬫祴璇曞嚱鏁般傞鍏堝氨鍑犱釜姒傚康璋堣皥鑰佺撼鐨勭湅娉曘?br>銆銆涓鑸涓猴紝鍦ㄧ粨鏋勫寲紼嬪簭鏃朵唬錛屽崟鍏冩祴璇曟墍璇寸殑鍗曞厓鏄寚鍑芥暟錛屽湪褰撲粖鐨勯潰鍚戝璞℃椂浠o紝鍗曞厓嫻嬭瘯鎵璇寸殑鍗曞厓鏄寚綾匯備互鑰佺撼鐨勫疄璺墊潵鐪嬶紝浠ョ被浣滀負(fù)嫻嬭瘯鍗曚綅錛屽鏉傚害楂橈紝鍙搷浣滄ц緝宸紝鍥犳浠嶇劧涓誨紶浠ュ嚱鏁頒綔涓哄崟鍏冩祴璇曠殑嫻嬭瘯鍗曚綅錛屼絾鍙互鐢ㄤ竴涓祴璇曠被鏉ョ粍緇囨煇涓被鐨勬墍鏈夋祴璇曞嚱鏁般傚崟鍏冩祴璇曚笉搴旇繃鍒嗗己璋冮潰鍚戝璞★紝鍥犱負(fù)灞閮ㄤ唬鐮佷緷鐒舵槸緇撴瀯鍖栫殑銆傚崟鍏冩祴璇曠殑宸ヤ綔閲忚緝澶э紝綆鍗曞疄鐢ㄩ珮鏁堟墠鏄‖閬撶悊銆?br>銆銆鏈変竴縐嶇湅娉曟槸錛屽彧嫻嬭瘯綾葷殑鎺ュ彛(鍏湁鍑芥暟)錛屼笉嫻嬭瘯鍏朵粬鍑芥暟錛屼粠闈㈠悜瀵硅薄瑙掑害鏉ョ湅錛岀‘瀹炴湁鍏墮亾鐞嗭紝浣嗘槸錛屾祴璇曠殑鐩殑鏄壘閿欏茍鏈緇堟帓閿欙紝鍥犳錛屽彧瑕佹槸鍖呭惈閿欒鐨勫彲鑳芥ц緝澶х殑鍑芥暟閮借嫻嬭瘯錛岃窡鍑芥暟鏄惁縐佹湁娌℃湁鍏崇郴銆傚浜嶤++鏉ヨ錛屽彲浠ョ敤涓縐嶇畝鍗曠殑鏂規(guī)硶鍖洪殧闇嫻嬭瘯鐨勫嚱鏁幫細(xì)綆鍗曠殑鍑芥暟濡傛暟鎹鍐欏嚱鏁扮殑瀹炵幇鍦ㄥご鏂囦歡涓紪鍐?inline鍑芥暟)錛屾墍鏈夊湪婧愭枃浠剁紪鍐欏疄鐜扮殑鍑芥暟閮借榪涜嫻嬭瘯(鏋勯犲嚱鏁板拰鏋愭瀯鍑芥暟闄ゅ)銆?br>銆銆浠涔堟椂鍊欐祴璇曪紵鍗曞厓嫻嬭瘯瓚婃棭瓚婂ソ錛屾棭鍒頒粈涔堢▼搴︼紵XP寮鍙戠悊璁鴻絀禩DD錛屽嵆嫻嬭瘯椹卞姩寮鍙戯紝鍏堢紪鍐欐祴璇曚唬鐮侊紝鍐嶈繘琛屽紑鍙戙傚湪瀹為檯鐨勫伐浣滀腑錛屽彲浠ヤ笉蹇呰繃鍒嗗己璋冨厛浠涔堝悗浠涔堬紝閲嶈鐨勬槸楂樻晥鍜屾劅瑙夎垝閫傘備粠鑰佺撼鐨勭粡楠屾潵鐪嬶紝鍏堢紪鍐欎駭鍝佸嚱鏁扮殑妗嗘灦錛岀劧鍚庣紪鍐欐祴璇曞嚱鏁幫紝閽堝浜у搧鍑芥暟鐨勫姛鑳界紪鍐欐祴璇曠敤渚嬶紝鐒跺悗緙栧啓浜у搧鍑芥暟鐨勪唬鐮侊紝姣忓啓涓涓姛鑳界偣閮借繍琛屾祴璇曪紝闅忔椂琛ュ厖嫻嬭瘯鐢ㄤ緥銆傛墍璋撳厛緙栧啓浜у搧鍑芥暟鐨勬鏋訛紝鏄寚鍏堢紪鍐欏嚱鏁扮┖鐨勫疄鐜幫紝鏈夎繑鍥炲肩殑闅忎究榪斿洖涓涓鹼紝緙栬瘧閫氳繃鍚庡啀緙栧啓嫻嬭瘯浠g爜錛岃繖鏃訛紝鍑芥暟鍚嶃佸弬鏁拌〃銆佽繑鍥炵被鍨嬮兘搴旇紜畾涓嬫潵浜?jiǎn)锛屾墍緙栧啓鐨勬祴璇曚唬鐮佷互鍚庨渶淇敼鐨勫彲鑳芥ф瘮杈冨皬銆?br>銆銆鐢辮皝嫻嬭瘯錛熷崟鍏冩祴璇曚笌鍏朵粬嫻嬭瘯涓嶅悓錛屽崟鍏冩祴璇曞彲鐪嬩綔鏄紪鐮佸伐浣滅殑涓閮ㄥ垎錛屽簲璇ョ敱紼嬪簭鍛樺畬鎴愶紝涔熷氨鏄錛岀粡榪囦簡(jiǎn)鍗曞厓嫻嬭瘯鐨勪唬鐮佹墠鏄凡瀹屾垚鐨勪唬鐮侊紝鎻愪氦浜у搧浠g爜鏃朵篃瑕佸悓鏃舵彁浜ゆ祴璇曚唬鐮併傛祴璇曢儴闂ㄥ彲浠ヤ綔涓瀹氱▼搴︾殑瀹℃牳銆?br>銆銆鍏充簬妗╀唬鐮侊紝鑰佺撼璁や負(fù)錛屽崟鍏冩祴璇曞簲閬垮厤緙栧啓妗╀唬鐮併傛々浠g爜灝辨槸鐢ㄦ潵浠f浛鏌愪簺浠g爜鐨勪唬鐮侊紝渚嬪錛屼駭鍝佸嚱鏁版垨嫻嬭瘯鍑芥暟璋冪敤浜?jiǎn)涓涓湭緙栧啓鐨勫嚱鏁幫紝鍙互緙栧啓妗╁嚱鏁版潵浠f浛璇ヨ璋冪敤鐨勫嚱鏁幫紝妗╀唬鐮佷篃鐢ㄤ簬瀹炵幇嫻嬭瘯闅旂銆傞噰鐢ㄧ敱搴曞悜涓婄殑鏂瑰紡榪涜寮鍙戯紝搴曞眰鐨勪唬鐮佸厛寮鍙戝茍鍏堟祴璇曪紝鍙互閬垮厤緙栧啓妗╀唬鐮侊紝榪欐牱鍋氱殑濂藉鏈夛細(xì)鍑忓皯浜?jiǎn)宸ヤ綔閲忓Q涙祴璇曚笂灞傚嚱鏁版椂錛屼篃鏄涓嬪眰鍑芥暟鐨勯棿鎺ユ祴璇曪紱褰撲笅灞傚嚱鏁頒慨鏀規(guī)椂錛岄氳繃鍥炲綊嫻嬭瘯鍙互紜淇敼鏄惁瀵艱嚧涓婂眰鍑芥暟浜х敓閿欒銆?br><br>浜屻嫻嬭瘯浠g爜緙栧啓<br>銆銆澶氭暟璁茶堪鍗曞厓嫻嬭瘯鐨勬枃绔犻兘鏄互Java涓轟緥錛屾湰鏂囦互C++涓轟緥錛屽悗鍗婇儴鍒嗘墍浠嬬粛鐨勫崟鍏冩祴璇曞伐鍏蜂篃鍙粙緇岰++鍗曞厓嫻嬭瘯宸ュ叿銆備笅闈㈢殑紺轟緥浠g爜鐨勫紑鍙戠幆澧冩槸VC6.0銆?br><br>浜у搧綾伙細(xì)<br>class CMyClass <br>{<br>public:<br>       int Add(int i, int j);<br>       CMyClass();<br>       virtual ~CMyClass();<br><br>private:<br>       int mAge;         //騫撮緞<br>       CString mPhase; //騫撮緞闃舵錛屽"灝戝勾"錛?闈掑勾"<br>};<br><br>寤虹珛瀵瑰簲鐨勬祴璇曠被CMyClassTester錛屼負(fù)浜?jiǎn)鑺偩U︾紪騫咃紝鍙垪鍑烘簮鏂囦歡鐨勪唬鐮侊細(xì)<br>void CMyClassTester::CaseBegin()<br>{<br>       //pObj鏄疌MyClassTester綾葷殑鎴愬憳鍙橀噺錛屾槸琚祴璇曠被鐨勫璞$殑鎸囬拡錛?br>       //涓烘眰綆鍗曪紝鎵鏈夌殑嫻嬭瘯綾婚兘鍙互鐢╬Obj鍛藉悕琚祴璇曞璞$殑鎸囬拡銆?br>       pObj = new CMyClass();<br>}<br><br>void CMyClassTester::CaseEnd()<br>{<br>       delete pObj;<br>}<br>嫻嬭瘯綾葷殑鍑芥暟CaseBegin()鍜孋aseEnd()寤虹珛鍜岄攢姣佽嫻嬭瘯瀵硅薄錛屾瘡涓祴璇曠敤渚嬬殑寮澶撮兘瑕佽皟鐢–aseBegin()錛岀粨灝鵑兘瑕佽皟鐢–aseEnd()銆?br><br>鎺ヤ笅鏉ワ紝鎴戜滑寤虹珛紺轟緥鐨勪駭鍝佸嚱鏁幫細(xì)<br>int CMyClass::Add(int i, int j)<br>{<br>       return i+j;<br>}<br>鍜屽搴旂殑嫻嬭瘯鍑芥暟錛?br>void CMyClassTester::Add_int_int()<br>{<br>}<br>鎶婂弬鏁拌〃浣滀負(fù)鍑芥暟鍚嶇殑涓閮ㄥ垎錛岃繖鏍峰綋鍑虹幇閲嶈澆鐨勮嫻嬭瘯鍑芥暟鏃訛紝嫻嬭瘯鍑芥暟涓嶄細(xì)浜х敓鍛藉悕鍐茬獊銆備笅闈㈡坊鍔犳祴璇曠敤渚嬶細(xì)<br>void CMyClassTester::Add_int_int()<br>{<br>       //絎竴涓祴璇曠敤渚?br>       CaseBegin();{                 //1<br>       int i = 0;                   //2<br>       int j = 0;                   //3<br>       int ret = pObj->Add(i, j); //4<br>       ASSERT(ret == 0);             //5<br>       }CaseEnd();                   //6<br>}<br>絎?鍜岀6琛屽緩绔嬪拰閿姣佽嫻嬭瘯瀵硅薄錛屾墍鍔犵殑{}鏄負(fù)浜?jiǎn)璁╂瘡涓獘箣璇曠敤渚嬬殑浠g爜鏈変竴涓嫭绔嬬殑鍩燂紝浠ヤ究澶氫釜嫻嬭瘯鐢ㄤ緥浣跨敤鐩稿悓鐨勫彉閲忓悕銆?br>絎?鍜岀3琛屾槸瀹氫箟杈撳叆鏁版嵁錛岀4琛屾槸璋冪敤琚祴璇曞嚱鏁幫紝榪欎簺瀹規(guī)槗鐞嗚В錛屼笉浣滆繘涓姝ヨВ閲娿傜5琛屾槸棰勬湡杈撳嚭錛屽畠鐨勭壒鐐規(guī)槸褰撳疄闄呰緭鍑轟笌棰勬湡杈撳嚭涓嶅悓鏃惰嚜鍔ㄦ姤閿欙紝ASSERT鏄疺C鐨勬柇璦瀹忥紝涔熷彲浠ヤ嬌鐢ㄥ叾浠栫被浼煎姛鑳界殑瀹忥紝浣跨敤嫻嬭瘯宸ュ叿榪涜鍗曞厓嫻嬭瘯鏃訛紝鍙互浣跨敤璇ュ伐鍏峰畾涔夌殑鏂█瀹忋?br><br>銆銆紺轟緥涓殑鏍煎紡鏄懼緱寰堜笉綆媧侊紝2銆侊紦銆?銆?琛屽彲浠ュ悎鍐欎負(fù)涓琛岋細(xì)ASSERT(pObj->Add(0, 0) == 0);浣嗚繖縐嶄笉綆媧佺殑鏍煎紡鍗存槸鑰佺撼鏋佸姏鎺ㄨ崘鐨勶紝鍥犱負(fù)瀹冧竴鐩簡(jiǎn)鐒?dòng)灱屾槗浜庡缓绔嬪涓獘箣璇曠敤渚嬪Q屽茍涓斿叿鏈夊緢濂界殑閫傚簲鎬э紝鍚屾椂錛屼篃鏄瀬浣崇殑浠g爜鏂囨。錛屾諱箣錛岃佺撼寤鴻錛氳緭鍏ユ暟鎹拰棰勬湡杈撳嚭瑕佽嚜鎴愪竴鍧椼?br>銆銆寤虹珛浜?jiǎn)绗竴涓祴璇曠敤渚嬪悗錛屽簲緙栬瘧騫惰繍琛屾祴璇曪紝浠ユ帓闄よ娉曢敊璇紝鐒跺悗錛屼嬌鐢ㄦ嫹璐?淇敼鐨勫姙娉曞緩绔嬪叾浠栨祴璇曠敤渚嬨傜敱浜庡悇涓祴璇曠敤渚嬩箣闂寸殑宸埆寰寰寰堝皬錛岄氬父鍙渶淇敼涓涓や釜鏁版嵁錛屾嫹璐?淇敼鏄緩绔嬪涓祴璇曠敤渚嬬殑鏈蹇嵎鍔炴硶銆?br><br>涓夈嫻嬭瘯鐢ㄤ緥<br>銆銆涓嬮潰璇磋嫻嬭瘯鐢ㄤ緥銆佽緭鍏ユ暟鎹強(qiáng)棰勬湡杈撳嚭銆傝緭鍏ユ暟鎹槸嫻嬭瘯鐢ㄤ緥鐨勬牳蹇?jī)锛岃佺撼瀵硅緭鍏ユ暟鎹殑瀹氫箟鏄細(xì)琚祴璇曞嚱鏁版墍璇誨彇鐨勫閮ㄦ暟鎹強(qiáng)榪欎簺鏁版嵁鐨勫垵濮嬪箋傚閮ㄦ暟鎹槸瀵逛簬琚祴璇曞嚱鏁版潵璇寸殑錛屽疄闄呬笂灝辨槸闄や簡(jiǎn)灞閮ㄥ彉閲忎互澶栫殑鍏朵粬鏁版嵁錛岃佺撼鎶婅繖浜涙暟鎹垎涓哄嚑綾伙細(xì)鍙傛暟銆佹垚鍛樺彉閲忋佸叏灞鍙橀噺銆両O濯掍綋銆侷O濯掍綋鏄寚鏂囦歡銆佹暟鎹簱鎴栧叾浠栧偍瀛樻垨浼犺緭鏁版嵁鐨勫獟浣擄紝渚嬪錛岃嫻嬭瘯鍑芥暟瑕佷粠鏂囦歡鎴栨暟鎹簱璇誨彇鏁版嵁錛岄偅涔堬紝鏂囦歡鎴栨暟鎹簱涓殑鍘熷鏁版嵁涔熷睘浜庤緭鍏ユ暟鎹備竴涓嚱鏁版棤璁哄澶嶆潅錛岄兘鏃犻潪鏄榪欏嚑綾繪暟鎹殑璇誨彇銆佽綆楀拰鍐欏叆銆傞鏈熻緭鍑烘槸鎸囷細(xì)榪斿洖鍊煎強(qiáng)琚祴璇曞嚱鏁版墍鍐欏叆鐨勫閮ㄦ暟鎹殑緇撴灉鍊箋傝繑鍥炲煎氨涓嶇敤璇翠簡(jiǎn)錛岃嫻嬭瘯鍑芥暟榪涜浜?jiǎn)鍐欐搷浣滅殑鍙傛?杈撳嚭鍙傛暟)銆佹垚鍛樺彉閲忋佸叏灞鍙橀噺銆両O濯掍綋錛屽畠浠殑棰勬湡鐨勭粨鏋滃奸兘鏄鏈熻緭鍑恒備竴涓祴璇曠敤渚嬶紝灝辨槸璁懼畾杈撳叆鏁版嵁錛岃繍琛岃嫻嬭瘯鍑芥暟錛岀劧鍚庡垽鏂疄闄呰緭鍑烘槸鍚︾鍚堥鏈熴備笅闈婦涓涓笌鎴愬憳鍙橀噺鏈夊叧鐨勪緥瀛愶細(xì)<br>浜у搧鍑芥暟錛?br>void CMyClass::Grow(int years)<br>{<br>       mAge += years;<br><br>       if(mAge < 10)<br>           mPhase = "鍎跨";<br>       else if(mAge <20)<br>           mPhase = "灝戝勾";<br>       else if(mAge <45)<br>           mPhase = "闈掑勾";<br>       else if(mAge <60)<br>           mPhase = "涓勾";<br>       else<br>           mPhase = "鑰佸勾";<br>}<br><br>嫻嬭瘯鍑芥暟涓殑涓涓祴璇曠敤渚嬶細(xì)<br>       CaseBegin();{<br>       int years = 1;<br>       pObj->mAge = 8;<br>       pObj->Grow(years);<br>       ASSERT( pObj->mAge == 9 );<br>       ASSERT( pObj->mPhase == "鍎跨" );<br>       }CaseEnd();<br>鍦ㄨ緭鍏ユ暟鎹腑瀵硅嫻嬭瘯綾葷殑鎴愬憳鍙橀噺mAge榪涜璧嬪鹼紝鍦ㄩ鏈熻緭鍑轟腑鏂█鎴愬憳鍙橀噺鐨勫箋傜幇鍦ㄥ彲浠ョ湅鍒拌佺撼鎵鎺ㄨ崘鐨勬牸寮忕殑濂藉浜?jiǎn)鍚уQ岃繖縐嶆牸寮忓彲浠ラ傚簲寰堝鏉傜殑嫻嬭瘯銆傚湪杈撳叆鏁版嵁閮ㄥ垎榪樺彲浠ヨ皟鐢ㄥ叾浠栨垚鍛樺嚱鏁幫紝渚嬪錛氭墽琛岃嫻嬭瘯鍑芥暟鍓嶅彲鑳介渶瑕佽鍙栨枃浠朵腑鐨勬暟鎹繚瀛樺埌鎴愬憳鍙橀噺錛屾垨闇瑕佽繛鎺ユ暟鎹簱錛岃佺撼鎶婅繖浜涙搷浣滅О涓哄垵濮嬪寲鎿嶄綔銆備緥濡傦紝涓婁緥涓?ASSERT( ...)涔嬪墠鍙互鍔爌Obj->OpenFile();銆備負(fù)浜?jiǎn)璁块棶绉佹湁鎴愬憳锛屽彲浠畣娴嬭瘯绫诲畾涔変皋Z駭鍝佺被鐨勫弸鍏冪被銆備緥濡傦紝瀹氫箟涓涓畯錛?br>#define UNIT_TEST(cls) friend class cls##Tester;<br>鐒跺悗鍦ㄤ駭鍝佺被澹版槑涓姞涓琛屼唬鐮侊細(xì)UNIT_TEST(ClassName)銆?br><br>銆銆涓嬮潰璋堣皥嫻嬭瘯鐢ㄤ緥璁捐銆傚墠闈㈠凡緇忚浜?jiǎn)锛寢箣璇曠敤渚嬬殑鏍稿績(jī)鏄緭鍏ユ暟鎹傞鏈熻緭鍑烘槸渚濇嵁杈撳叆鏁版嵁鍜岀▼搴忓姛鑳芥潵紜畾鐨勶紝涔熷氨鏄錛屽浜庢煇涓紼嬪簭錛岃緭鍏ユ暟鎹‘瀹氫簡(jiǎn)錛岄鏈熻緭鍑轟篃灝卞彲浠ョ‘瀹氫簡(jiǎn)錛岃嚦浜庣敓鎴?閿姣佽嫻嬭瘯瀵硅薄鍜岃繍琛屾祴璇曠殑璇彞錛屾槸鎵鏈夋祴璇曠敤渚嬮兘澶у悓灝忓紓鐨勶紝鍥犳錛屾垜浠璁烘祴璇曠敤渚嬫椂錛屽彧璁ㄨ杈撳叆鏁版嵁銆?br>銆銆鍓嶉潰璇磋繃錛岃緭鍏ユ暟鎹寘鎷洓綾伙細(xì)鍙傛暟銆佹垚鍛樺彉閲忋佸叏灞鍙橀噺銆両O濯掍綋錛岃繖鍥涚被鏁版嵁涓紝鍙鎵嫻嬭瘯鐨勭▼搴忛渶瑕佹墽琛岃鎿嶄綔鐨勶紝灝辮璁懼畾鍏跺垵濮嬪鹼紝鍏朵腑錛屽墠涓ょ被姣旇緝甯哥敤錛屽悗涓ょ被杈冨皯鐢ㄣ傛樉鐒?dòng)灱屾妸杈撳叆鏁版嵁鐨勬墍鏈夊彲鑳藉彇鍊奸兘榪涜嫻嬭瘯錛屾槸涓嶅彲鑳戒篃鏄棤鎰忎箟鐨勶紝鎴戜滑搴旇鐢ㄤ竴瀹氱殑瑙勫垯閫夋嫨鏈変唬琛ㄦх殑鏁版嵁浣滀負(fù)杈撳叆鏁版嵁錛屼富瑕佹湁涓夌錛氭甯歌緭鍏ワ紝杈圭晫杈撳叆錛岄潪娉曡緭鍏ワ紝姣忕杈撳叆榪樺彲浠ュ垎綾伙紝涔熷氨鏄鉤甯歌鐨勭瓑浠風(fēng)被娉曪紝姣忕被鍙栦竴涓暟鎹綔涓鴻緭鍏ユ暟鎹紝濡傛灉嫻嬭瘯閫氳繃錛屽彲浠ヨ偗瀹氬悓綾葷殑鍏朵粬杈撳叆涔熸槸鍙互閫氳繃鐨勩備笅闈婦渚嬭鏄庯細(xì) <br>銆銆姝e父杈撳叆<br>銆銆渚嬪瀛楃涓茬殑Trim鍑芥暟錛屽姛鑳芥槸灝嗗瓧絎︿覆鍓嶅悗鐨勭┖鏍煎幓闄わ紝閭d箞姝e父鐨勮緭鍏ュ彲浠ユ湁鍥涚被錛氬墠闈㈡湁絀烘牸錛涘悗闈㈡湁絀烘牸錛涘墠鍚庡潎鏈夌┖鏍鹼紱鍓嶅悗鍧囨棤絀烘牸銆?br>銆銆杈圭晫杈撳叆<br>銆銆涓婁緥涓┖瀛楃涓插彲浠ョ湅浣滄槸杈圭晫杈撳叆銆?br>銆銆鍐嶅涓涓〃紺哄勾榫勭殑鍙傛暟錛屽畠鐨勬湁鏁堣寖鍥存槸0-100錛岄偅涔堣竟鐣岃緭鍏ユ湁涓や釜錛?鍜?00銆?br>銆銆闈炴硶杈撳叆<br>銆銆闈炴硶杈撳叆鏄甯稿彇鍊艱寖鍥翠互澶栫殑鏁版嵁錛屾垨浣夸唬鐮佷笉鑳藉畬鎴愭甯稿姛鑳界殑杈撳叆錛屽涓婁緥涓〃紺哄勾榫勭殑鍙傛暟錛屽皬浜?鎴栧ぇ浜?00閮芥槸闈炴硶杈撳叆錛屽啀濡備竴涓繘琛屾枃浠舵搷浣滅殑鍑芥暟錛岄潪娉曡緭鍏ユ湁榪欎箞鍑犵被錛氭枃浠朵笉瀛樺湪錛涚洰褰曚笉瀛樺湪錛涙枃浠舵鍦ㄨ鍏朵粬紼嬪簭鎵撳紑錛涙潈闄愰敊璇?br>銆銆濡傛灉鍑芥暟浣跨敤浜?jiǎn)澶栭儴鏁版嵁锛屽垯姝e父杈撳叆鏄偗瀹氫細(xì)鏈夌殑锛岃岃竟鐣岃緭鍏ュ拰闈炴硶杈撳叆涓嶆槸鎵鏈夊嚱鏁伴兘鏈夈備竴鑸儏鍐典笅錛屽嵆浣挎病鏈夎璁℃枃妗o紝鑰冭檻浠ヤ笂涓夌杈撳叆涔熷彲浠ユ壘鍑哄嚱鏁扮殑鍩烘湰鍔熻兘鐐廣傚疄闄呬笂錛屽崟鍏冩祴璇曚笌浠g爜緙栧啓鏄?#8220;涓浣撲袱闈?#8221;鐨勫叧緋伙紝緙栫爜鏃跺涓婅堪涓夌杈撳叆閮芥槸蹇呴』鑰冭檻鐨勶紝鍚﹀垯浠g爜鐨勫仴澹у氨浼?xì)鎴愰棶棰樸?br><br>鍥涖鐧界洅瑕嗙洊<br>銆銆涓婇潰鎵璇寸殑嫻嬭瘯鏁版嵁閮芥槸閽堝紼嬪簭鐨勫姛鑳芥潵璁捐鐨勶紝灝辨槸鎵璋撶殑榛戠洅嫻嬭瘯銆傚崟鍏冩祴璇曡繕闇瑕佷粠鍙︿竴涓搴︽潵璁捐嫻嬭瘯鏁版嵁錛屽嵆閽堝紼嬪簭鐨勯昏緫緇撴瀯鏉ヨ璁℃祴璇曠敤渚嬶紝灝辨槸鎵璋撶殑鐧界洅嫻嬭瘯銆傚湪鑰佺撼鐪嬫潵錛屽鏋滈粦鐩掓祴璇曟槸瓚沖鍏呭垎鐨勶紝閭d箞鐧界洅嫻嬭瘯灝辨病鏈夊繀瑕侊紝鍙儨“瓚沖鍏呭垎”鍙槸涓縐嶇悊鎯崇姸鎬侊紝渚嬪錛氱湡鐨勬槸鎵鏈夊姛鑳界偣閮芥祴璇曚簡(jiǎn)鍚楋紵紼嬪簭鐨勫姛鑳界偣鏄漢涓虹殑瀹氫箟錛屽父甯告槸涓嶅叏闈㈢殑錛涘悇涓緭鍏ユ暟鎹箣闂達(dá)紝鏈変簺緇勫悎鍙兘浼?xì)漶旂敓闂锛屾庢牱淇濊瘉榪欎簺緇勫悎閮界粡榪囦簡(jiǎn)嫻嬭瘯錛熼毦浜庤 閲忔祴璇曠殑瀹屾暣鎬ф槸榛戠洅嫻嬭瘯鐨勪富瑕佺己闄鳳紝鑰岀櫧鐩掓祴璇曟伆鎭板叿鏈夋槗浜庤 閲忔祴璇曞畬鏁存х殑浼樼偣錛屼袱鑰呬箣闂村叿鏈夋瀬濂界殑浜掕ˉ鎬э紝渚嬪錛氬畬鎴愬姛鑳芥祴璇曞悗緇熻璇彞瑕嗙洊鐜囷紝濡傛灉璇彞瑕嗙洊鏈畬鎴愶紝寰堝彲鑳芥槸鏈鐩栫殑璇彞鎵瀵瑰簲鐨勫姛鑳界偣鏈祴璇曘?br>銆銆鐧界洅嫻嬭瘯閽堝紼嬪簭鐨勯昏緫緇撴瀯璁捐嫻嬭瘯鐢ㄤ緥錛岀敤閫昏緫瑕嗙洊鐜囨潵琛¢噺嫻嬭瘯鐨勫畬鏁存с傞昏緫鍗曚綅涓昏鏈夛細(xì)璇彞銆佸垎鏀佹潯浠躲佹潯浠跺箋佹潯浠跺肩粍鍚堬紝璺緞銆傝鍙ヨ鐩栧氨鏄鐩栨墍鏈夌殑璇彞錛屽叾浠栫被鎺ㄣ傚彟澶栬繕鏈変竴縐嶅垽瀹氭潯浠惰鐩栵紝鍏跺疄鏄垎鏀鐩栦笌鏉′歡瑕嗙洊鐨勭粍鍚堬紝鍦ㄦ涓嶄綔璁ㄨ銆傝窡鏉′歡鏈夊叧鐨勮鐩栧氨鏈変笁縐嶏紝瑙i噴涓涓嬶細(xì)鏉′歡瑕嗙洊鏄寚瑕嗙洊鎵鏈夌殑鏉′歡琛ㄨ揪寮忥紝鍗蟲墍鏈夌殑鏉′歡琛ㄨ揪寮忛兘鑷沖皯璁$畻涓嬈★紝涓嶈冭檻璁$畻緇撴灉錛涙潯浠跺艱鐩栨槸鎸囪鐩栨潯浠剁殑鎵鏈夊彲鑳藉彇鍊鹼紝鍗蟲瘡涓潯浠剁殑鍙栫湡鍊煎拰鍙栧亣鍊奸兘瑕佽嚦灝戣綆椾竴嬈★紱鏉′歡鍊肩粍鍚堣鐩栨槸鎸囪鐩栨墍鏈夋潯浠跺彇鍊肩殑鎵鏈夊彲鑳界粍鍚堛傝佺撼鍋氳繃涓浜涚矖嫻呯殑鐮旂┒錛屽彂鐜頒笌鏉′歡鐩存帴鏈夊叧鐨勯敊璇富瑕佹槸閫昏緫鎿嶄綔絎﹂敊璇紝渚嬪錛殀|鍐欐垚&&錛屾紡浜?jiǎn)鍐?浠涔堢殑錛岄噰鐢ㄥ垎鏀鐩栦笌鏉′歡瑕嗙洊鐨勭粍鍚堬紝鍩烘湰涓婂彲浠ュ彂鐜拌繖浜涢敊璇紝鍙︿竴鏂歸潰錛屾潯浠跺艱鐩栦笌鏉′歡鍊肩粍鍚堣鐩栧線寰闇瑕佸ぇ閲忕殑嫻嬭瘯鐢ㄤ緥錛屽洜姝わ紝鍦ㄨ佺撼鐪嬫潵錛屾潯浠跺艱鐩栧拰鏉′歡鍊肩粍鍚堣鐩栫殑鏁堣垂姣斿亸浣庛傝佺撼璁や負(fù)鏁堣垂姣旇緝楂樹笖瀹屾暣鎬т篃瓚沖鐨勬祴璇曡姹傛槸榪欐牱鐨勶細(xì)瀹屾垚鍔熻兘嫻嬭瘯錛屽畬鎴愯鍙ヨ鐩栥佹潯浠惰鐩栥佸垎鏀鐩栥佽礬寰勮鐩栥傚仛榪囧崟鍏冩祴璇曠殑鏈嬪弸鎭愭曚細(xì)瀵硅佺撼鎻愬嚭鐨勬祴璇曡姹傜粰浜堜竴涓瓧鐨勮瘎浠鳳細(xì)鏅曪紒鎴栬呬袱涓瓧鐨勮瘎浠鳳細(xì)鐙傛檿錛佸洜涓鴻繖浼間箮鏄笉鍙兘鐨勮姹傦紝瑕佽揪鍒拌繖縐嶆祴璇曞畬鏁存э紝鍏舵祴璇曟垚鏈槸涓嶅彲鎯寵薄鐨勶紝涓嶈繃錛屽嚭瀹朵漢涓嶆墦閫涜錛岃佺撼涔嬫墍浠ユ彁鍑鴻繖縐嶆祴璇曡姹傦紝鏄洜涓哄埄鐢ㄤ竴浜涘伐鍏鳳紝鍙互鍦ㄨ緝浣庣殑鎴愭湰涓嬭揪鍒拌繖縐嶆祴璇曡姹傦紝鍚庨潰灝嗕細(xì)浣滆繘涓姝ヤ粙緇嶃?br>銆銆鍏充簬鐧界洅嫻嬭瘯鐢ㄤ緥鐨勮璁★紝紼嬪簭嫻嬭瘯棰嗗煙鐨勪功綾嶄竴鑸兘鏈夎榪幫紝鏅氭柟娉曟槸鐢誨嚭紼嬪簭鐨勯昏緫緇撴瀯鍥懼紼嬪簭嫻佺▼鍥炬垨鎺у埗嫻佸浘錛屾牴鎹昏緫緇撴瀯鍥捐璁℃祴璇曠敤渚嬶紝榪欎簺鏄函綺圭殑鐧界洅嫻嬭瘯錛屼笉鏄佺撼鎯蟲帹鑽愮殑鏂瑰紡銆傝佺撼鎵鎺ㄨ崘鐨勬柟娉曟槸錛氬厛瀹屾垚榛戠洅嫻嬭瘯錛岀劧鍚庣粺璁$櫧鐩掕鐩栫巼錛岄拡瀵規(guī)湭瑕嗙洊鐨勯昏緫鍗曚綅璁捐嫻嬭瘯鐢ㄤ緥瑕嗙洊瀹冿紝渚嬪錛屽厛媯(gè)鏌ユ槸鍚︽湁璇彞鏈鐩栵紝鏈夌殑璇濊璁℃祴璇曠敤渚嬭鐩栧畠錛岀劧鍚庣敤鍚屾牱鏂規(guī)硶瀹屾垚鏉′歡瑕嗙洊銆佸垎鏀鐩栧拰璺緞瑕嗙洊錛岃繖鏍風(fēng)殑璇濓紝鏃㈡楠屼簡(jiǎn)榛戠洅嫻嬭瘯鐨勫畬鏁存э紝鍙堥伩鍏嶄簡(jiǎn)閲嶅鐨勫伐浣滐紝鐢ㄨ緝?yōu)畱鐨勬棄櫁存垚鏈緫謭伴潪甯搁珮鐨剫箣璇曞畬鏁存с備笉榪囷紝榪欎簺宸ヤ綔鍙笉鏄墜宸ヨ兘瀹屾垚鐨勶紝蹇呴』鍊熷姪浜庡伐鍏鳳紝鍚庨潰浼?xì)浠嬀l嶅彲浠ュ畬鎴愯繖浜涘伐浣滅殑嫻嬭瘯宸ュ叿銆?br><br>浜斻鍗曞厓嫻嬭瘯宸ュ叿<br>銆銆鐜板湪寮濮嬩粙緇嶅崟鍏冩祴璇曞伐鍏鳳紝鑰佺撼鍙粙緇嶄笁縐嶏紝閮芥槸鐢ㄤ簬C++璇█鐨勩?br>銆銆棣栧厛鏄疌ppUnit錛岃繖鏄疌++鍗曞厓嫻嬭瘯宸ュ叿鐨勯薊紲栵紝鍏嶈垂鐨勫紑婧愮殑鍗曞厓嫻嬭瘯妗嗘灦銆傜敱浜庡凡鏈変竴浼楅珮浜哄啓浜?jiǎn)涓崬畱鍏充簬CppUnit鐨勫緢濂界殑鏂囩珷錛岃佺撼灝變笉鐜頒笐浜?jiǎn)锛屾兂浜?jiǎn)瑙ppUnit鐨勬湅鍙嬶紝寤鴻璇諱竴涓婥pluser 鎵浣滅殑銆奀ppUnit嫻嬭瘯妗嗘灦鍏ラ棬銆嬶紝緗戝潃鏄細(xì)</font><a target=_blank><font color=#003366 size=2><u>http://blog.csdn.net/cpluser/archive/2004/09/21/111522.aspx</u></font></a><font size=2>銆傝鏂囦篃鎻愪緵浜?jiǎn)CppUnit鐨勪笅杞藉湴鍧銆?br>銆銆鐒跺悗浠嬬粛C++Test錛岃繖鏄疨arasoft鍏徃鐨勪駭鍝併傦薊C++Test鏄竴涓姛鑳藉己澶х殑鑷姩鍖朇/C++鍗曞厓綰ф祴璇曞伐鍏鳳紝鍙互鑷姩嫻嬭瘯浠諱綍C/C++鍑芥暟銆佺被錛岃嚜鍔ㄧ敓鎴愭祴璇曠敤渚嬨佹祴璇曢┍鍔ㄥ嚱鏁版垨妗╁嚱鏁幫紝鍦ㄨ嚜鍔ㄥ寲鐨勭幆澧冧笅鏋佸叾瀹規(guī)槗蹇熺殑灝嗗崟鍏冪駭鐨勬祴璇曡鐩栫巼杈懼埌100%銆?/font><font size=2>榪欐槸鍗庡攼鍏徃鐨勭綉欏典笂鐨勪粙緇嶃傝佺撼鎯沖啓浜涗粙緇岰++Test鐨勬枃瀛楋紝浣嗗彂鐜版棤娉曡秴瓚婂崕鍞愬叕鍙哥殑緗戦〉涓婄殑浠嬬粛錛屾墍浠ヤ篃灝辯渷鐐逛簨浜?jiǎn)锛屾兂浜?jiǎn)瑙++Test鐨勬湅鍙嬶紝寤鴻璁塊棶璇ュ叕鍙哥殑緗戠珯銆傚崕鍞愬叕鍙鎬唬鐞咰++Test錛屾兂瑕佽喘涔版垨绱㈠彇鎶ヤ環(huán)銆佽瘯鐢ㄧ増閮藉彲浠ユ壘浠栦滑銆傝佺撼甯崕鍞愬叕鍙稿仛騫垮憡錛屼笉鐭ラ亾浼?xì)涓嶄細(xì)寰楃偣浠涔堝ソ澶勶紵<br>銆銆鏈鍚庝粙緇峍isual Unit錛岀畝縐癡U錛岃繖鏄浗浜х殑鍗曞厓嫻嬭瘯宸ュ叿錛屾嵁璇寸敵璇蜂簡(jiǎn)澶氶」涓撳埄錛屾嫢鏈変竴鎵瑰垱鏂扮殑鎶鏈紝涓嶈繃鑰佺撼鍙叧蹇?jī)鏄笉鏄湁鐢ㄥ拰濂界敤銆傦薊鑷姩鐢熸垚嫻嬭瘯浠g爜 蹇熷緩绔嬪姛鑳芥祴璇曠敤渚?紼嬪簭琛屼負(fù)涓鐩簡(jiǎn)鐒?鏋侀珮鐨勬祴璇曞畬鏁存?楂樻晥瀹屾垚鐧界洅瑕嗙洊 蹇熸帓閿?楂樻晥璋冭瘯 璇﹀敖鐨勬祴璇曟姤鍛婏冀銆傦薊錛藉唴鐨勬枃瀛楁槸VU寮鍙戝晢鐨勭綉欏典笂鎽樺綍鐨勶紝緗戝潃鏄細(xì)</font><a target=_blank><font color=#003366 size=2><u>http://www.unitware.cn</u></font></a><font size=2>銆傚墠闈㈡墍榪版祴璇曡姹傦細(xì)瀹屾垚鍔熻兘嫻嬭瘯錛屽畬鎴愯鍙ヨ鐩栥佹潯浠惰鐩栥佸垎鏀鐩栥佽礬寰勮鐩栵紝鐢╒U鍙互杞繪澗瀹炵幇錛岃繕鏈変竴鐐瑰煎緱涓鎻愶細(xì)浣跨敤VU榪樿兘鎻愰珮緙栫爜鐨勬晥鐜囷紝鎬諱綋鏉ヨ錛屽湪瀹屾垚鍗曞厓嫻嬭瘯鐨勫悓鏃訛紝緙栫爜璋冭瘯鐨勬椂闂磋繕鑳藉ぇ騫呭害緙╃煭銆傜畻浜?jiǎn)锛屼笉鎯冲啀璁蹭簡(jiǎn)锛岃佺撼鏄炬憜鐞嗚銆佷粙緇嶇粡楠岃繕鏄湁鍏磋叮鐨勶紝鍥犱負(fù)鍙互婊¤凍鑰佺撼濂戒負(fù)浜哄笀鐨勮櫄鑽e績(jī)錛屼絾浠嬬粛宸ュ叿灝辮寰楃儲(chǔ)鐒舵棤鍛充簡(jiǎn)錛屾瘯绔熷伐鍏峰ソ涓嶅ソ鐢紝鍚堜笉鍚堢敤錛岃璇曡繃鎵嶇煡閬擄紝榪樻槸鑷繁鍘誨紑鍙戝晢鐨勭綉绔欑湅鍚э紝鍙互涓嬭澆婕旂ず鐗堬紝榪樻湁婕旂ず璇句歡銆?/font></span></p> <p><span style="FONT-SIZE: 12px"><font size=2>杞嚜錛?/font><a ><font color=#0000ff size=2><u>http://www.cnblogs.com/tester2test/archive/2006/08/04/467764.html</u></font></a></span></p> </font></span></span> <img src ="http://m.shnenglu.com/shuiyuan2004/aggbug/30851.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://m.shnenglu.com/shuiyuan2004/" target="_blank">涓嶅?/a> 2007-08-26 14:33 <a href="http://m.shnenglu.com/shuiyuan2004/archive/2007/08/26/30851.html#Feedback" target="_blank" style="text-decoration:none;">鍙戣〃璇勮</a></div>]]></description></item></channel></rss> <a href="http://m.shnenglu.com/">青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品</a> <div style="position:fixed;left:-9000px;top:-9000px;"><font id="pjuwb"></font><button id="pjuwb"><pre id="pjuwb"></pre></button><sub id="pjuwb"></sub><tbody id="pjuwb"><var id="pjuwb"><address id="pjuwb"></address></var></tbody><listing id="pjuwb"><label id="pjuwb"><strong id="pjuwb"></strong></label></listing><wbr id="pjuwb"><small id="pjuwb"><tbody id="pjuwb"></tbody></small></wbr><ins id="pjuwb"><xmp id="pjuwb"></xmp></ins><style id="pjuwb"></style><label id="pjuwb"><em id="pjuwb"><li id="pjuwb"></li></em></label><samp id="pjuwb"></samp><menu id="pjuwb"><input id="pjuwb"></input></menu><pre id="pjuwb"><tbody id="pjuwb"><tfoot id="pjuwb"><button id="pjuwb"></button></tfoot></tbody></pre><form id="pjuwb"></form><i id="pjuwb"><style id="pjuwb"><label id="pjuwb"><sup id="pjuwb"></sup></label></style></i><li id="pjuwb"><table id="pjuwb"><abbr id="pjuwb"></abbr></table></li><video id="pjuwb"></video><dfn id="pjuwb"></dfn><progress id="pjuwb"></progress><strong id="pjuwb"></strong><mark id="pjuwb"></mark><em id="pjuwb"></em><tbody id="pjuwb"><p id="pjuwb"><strike id="pjuwb"><acronym id="pjuwb"></acronym></strike></p></tbody><option id="pjuwb"></option><strike id="pjuwb"></strike><u id="pjuwb"></u><td id="pjuwb"><center id="pjuwb"><tr id="pjuwb"></tr></center></td><em id="pjuwb"><mark id="pjuwb"><em id="pjuwb"><tt id="pjuwb"></tt></em></mark></em><strong id="pjuwb"></strong><wbr id="pjuwb"></wbr><s id="pjuwb"></s><strong id="pjuwb"></strong><legend id="pjuwb"></legend><nav id="pjuwb"></nav><dl id="pjuwb"><th id="pjuwb"><dl id="pjuwb"></dl></th></dl><noframes id="pjuwb"><ins id="pjuwb"></ins></noframes><font id="pjuwb"></font><strike id="pjuwb"><i id="pjuwb"><style id="pjuwb"><label id="pjuwb"></label></style></i></strike><output id="pjuwb"></output><thead id="pjuwb"><pre id="pjuwb"></pre></thead><source id="pjuwb"></source><menuitem id="pjuwb"><wbr id="pjuwb"></wbr></menuitem><pre id="pjuwb"><span id="pjuwb"><pre id="pjuwb"><big id="pjuwb"></big></pre></span></pre><cite id="pjuwb"><fieldset id="pjuwb"><s id="pjuwb"><rt id="pjuwb"></rt></s></fieldset></cite><big id="pjuwb"><progress id="pjuwb"><big id="pjuwb"></big></progress></big><samp id="pjuwb"><delect id="pjuwb"></delect></samp><dl id="pjuwb"></dl><strike id="pjuwb"><nav id="pjuwb"><dl id="pjuwb"><strong id="pjuwb"></strong></dl></nav></strike><tbody id="pjuwb"><b id="pjuwb"><optgroup id="pjuwb"><rp id="pjuwb"></rp></optgroup></b></tbody><em id="pjuwb"></em><xmp id="pjuwb"><blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote></xmp> <i id="pjuwb"><abbr id="pjuwb"><i id="pjuwb"><abbr id="pjuwb"></abbr></i></abbr></i><center id="pjuwb"><acronym id="pjuwb"><center id="pjuwb"></center></acronym></center><pre id="pjuwb"></pre><ul id="pjuwb"><thead id="pjuwb"></thead></ul><blockquote id="pjuwb"><pre id="pjuwb"><sup id="pjuwb"></sup></pre></blockquote><acronym id="pjuwb"></acronym><big id="pjuwb"><s id="pjuwb"></s></big><th id="pjuwb"></th><th id="pjuwb"></th><tbody id="pjuwb"></tbody><thead id="pjuwb"><strike id="pjuwb"></strike></thead><th id="pjuwb"><dl id="pjuwb"><wbr id="pjuwb"></wbr></dl></th><dl id="pjuwb"><strong id="pjuwb"></strong></dl><abbr id="pjuwb"><noframes id="pjuwb"><noscript id="pjuwb"></noscript></noframes></abbr><td id="pjuwb"><ol id="pjuwb"></ol></td><li id="pjuwb"><noscript id="pjuwb"><abbr id="pjuwb"></abbr></noscript></li><small id="pjuwb"><bdo id="pjuwb"><nav id="pjuwb"></nav></bdo></small><style id="pjuwb"></style><optgroup id="pjuwb"><table id="pjuwb"></table></optgroup><center id="pjuwb"><tr id="pjuwb"><dfn id="pjuwb"></dfn></tr></center><th id="pjuwb"></th><u id="pjuwb"></u><tfoot id="pjuwb"><legend id="pjuwb"><i id="pjuwb"></i></legend></tfoot><mark id="pjuwb"></mark><meter id="pjuwb"></meter><nav id="pjuwb"></nav><acronym id="pjuwb"><pre id="pjuwb"><acronym id="pjuwb"><ul id="pjuwb"></ul></acronym></pre></acronym><acronym id="pjuwb"><pre id="pjuwb"><acronym id="pjuwb"><ul id="pjuwb"></ul></acronym></pre></acronym><nobr id="pjuwb"></nobr><sub id="pjuwb"><th id="pjuwb"><menuitem id="pjuwb"><wbr id="pjuwb"></wbr></menuitem></th></sub><thead id="pjuwb"><sub id="pjuwb"></sub></thead><ul id="pjuwb"><address id="pjuwb"><menuitem id="pjuwb"><meter id="pjuwb"></meter></menuitem></address></ul><dfn id="pjuwb"></dfn><pre id="pjuwb"></pre><input id="pjuwb"><cite id="pjuwb"><fieldset id="pjuwb"></fieldset></cite></input><u id="pjuwb"><form id="pjuwb"><u id="pjuwb"></u></form></u><kbd id="pjuwb"><em id="pjuwb"><mark id="pjuwb"></mark></em></kbd><tr id="pjuwb"></tr><del id="pjuwb"><form id="pjuwb"><address id="pjuwb"></address></form></del><tfoot id="pjuwb"><legend id="pjuwb"><ol id="pjuwb"><dl id="pjuwb"></dl></ol></legend></tfoot><menu id="pjuwb"><nobr id="pjuwb"><th id="pjuwb"><nobr id="pjuwb"></nobr></th></nobr></menu><fieldset id="pjuwb"></fieldset><pre id="pjuwb"><blockquote id="pjuwb"><samp id="pjuwb"></samp></blockquote></pre><xmp id="pjuwb"><sup id="pjuwb"><pre id="pjuwb"></pre></sup></xmp><span id="pjuwb"><progress id="pjuwb"></progress></span><font id="pjuwb"></font><var id="pjuwb"><abbr id="pjuwb"></abbr></var><strong id="pjuwb"><label id="pjuwb"><i id="pjuwb"><legend id="pjuwb"></legend></i></label></strong><tr id="pjuwb"><em id="pjuwb"><em id="pjuwb"><output id="pjuwb"></output></em></em></tr><thead id="pjuwb"><strike id="pjuwb"></strike></thead> <acronym id="pjuwb"></acronym><i id="pjuwb"></i><tt id="pjuwb"></tt><rt id="pjuwb"><source id="pjuwb"><rt id="pjuwb"></rt></source></rt><strike id="pjuwb"><acronym id="pjuwb"></acronym></strike><del id="pjuwb"></del><font id="pjuwb"><output id="pjuwb"><ins id="pjuwb"><output id="pjuwb"></output></ins></output></font><kbd id="pjuwb"><tr id="pjuwb"><kbd id="pjuwb"></kbd></tr></kbd><pre id="pjuwb"><sup id="pjuwb"><delect id="pjuwb"><samp id="pjuwb"></samp></delect></sup></pre><samp id="pjuwb"></samp><track id="pjuwb"></track><tr id="pjuwb"></tr><center id="pjuwb"></center><fieldset id="pjuwb"></fieldset><i id="pjuwb"></i><td id="pjuwb"></td><rt id="pjuwb"></rt><object id="pjuwb"></object><pre id="pjuwb"><progress id="pjuwb"><sub id="pjuwb"><thead id="pjuwb"></thead></sub></progress></pre><kbd id="pjuwb"><tr id="pjuwb"><option id="pjuwb"></option></tr></kbd><output id="pjuwb"><ins id="pjuwb"></ins></output><ol id="pjuwb"></ol><source id="pjuwb"></source><strong id="pjuwb"></strong><ruby id="pjuwb"></ruby><sub id="pjuwb"><meter id="pjuwb"><menuitem id="pjuwb"><meter id="pjuwb"></meter></menuitem></meter></sub><pre id="pjuwb"></pre><center id="pjuwb"></center><tr id="pjuwb"><tbody id="pjuwb"><xmp id="pjuwb"><dd id="pjuwb"></dd></xmp></tbody></tr><video id="pjuwb"></video><pre id="pjuwb"></pre><form id="pjuwb"><optgroup id="pjuwb"></optgroup></form><samp id="pjuwb"></samp><kbd id="pjuwb"></kbd><strong id="pjuwb"><option id="pjuwb"></option></strong><object id="pjuwb"></object><abbr id="pjuwb"><noframes id="pjuwb"><abbr id="pjuwb"></abbr></noframes></abbr><ul id="pjuwb"><del id="pjuwb"><button id="pjuwb"><pre id="pjuwb"></pre></button></del></ul><abbr id="pjuwb"></abbr><strong id="pjuwb"><code id="pjuwb"><strong id="pjuwb"></strong></code></strong><option id="pjuwb"></option><optgroup id="pjuwb"><bdo id="pjuwb"><code id="pjuwb"></code></bdo></optgroup><mark id="pjuwb"><em id="pjuwb"><font id="pjuwb"></font></em></mark><acronym id="pjuwb"><code id="pjuwb"></code></acronym><dl id="pjuwb"></dl><em id="pjuwb"></em><object id="pjuwb"><input id="pjuwb"><object id="pjuwb"></object></input></object><output id="pjuwb"><dd id="pjuwb"></dd></output><option id="pjuwb"><button id="pjuwb"><option id="pjuwb"></option></button></option><small id="pjuwb"></small></div> <a href="http://ibenbio.com" target="_blank">亚洲国产日本</a>| <a href="http://yeyelu888.com" target="_blank">欧美在线你懂的</a>| <a href="http://dfrllaser.com" target="_blank">欧美日韩精品在线</a>| <a href="http://4448884.com" target="_blank">欧美高清视频一二三区</a>| <a href="http://725443.com" target="_blank">欧美成人一区二区三区在线观看 </a>| <a href="http://chaxiangmall.com" target="_blank">亚洲欧美国产另类</a>| <a href="http://wwwiqiuxia.com" target="_blank">亚洲一级片在线看</a>| <a href="http://pp88qq.com" target="_blank">亚洲欧美中文字幕</a>| <a href="http://gaysexcube.com" target="_blank">久久久久久久一区二区三区</a>| <a href="http://448968.com" target="_blank">麻豆精品视频在线观看视频</a>| <a href="http://785448.com" target="_blank">欧美国产一区在线</a>| <a href="http://metagasa.com" target="_blank">欧美午夜不卡在线观看免费</a>| <a href="http://niceboybao.com" target="_blank">国产精品久久久久久久久借妻</a>| <a href="http://www-34909.com" target="_blank">国产精品v日韩精品v欧美精品网站</a>| <a href="http://xuanxuan88.com" target="_blank">国产精品久久久久av</a>| <a href="http://cm168168.com" target="_blank">国产日韩成人精品</a>| <a href="http://www89999.com" target="_blank">精品成人久久</a>| <a href="http://www-666638.com" target="_blank">一区二区黄色</a>| <a href="http://qiruiwangluo.com" target="_blank">欧美有码在线视频</a>| <a href="http://080973.com" target="_blank">亚洲国产婷婷综合在线精品 </a>| <a href="http://fc3332.com" target="_blank">一本色道久久综合亚洲精品小说</a>| <a href="http://xmjhyey.com" target="_blank">国产欧美日韩精品专区</a>| <a href="http://xxx6688.com" target="_blank">在线日韩日本国产亚洲</a>| <a href="http://527937.com" target="_blank">亚洲夜间福利</a>| <a href="http://www-442336.com" target="_blank">免费成人av在线</a>| <a href="http://www-333304.com" target="_blank">亚洲精选大片</a>| <a href="http://378682.com" target="_blank">久久久久久久久综合</a>| <a href="http://www777788c.com" target="_blank">欧美日韩极品在线观看一区</a>| <a href="http://cnchtx.com" target="_blank">国产日韩精品一区二区三区</a>| <a href="http://62san.com" target="_blank">亚洲黄色有码视频</a>| <a href="http://888nei.com" target="_blank">欧美亚洲一区二区在线观看</a>| <a href="http://fangxinedu.com" target="_blank">欧美电影在线观看完整版</a>| <a href="http://778km.com" target="_blank">亚洲一区久久久</a>| <a href="http://nn99dd.com" target="_blank">欧美激情中文字幕一区二区</a>| <a href="http://emu160.com" target="_blank">国产欧美三级</a>| <a href="http://win-mdk.com" target="_blank">99riav久久精品riav</a>| <a href="http://842332.com" target="_blank">久久综合久久久久88</a>| <a href="http://1000078.com" target="_blank">99精品国产福利在线观看免费</a>| <a href="http://xiaoyaer.com" target="_blank">久久精品综合</a>| <a href="http://cnm24.com" target="_blank">国产欧美丝祙</a>| <a href="http://xpfuli.com" target="_blank">亚洲欧美日韩中文视频</a>| <a href="http://246767.com" target="_blank">91久久精品日日躁夜夜躁欧美</a>| <a href="http://chaxiangmall.com" target="_blank">欧美亚洲一区二区在线</a>| <a href="http://tao62bao.com" target="_blank">欧美视频一区二区</a>| <a href="http://621768.com" target="_blank">黑人操亚洲美女惩罚</a>| <a href="http://495177.com" target="_blank">一道本一区二区</a>| <a href="http://www92y.com" target="_blank">亚洲欧美久久久</a>| <a href="http://xxdd51.com" target="_blank">亚洲精品久久久久久久久久久久</a>| <a href="http://by21999.com" target="_blank">久久成人av少妇免费</a>| <a href="http://xsxcn.com" target="_blank">国产精品入口夜色视频大尺度 </a>| <a href="http://8013sf.com" target="_blank">午夜精品久久久久久久久</a>| <a href="http://www123720a.com" target="_blank">欧美成人精品在线播放</a>| <a href="http://344230.com" target="_blank">在线精品视频一区二区</a>| <a href="http://www280999.com" target="_blank">久久久久9999亚洲精品</a>| <a href="http://yp8882.com" target="_blank">亚洲欧美美女</a>| <a href="http://www-55125.com" target="_blank">国产精品日韩精品欧美在线 </a>| <a href="http://wwwlywbb.com" target="_blank">国内激情久久</a>| <a href="http://www38044.com" target="_blank">久久成人免费电影</a>| <a href="http://lao64.com" target="_blank">亚洲欧美国产另类</a>| <a href="http://13789a.com" target="_blank">国产农村妇女毛片精品久久莱园子 </a>| <a href="http://7776701.com" target="_blank">久久免费的精品国产v∧</a>| <a href="http://www-222kkk.com" target="_blank">亚洲图片激情小说</a>| <a href="http://ewaygou.com" target="_blank">国产精品亚洲产品</a>| <a href="http://392294.com" target="_blank">欧美一级电影久久</a>| <a href="http://www-77537.com" target="_blank">亚洲欧美另类在线</a>| <a href="http://www5123ri.com" target="_blank">国产香蕉97碰碰久久人人</a>| <a href="http://wwwwy9001.com" target="_blank">欧美一区日韩一区</a>| <a href="http://8xn66w.com" target="_blank">午夜精品免费</a>| <a href="http://sygxjt.com" target="_blank">好吊色欧美一区二区三区四区</a>| <a href="http://fjnexpo.com" target="_blank">亚洲国语精品自产拍在线观看</a>| <a href="http://yw5531.com" target="_blank">欧美 日韩 国产精品免费观看</a>| <a href="http://www-90422.com" target="_blank">欧美激情国产高清</a>| <a href="http://wansilv.com" target="_blank">国产一区二区成人</a>| <a href="http://www33779.com" target="_blank">久久精品国产2020观看福利</a>| <a href="http://270909.com" target="_blank">国产精品hd</a>| <a href="http://kk1xx-com.com" target="_blank">亚洲一区欧美一区</a>| <a href="http://zhiuh.com" target="_blank">亚洲私人黄色宅男</a>| <a href="http://55555549.com" target="_blank">国产欧美一区二区精品忘忧草</a>| <a href="http://zgztby.com" target="_blank">欧美一级免费视频</a>| <a href="http://lampreydb.com" target="_blank">亚洲精品视频在线观看网站</a>| <a href="http://ridenimbus.com" target="_blank">女同性一区二区三区人了人一</a>| <a href="http://yeyesaoqi.com" target="_blank">久久中文在线</a>| <a href="http://7v51.com" target="_blank">99在线精品视频</a>| <a href="http://215920.com" target="_blank">亚洲影音一区</a>| <a href="http://ganmabook.com" target="_blank">韩日精品视频</a>| <a href="http://2225101.com" target="_blank">亚洲黄色三级</a>| <a href="http://bocai4488.com" target="_blank">亚洲国产一成人久久精品</a>| <a href="http://978769.com" target="_blank">男同欧美伦乱</a>| <a href="http://writeingo.com" target="_blank">欧美成年人网站</a>| <a href="http://xjj733.com" target="_blank">亚洲一区二区精品在线</a>| <a href="http://9966k.com" target="_blank">亚洲视频在线一区观看</a>| <a href="http://www-4890.com" target="_blank">激情婷婷欧美</a>| <a href="http://zw1019.com" target="_blank">亚洲国产成人av在线</a>| <a href="http://www-440447.com" target="_blank">欧美日韩视频免费播放</a>| <a href="http://samucorvin.com" target="_blank">亚洲视频电影图片偷拍一区</a>| <a href="http://ycgg008.com" target="_blank">亚洲欧美日韩在线</a>| <a href="http://233116.com" target="_blank">国产精品久久波多野结衣</a>| <a href="http://smdzs.com" target="_blank">久久免费视频这里只有精品</a>| <a href="http://taominze.com" target="_blank">欧美激情精品久久久久久久变态</a>| <a href="http://hafenchen.com" target="_blank">一区二区三区精品在线</a>| <a href="http://s0247.com" target="_blank">欧美一区国产一区</a>| <a href="http://www-493049.com" target="_blank">亚洲作爱视频</a>| <a href="http://shno1steel.com" target="_blank">久久精品99</a>| <a href="http://filmcameralibrary.com" target="_blank">99精品国产一区二区青青牛奶</a>| <a href="http://1355456.com" target="_blank">亚洲在线国产日韩欧美</a>| <a href="http://562595.com" target="_blank">亚洲精品一区在线观看香蕉</a>| <a href="http://javdb04.com" target="_blank">亚洲欧美视频一区</a>| <a href="http://54zcr.com" target="_blank">一本高清dvd不卡在线观看</a>| <a href="http://wwwqm9.com" target="_blank">亚洲自拍偷拍福利</a>| <a href="http://shaijia123.com" target="_blank">亚洲国产你懂的</a>| <a href="http://bbww55.com" target="_blank">欧美一区1区三区3区公司</a>| <a href="http://www-4157.com" target="_blank">亚洲人成毛片在线播放女女</a>| <a href="http://jlhao123.com" target="_blank">亚洲免费中文</a>| <a href="http://dehuabz.com" target="_blank">久久精品国产欧美亚洲人人爽</a>| <a href="http://goutoujunshi.com" target="_blank">亚洲日本欧美日韩高观看</a>| <a href="http://44368com.com" target="_blank">亚洲欧美三级伦理</a>| <a href="http://318823.com" target="_blank">亚洲免费在线播放</a>| <a href="http://916969.com" target="_blank">欧美久久一区</a>| <a href="http://609005.com" target="_blank">欧美激情第4页</a>| <a href="http://xvideoxxnx.com" target="_blank">红桃视频一区</a>| <a href="http://www19829.com" target="_blank">欧美一级在线亚洲天堂</a>| <a href="http://ridenimbus.com" target="_blank">亚洲一区免费视频</a>| <a href="http://x1317.com" target="_blank">欧美日韩免费看</a>| <a href="http://jldianda.com" target="_blank">亚洲高清视频在线观看</a>| <a href="http://998609.com" target="_blank">激情久久五月</a>| <a href="http://7v51.com" target="_blank">久久激情五月丁香伊人</a>| <a href="http://www225011.com" target="_blank">欧美一区二区在线免费播放</a>| <a href="http://erzhuzi.com" target="_blank">欧美日韩另类丝袜其他</a>| <a href="http://wansilv.com" target="_blank">亚洲精品免费电影</a>| <a href="http://cqrehoo.com" target="_blank">夜夜嗨av一区二区三区网站四季av</a>| <a href="http://submro.com" target="_blank">久久精品亚洲精品国产欧美kt∨</a>| <a href="http://136066.com" target="_blank">亚洲欧美日韩国产成人精品影院</a>| <a href="http://www-kkjj88.com" target="_blank">欧美日韩国产三级</a>| <a href="http://www18889.com" target="_blank">日韩视频精品</a>| <a href="http://91nbs.com" target="_blank">亚洲一级黄色av</a>| <a href="http://517hc5.com" target="_blank">国产精品国产福利国产秒拍</a>| <a href="http://scqike.com" target="_blank">夜夜嗨av一区二区三区四区</a>| <a href="http://674446.com" target="_blank">亚洲午夜精品国产</a>| <a href="http://m10669.com" target="_blank">欧美午夜精品久久久</a>| <a href="http://5555547.com" target="_blank">一本色道久久88亚洲综合88</a>| <a href="http://www24668.com" target="_blank">一区二区三欧美</a>| <a href="http://649929.com" target="_blank">欧美日韩精品欧美日韩精品一 </a>| <a href="http://www-49hk.com" target="_blank">国产精品红桃</a>| <a href="http://www330849.com" target="_blank">亚洲午夜羞羞片</a>| <a href="http://833077.com" target="_blank">午夜精品成人在线</a>| <a href="http://hg98688.com" target="_blank">在线亚洲欧美</a>| <a href="http://6688zf.com" target="_blank">亚洲影音先锋</a>| <a href="http://buyiker.com" target="_blank">国产精品视频专区</a>| <a href="http://o10669.com" target="_blank">欧美一区二区三区日韩视频</a>| <a href="http://devwang.com" target="_blank">久久人人精品</a>| <a href="http://www-67499.com" target="_blank">亚洲成色777777在线观看影院</a>| <a href="http://xmzszx.com" target="_blank">麻豆精品视频在线</a>| <a href="http://91nbs.com" target="_blank">亚洲精选一区</a>| <a href="http://621791.com" target="_blank">欧美专区在线观看</a>| <a href="http://nebnb89.com" target="_blank">亚洲第一毛片</a>| <a href="http://actskynet.com" target="_blank">欧美日韩国产亚洲一区</a>| <a href="http://388268.com" target="_blank">亚洲欧美激情在线视频</a>| <a href="http://diyiao.com" target="_blank">久久er99精品</a>| <a href="http://www515678.com" target="_blank">亚洲第一二三四五区</a>| <a href="http://tom3958.com" target="_blank">久久亚洲春色中文字幕久久久</a>| <a href="http://bixiuge.com" target="_blank">午夜免费电影一区在线观看</a>| <a href="http://naturalgiftfashion.com" target="_blank">欧美一级视频精品观看</a>| <a href="http://74w4.com" target="_blank">国产亚洲成av人在线观看导航 </a>| <a href="http://www49966.com" target="_blank">国产日韩亚洲欧美综合</a>| <a href="http://www-33tt.com" target="_blank">欧美一区二区在线看</a>| <a href="http://daqinhkvip.com" target="_blank">久久久一本精品99久久精品66</a>| <a href="http://www-67499.com" target="_blank">精品成人在线观看</a>| <a href="http://998609.com" target="_blank">欧美精品在线观看一区二区</a>| <a href="http://hznaja.com" target="_blank">亚洲桃色在线一区</a>| <a href="http://www344399.com" target="_blank">久久中文字幕一区</a>| <a href="http://580388.com" target="_blank">99视频精品</a>| <a href="http://jiucao8.com" target="_blank">国产裸体写真av一区二区</a>| <a href="http://avtb2120.com" target="_blank">久久久久在线</a>| <a href="http://8181777.com" target="_blank">99一区二区</a>| <a href="http://598327.com" target="_blank">久久综合色88</a>| <a href="http://114mz.com" target="_blank">亚洲天堂av在线免费观看</a>| <a href="http://www49797.com" target="_blank">国产在线视频欧美</a>| <a href="http://797298.com" target="_blank">欧美日韩1区</a>| <a href="http://dracotek.com" target="_blank">久久成人资源</a>| <a href="http://687673.com" target="_blank">中日韩美女免费视频网址在线观看</a>| <a href="http://www-00468.com" target="_blank">欧美中日韩免费视频</a>| <a href="http://74w4.com" target="_blank">亚洲精品一区二区三</a>| <a href="http://t3gg.com" target="_blank">国产一区二区高清不卡</a>| <a href="http://www151zh.com" target="_blank">欧美日韩国产一区二区三区</a>| <a href="http://www123hao.com" target="_blank">欧美在线视频一区二区</a>| <a href="http://www-787333.com" target="_blank">亚洲日本va午夜在线电影</a>| <a href="http://ssni888.com" target="_blank">久久久久网站</a>| <a href="http://6133c.com" target="_blank">亚洲欧美国内爽妇网</a>| <a href="http://xingmaokeji.com" target="_blank">一区久久精品</a>| <a href="http://lmjqav.com" target="_blank">国产农村妇女毛片精品久久莱园子 </a>| <a href="http://488089.com" target="_blank">久久这里有精品15一区二区三区</a>| <a href="http://9lunli.com" target="_blank">91久久中文字幕</a>| <a href="http://wwwcc7777.com" target="_blank">久久精品视频在线</a>| <a href="http://r4747.com" target="_blank">亚洲中午字幕</a>| <a href="http://xiaoyaer.com" target="_blank">亚洲乱码国产乱码精品精 </a>| <a href="http://787299.com" target="_blank">亚洲一区精彩视频</a>| <a href="http://zyjxyx.com" target="_blank">日韩视频中文</a>| <a href="http://www201314.com" target="_blank">亚洲电影观看</a>| <a href="http://cmtqd.com" target="_blank">欧美国产日韩视频</a>| <a href="http://789469.com" target="_blank">国产欧美精品一区aⅴ影院</a>| <script> (function(){ var bp = document.createElement('script'); var curProtocol = window.location.protocol.split(':')[0]; if (curProtocol === 'https') { bp.src = 'https://zz.bdstatic.com/linksubmit/push.js'; } else { bp.src = 'http://push.zhanzhang.baidu.com/push.js'; } var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(bp, s); })(); </script> </body>