锘??xml version="1.0" encoding="utf-8" standalone="yes"?>
姣嬪焊緗枒錛岀▼搴忓憳瑕佸鑷繁緙栧啓鐨勪唬鐮佽礋璐o紝鎮ㄤ笉浠呰淇濊瘉瀹冭兘閫氳繃緙栬瘧錛屾甯稿湴榪愯錛岃屼笖瑕佹弧瓚抽渶姹傚拰璁捐棰勬湡鐨勬晥鏋溿傚崟鍏冩祴璇曟鏄獙璇佷唬鐮佽涓烘槸鍚︽弧瓚抽鏈熺殑鏈夋晥鎵嬫涔嬩竴銆備絾涓嶅彲鍚﹁錛屽仛嫻嬭瘯鏄歡寰堟灟鐕ユ棤瓚g殑浜嬫儏錛岃屼竴閬嶅張涓閬嶇殑嫻嬭瘯鍒欐洿鏄浜虹敓鐣忕殑宸ヤ綔銆傚垢榪愮殑鏄紝鍗曞厓嫻嬭瘯宸ュ叿 JUnit 浣胯繖涓鍒囧彉寰楃畝鍗曡壓鏈搗鏉ャ?/p>
JUnit 鏄?Java 紺懼尯涓煡鍚嶅害鏈楂樼殑鍗曞厓嫻嬭瘯宸ュ叿銆傚畠璇炵敓浜?1997 騫達紝鐢?Erich Gamma 鍜?Kent Beck 鍏卞悓寮鍙戝畬鎴愩傚叾涓?Erich Gamma 鏄粡鍏歌憲浣溿婅璁℃ā寮忥細鍙鐢ㄩ潰鍚戝璞¤蔣浠剁殑鍩虹銆嬩竴涔︾殑浣滆呬箣涓錛屽茍鍦?Eclipse 涓湁寰堝ぇ鐨勮礎鐚紱Kent Beck 鍒欐槸涓浣嶆瀬闄愮紪紼嬶紙XP錛夋柟闈㈢殑涓撳鍜屽厛椹便?/p>
楹婚泙铏藉皬錛屼簲鑴忎勘鍏ㄣ侸Unit 璁捐鐨勯潪甯稿皬宸э紝浣嗘槸鍔熻兘鍗撮潪甯稿己澶с侻artin Fowler 濡傛璇勪環 JUnit錛氬湪杞歡寮鍙戦鍩燂紝浠庢潵灝辨病鏈夊姝ゅ皯鐨勪唬鐮佽搗鍒頒簡濡傛閲嶈鐨勪綔鐢ㄣ傚畠澶уぇ綆鍖栦簡寮鍙戜漢鍛樻墽琛屽崟鍏冩祴璇曠殑闅懼害錛岀壒鍒槸 JUnit 4 浣跨敤 Java 5 涓殑娉ㄨВ錛坅nnotation錛変嬌嫻嬭瘯鍙樺緱鏇村姞綆鍗曘?/p>
鍦ㄥ紑濮嬩綋楠?JUnit 4 涔嬪墠錛屾垜浠渶瑕佷互涓嬭蔣浠剁殑鏀寔錛?/p>
棣栧厛涓烘垜浠殑浣撻獙鏂板緩涓涓?Java 宸ョ▼ —— coolJUnit銆傜幇鍦ㄩ渶瑕佸仛鐨勬槸錛屾墦寮欏圭洰 coolJUnit 鐨勫睘鎬ч〉 -> 閫夋嫨“Java Build Path”瀛愰夐」 -> 鐐歸?#8220;Add Library …”鎸夐挳 -> 鍦ㄥ脊鍑虹殑“Add Library”瀵硅瘽妗嗕腑閫夋嫨 JUnit錛?a >鍥?1錛夛紝騫跺湪涓嬩竴欏典腑閫夋嫨鐗堟湰 4.1 鍚庣偣鍑?#8220;Finish”鎸夐挳銆傝繖鏍蜂究鎶?JUnit 寮曞叆鍒板綋鍓嶉」鐩簱涓簡銆?/p>
鍥?1 涓洪」鐩坊鍔?JUnit 搴?/strong>
鍙互寮濮嬬紪鍐欏崟鍏冩祴璇曚簡鍚楋紵絳夌瓑……錛屾偍鎵撶畻鎶婂崟鍏冩祴璇曚唬鐮佹斁鍦ㄤ粈涔堝湴鏂瑰憿錛熸妸瀹冨拰琚祴璇曚唬鐮佹販鍦ㄤ竴璧鳳紝榪欐樉鐒朵細鐓ф垚娣蜂貢錛屽洜涓哄崟鍏冩祴璇曚唬鐮佹槸涓嶄細鍑虹幇鍦ㄦ渶緇堜駭鍝佷腑鐨勩傚緩璁偍鍒嗗埆涓哄崟鍏冩祴璇曚唬鐮佷笌琚祴璇曚唬鐮佸垱寤哄崟鐙殑鐩綍錛屽茍淇濊瘉嫻嬭瘯浠g爜鍜岃嫻嬭瘯浠g爜浣跨敤鐩稿悓鐨勫寘鍚嶃傝繖鏍鋒棦淇濊瘉浜嗕唬鐮佺殑鍒嗙錛屽悓鏃惰繕淇濊瘉浜嗘煡鎵劇殑鏂逛究銆傞伒鐓ц繖鏉″師鍒欙紝鎴戜滑鍦ㄩ」鐩?coolJUnit 鏍圭洰褰曚笅娣誨姞涓涓柊鐩綍 testsrc錛屽茍鎶婂畠鍔犲叆鍒伴」鐩簮浠g爜鐩綍涓紙鍔犲叆鏂瑰紡瑙?鍥?2錛夈?/p>
鍥?2 淇敼欏圭洰婧愪唬鐮佺洰褰?/strong>
鐜板湪鎴戜滑寰楀埌浜嗕竴鏉?JUnit 鐨勬渶浣沖疄璺碉細鍗曞厓嫻嬭瘯浠g爜鍜岃嫻嬭瘯浠g爜浣跨敤涓鏍風殑鍖咃紝涓嶅悓鐨勭洰褰曘?/p>
涓鍒囧噯澶囧氨緇紝涓璧峰紑濮嬩綋楠屽浣曚嬌鐢?JUnit 榪涜鍗曞厓嫻嬭瘯鍚с備笅闈㈢殑渚嬪瓙鏉ヨ嚜絎旇呯殑寮鍙戝疄璺碉細宸ュ叿綾?WordDealUtil 涓殑闈欐佹柟娉?wordFormat4DB 鏄笓鐢ㄤ簬澶勭悊 Java 瀵硅薄鍚嶇О鍚戞暟鎹簱琛ㄥ悕杞崲鐨勬柟娉曪紙鎮ㄥ彲浠ュ湪浠g爜娉ㄩ噴涓彲浠ュ緱鍒版洿澶氳緇嗙殑鍐呭錛夈備笅闈㈡槸絎竴嬈$紪鐮佸畬鎴愬悗澶ц嚧鎯呭艦錛?/p>
package com.ai92.cooljunit; import java.util.regex.Matcher; import java.util.regex.Pattern; /** * 瀵瑰悕縐般佸湴鍧絳夊瓧絎︿覆鏍煎紡鐨勫唴瀹硅繘琛屾牸寮忔鏌? * 鎴栬呮牸寮忓寲鐨勫伐鍏風被 * * @author Ai92 */ public class WordDealUtil { /** * 灝?Java 瀵硅薄鍚嶇О錛堟瘡涓崟璇嶇殑澶村瓧姣嶅ぇ鍐欙級鎸夌収 * 鏁版嵁搴撳懡鍚嶇殑涔犳儻榪涜鏍煎紡鍖? * 鏍煎紡鍖栧悗鐨勬暟鎹負灝忓啓瀛楁瘝錛屽茍涓斾嬌鐢ㄤ笅鍒掔嚎鍒嗗壊鍛藉悕鍗曡瘝 * * 渚嬪錛歟mployeeInfo 緇忚繃鏍煎紡鍖栦箣鍚庡彉涓?employee_info * * @param name Java 瀵硅薄鍚嶇О */ public static String wordFormat4DB(String name){ Pattern p = Pattern.compile("[A-Z]"); Matcher m = p.matcher(name); StringBuffer sb = new StringBuffer(); while(m.find()){ m.appendReplacement(sb, "_"+m.group()); } return m.appendTail(sb).toString().toLowerCase(); } } |
瀹冩槸鍚﹁兘鎸夌収棰勬湡鐨勬晥鏋滄墽琛屽憿錛熷皾璇曚負瀹冪紪鍐?JUnit 鍗曞厓嫻嬭瘯浠g爜濡備笅錛?/p>
package com.ai92.cooljunit; import static org.junit.Assert.assertEquals; import org.junit.Test; public class TestWordDealUtil { // 嫻嬭瘯 wordFormat4DB 姝e父榪愯鐨勬儏鍐? @Test public void wordFormat4DBNormal(){ String target = "employeeInfo"; String result = WordDealUtil.wordFormat4DB(target); assertEquals("employee_info", result); } } |
寰堟櫘閫氱殑涓涓被鍢涳紒嫻嬭瘯綾?TestWordDealUtil 涔嬫墍浠ヤ嬌鐢?#8220;Test”寮澶達紝瀹屽叏鏄負浜嗘洿濂界殑鍖哄垎嫻嬭瘯綾諱笌琚祴璇曠被銆傛祴璇曟柟娉?wordFormat4DBNormal 璋冪敤鎵ц琚祴璇曟柟娉?WordDealUtil.wordFormat4DB錛屼互鍒ゆ柇榪愯緇撴灉鏄惁杈懼埌璁捐棰勬湡鐨勬晥鏋溿傞渶瑕佹敞鎰忕殑鏄紝嫻嬭瘯鏂規硶 wordFormat4DBNormal 闇瑕佹寜鐓т竴瀹氱殑瑙勮寖涔﹀啓錛?/p>
嫻嬭瘯鏂規硶涓澶勭悊鐨勫瓧絎︿覆涓?#8220;employeeInfo”錛屾寜鐓ц璁$洰鐨勶紝澶勭悊鍚庣殑緇撴灉搴旇涓?#8220;employee_info”銆俛ssertEquals 鏄敱 JUnit 鎻愪緵鐨勪竴緋誨垪鍒ゆ柇嫻嬭瘯緇撴灉鏄惁姝g‘鐨勯潤鎬佹柇璦鏂規硶錛堜綅浜庣被 org.junit.Assert 涓級涔嬩竴錛屾垜浠嬌鐢ㄥ畠灝嗘墽琛岀粨鏋?result 鍜岄鏈熷?#8220;employee_info”榪涜姣旇緝錛屾潵鍒ゆ柇嫻嬭瘯鏄惁鎴愬姛銆?/p>
鐪嬬湅榪愯緇撴灉濡備綍銆傚湪嫻嬭瘯綾諱笂鐐瑰嚮鍙抽敭錛屽湪寮瑰嚭鑿滃崟涓夋嫨 Run As JUnit Test銆傝繍琛岀粨鏋滃 涓嬪浘鎵紺猴細
緇胯壊鐨勮繘搴︽潯鎻愮ず鎴戜滑錛屾祴璇曡繍琛岄氳繃浜嗐備絾鐜板湪灝卞甯冧唬鐮侀氳繃浜嗗崟鍏冩祴璇曡繕涓烘椂榪囨棭銆傝浣忥細鎮ㄧ殑鍗曞厓嫻嬭瘯浠g爜涓嶆槸鐢ㄦ潵璇佹槑鎮ㄦ槸瀵圭殑錛岃屾槸涓轟簡璇佹槑鎮ㄦ病鏈夐敊銆傚洜姝ゅ崟鍏冩祴璇曠殑鑼冨洿瑕佸叏闈紝姣斿瀵硅竟鐣屽箋佹甯稿箋侀敊璇煎緱嫻嬭瘯錛涘浠g爜鍙兘鍑虹幇鐨勯棶棰樿鍏ㄩ潰棰勬祴錛岃岃繖涔熸鏄渶姹傚垎鏋愩佽緇嗚璁$幆鑺備腑瑕佽冭檻鐨勩傛樉鐒訛紝鎴戜滑鐨勬祴璇曟墠鍒氬垰寮濮嬶紝緇х畫琛ュ厖涓浜涘鐗規畩鎯呭喌鐨勬祴璇曪細
public class TestWordDealUtil { …… // 嫻嬭瘯 null 鏃剁殑澶勭悊鎯呭喌 @Test public void wordFormat4DBNull(){ String target = null; String result = WordDealUtil.wordFormat4DB(target); assertNull(result); } // 嫻嬭瘯絀哄瓧絎︿覆鐨勫鐞嗘儏鍐? @Test public void wordFormat4DBEmpty(){ String target = ""; String result = WordDealUtil.wordFormat4DB(target); assertEquals("", result); } // 嫻嬭瘯褰撻瀛楁瘝澶у啓鏃剁殑鎯呭喌 @Test public void wordFormat4DBegin(){ String target = "EmployeeInfo"; String result = WordDealUtil.wordFormat4DB(target); assertEquals("employee_info", result); } // 嫻嬭瘯褰撳熬瀛楁瘝涓哄ぇ鍐欐椂鐨勬儏鍐? @Test public void wordFormat4DBEnd(){ String target = "employeeInfoA"; String result = WordDealUtil.wordFormat4DB(target); assertEquals("employee_info_a", result); } // 嫻嬭瘯澶氫釜鐩歌繛瀛楁瘝澶у啓鏃剁殑鎯呭喌 @Test public void wordFormat4DBTogether(){ String target = "employeeAInfo"; String result = WordDealUtil.wordFormat4DB(target); assertEquals("employee_a_info", result); } } |
鍐嶆榪愯嫻嬭瘯銆傚緢閬楁喚錛孞Unit 榪愯鐣岄潰鎻愮ず鎴戜滑鏈変袱涓祴璇曟儏鍐墊湭閫氳繃嫻嬭瘯錛?a >鍥?4錛?#8212;—褰撻瀛楁瘝澶у啓鏃跺緱鍒扮殑澶勭悊緇撴灉涓庨鏈熺殑鏈夊亸宸紝閫犳垚嫻嬭瘯澶辮觸錛坒ailure錛夛紱鑰屽綋嫻嬭瘯瀵?null 鐨勫鐞嗙粨鏋滄椂錛屽垯鐩存帴鎶涘嚭浜嗗紓甯?#8212;—嫻嬭瘯閿欒錛坋rror錛夈傛樉鐒訛紝琚祴璇曚唬鐮佷腑騫舵病鏈夊棣栧瓧姣嶅ぇ鍐欏拰 null 榪欎袱縐嶇壒孌婃儏鍐佃繘琛屽鐞嗭紝淇敼濡備笅錛?/p>
// 淇敼鍚庣殑鏂規硶 wordFormat4DB /** * 灝?Java 瀵硅薄鍚嶇О錛堟瘡涓崟璇嶇殑澶村瓧姣嶅ぇ鍐欙級鎸夌収 * 鏁版嵁搴撳懡鍚嶇殑涔犳儻榪涜鏍煎紡鍖? * 鏍煎紡鍖栧悗鐨勬暟鎹負灝忓啓瀛楁瘝錛屽茍涓斾嬌鐢ㄤ笅鍒掔嚎鍒嗗壊鍛藉悕鍗曡瘝 * 濡傛灉鍙傛暟 name 涓?null錛屽垯榪斿洖 null * * 渚嬪錛歟mployeeInfo 緇忚繃鏍煎紡鍖栦箣鍚庡彉涓?employee_info * * @param name Java 瀵硅薄鍚嶇О */ public static String wordFormat4DB(String name){ if(name == null){ return null; } Pattern p = Pattern.compile("[A-Z]"); Matcher m = p.matcher(name); StringBuffer sb = new StringBuffer(); while(m.find()){ if(m.start() != 0) m.appendReplacement(sb, ("_"+m.group()).toLowerCase()); } return m.appendTail(sb).toString().toLowerCase(); } |
JUnit 灝嗘祴璇曞け璐ョ殑鎯呭喌鍒嗕負涓ょ錛歠ailure 鍜?error銆侳ailure 涓鑸敱鍗曞厓嫻嬭瘯浣跨敤鐨勬柇璦鏂規硶鍒ゆ柇澶辮觸寮曡搗錛屽畠琛ㄧず鍦ㄦ祴璇曠偣鍙戠幇浜嗛棶棰橈紱鑰?error 鍒欐槸鐢變唬鐮佸紓甯稿紩璧鳳紝榪欐槸嫻嬭瘯鐩殑涔嬪鐨勫彂鐜幫紝瀹冨彲鑳戒駭鐢熶簬嫻嬭瘯浠g爜鏈韓鐨勯敊璇紙嫻嬭瘯浠g爜涔熸槸浠g爜錛屽悓鏍鋒棤娉曚繚璇佸畬鍏ㄦ病鏈夌己闄鳳級錛屼篃鍙兘鏄嫻嬭瘯浠g爜涓殑涓涓殣钘忕殑 bug銆?/p>
鍟婂搱錛屽啀嬈¤繍琛屾祴璇曪紝緇挎潯鍙堥噸鐜扮溂鍓嶃傞氳繃瀵?WordDealUtil.wordFormat4DB 姣旇緝鍏ㄩ潰鐨勫崟鍏冩祴璇曪紝鐜板湪鐨勪唬鐮佸凡緇忔瘮杈冪ǔ瀹氾紝鍙互浣滀負 API 鐨勪竴閮ㄥ垎鎻愪緵緇欏叾瀹冩ā鍧椾嬌鐢ㄤ簡銆?/p>
涓嶇煡涓嶈涓垜浠凡緇忎嬌鐢?JUnit 婕備寒鐨勫畬鎴愪簡涓嬈″崟鍏冩祴璇曘傚彲浠ヤ綋浼氬埌 JUnit 鏄涔堣交閲忕駭錛屽涔堢畝鍗曪紝鏍規湰涓嶉渶瑕佽姳蹇冩濆幓鐮旂┒錛岃繖灝卞彲浠ユ妸鏇村鐨勬敞鎰忓姏鏀懼湪鏇存湁鎰忎箟鐨勪簨鎯呬笂——緙栧啓瀹屾暣鍏ㄩ潰鐨勫崟鍏冩祴璇曘?/p>
褰撶劧錛孞Unit 鎻愪緵鐨勫姛鑳藉喅涓嶄粎浠呭姝ょ畝鍗曪紝鍦ㄦ帴涓嬫潵鐨勫唴瀹逛腑錛屾垜浠細鐪嬪埌 JUnit 涓緢澶氭湁鐢ㄧ殑鐗規э紝鎺屾彙瀹冧滑瀵規偍鐏墊椿鐨勭紪鍐欏崟鍏冩祴璇曚唬鐮侀潪甯告湁甯姪銆?/p>
浣曡皳 Fixture 錛熷畠鏄寚鍦ㄦ墽琛屼竴涓垨鑰呭涓祴璇曟柟娉曟椂闇瑕佺殑涓緋誨垪鍏叡璧勬簮鎴栬呮暟鎹紝渚嬪嫻嬭瘯鐜錛屾祴璇曟暟鎹瓑絳夈傚湪緙栧啓鍗曞厓嫻嬭瘯鐨勮繃紼嬩腑錛屾偍浼氬彂鐜板湪澶ч儴鍒嗙殑嫻嬭瘯鏂規硶鍦ㄨ繘琛岀湡姝g殑嫻嬭瘯涔嬪墠閮介渶瑕佸仛澶ч噺鐨勯摵鍨?#8212;—涓鴻璁″噯澶?Fixture 鑰屽繖紕屻傝繖浜涢摵鍨繃紼嬪崰鎹殑浠g爜寰寰姣旂湡姝f祴璇曠殑浠g爜澶氬緱澶氾紝鑰屼笖榪欎釜姣旂巼闅忕潃嫻嬭瘯鐨勫鏉傜▼搴︾殑澧炲姞鑰岄掑銆傚綋澶氫釜嫻嬭瘯鏂規硶閮介渶瑕佸仛鍚屾牱鐨勯摵鍨椂錛岄噸澶嶄唬鐮佺殑“鍧忓懗閬?#8221;渚垮湪嫻嬭瘯浠g爜涓譏婕紑鏉ャ傝繖鑲?#8220;鍧忓懗閬?#8221;浼氬紕鑴忔偍鐨勪唬鐮侊紝榪樹細鍥犱負鐤忓拷閫犳垚閿欒錛屽簲璇ヤ嬌鐢ㄤ竴浜涙墜孌墊潵鏍歸櫎瀹冦?/p>
JUnit 涓撻棬鎻愪緵浜嗚緗叕鍏?Fixture 鐨勬柟娉曪紝鍚屼竴嫻嬭瘯綾諱腑鐨勬墍鏈夋祴璇曟柟娉曢兘鍙互鍏辯敤瀹冩潵鍒濆鍖?Fixture 鍜屾敞閿 Fixture銆傚拰緙栧啓 JUnit 嫻嬭瘯鏂規硶涓鏍鳳紝鍏叡 Fixture 鐨勮緗篃寰堢畝鍗曪紝鎮ㄥ彧闇瑕侊細
閬靛驚涓婇潰鐨勪笁鏉″師鍒欙紝緙栧啓鍑虹殑浠g爜澶т綋鏄繖涓牱瀛愶細
// 鍒濆鍖?Fixture 鏂規硶 @Before public void init(){ …… } // 娉ㄩ攢 Fixture 鏂規硶 @After public void destroy(){ …… } |
榪欐牱錛屽湪姣忎竴涓祴璇曟柟娉曟墽琛屼箣鍓嶏紝JUnit 浼氫繚璇?init 鏂規硶宸茬粡鎻愬墠鍒濆鍖栨祴璇曠幆澧冿紝鑰屽綋姝ゆ祴璇曟柟娉曟墽琛屽畬姣曚箣鍚庯紝JUnit 鍙堜細璋冪敤 destroy 鏂規硶娉ㄩ攢嫻嬭瘯鐜銆傛敞鎰忔槸姣忎竴涓祴璇曟柟娉曠殑鎵ц閮戒細瑙﹀彂瀵瑰叕鍏?Fixture 鐨勮緗紝涔熷氨鏄浣跨敤娉ㄨВ Before 鎴栬?After 淇グ鐨勫叕鍏?Fixture 璁劇疆鏂規硶鏄柟娉曠駭鍒殑錛?a >鍥?5錛夈傝繖鏍蜂究鍙互淇濊瘉鍚勪釜鐙珛鐨勬祴璇曚箣闂翠簰涓嶅共鎵幫紝浠ュ厤鍏跺畠嫻嬭瘯浠g爜淇敼嫻嬭瘯鐜鎴栬呮祴璇曟暟鎹獎鍝嶅埌鍏跺畠嫻嬭瘯浠g爜鐨勫噯紜с?/p>
鍥?5 鏂規硶綰у埆 Fixture 鎵ц紺烘剰鍥?/strong>
鍙槸錛岃繖縐?Fixture 璁劇疆鏂瑰紡榪樻槸寮曟潵浜嗘壒璇勶紝鍥犱負瀹冩晥鐜囦綆涓嬶紝鐗瑰埆鏄湪璁劇疆 Fixture 闈炲父鑰楁椂鐨勬儏鍐典笅錛堜緥濡傝緗暟鎹簱閾炬帴錛夈傝屼笖瀵逛簬涓嶄細鍙戠敓鍙樺寲鐨勬祴璇曠幆澧冩垨鑰呮祴璇曟暟鎹潵璇達紝鏄笉浼氬獎鍝嶅埌嫻嬭瘯鏂規硶鐨勬墽琛岀粨鏋滅殑錛屼篃灝辨病鏈夊繀瑕侀拡瀵規瘡涓涓祴璇曟柟娉曢噸鏂拌緗竴嬈?Fixture銆傚洜姝ゅ湪 JUnit 4 涓紩鍏ヤ簡綾葷駭鍒殑 Fixture 璁劇疆鏂規硶錛岀紪鍐欒鑼冨涓嬶細
綾葷駭鍒殑 Fixture 浠呬細鍦ㄦ祴璇曠被涓墍鏈夋祴璇曟柟娉曟墽琛屼箣鍓嶆墽琛屽垵濮嬪寲錛屽茍鍦ㄥ叏閮ㄦ祴璇曟柟娉曟祴璇曞畬姣曚箣鍚庢墽琛屾敞閿鏂規硶錛?a >鍥?6錛夈備唬鐮佽寖鏈涓嬶細
// 綾葷駭鍒?Fixture 鍒濆鍖栨柟娉? @BeforeClass public static void dbInit(){ …… } // 綾葷駭鍒?Fixture 娉ㄩ攢鏂規硶 @AfterClass public static void dbClose(){ …… } |
娉ㄨВ org.junit.Test 涓湁涓や釜闈炲父鏈夌敤鐨勫弬鏁幫細expected 鍜?timeout銆傚弬鏁?expected 浠h〃嫻嬭瘯鏂規硶鏈熸湜鎶涘嚭鎸囧畾鐨勫紓甯革紝濡傛灉榪愯嫻嬭瘯騫舵病鏈夋姏鍑鴻繖涓紓甯革紝鍒?JUnit 浼氳涓鴻繖涓祴璇曟病鏈夐氳繃銆傝繖涓洪獙璇佽嫻嬭瘯鏂規硶鍦ㄩ敊璇殑鎯呭喌涓嬫槸鍚︿細鎶涘嚭棰勫畾鐨勫紓甯告彁渚涗簡渚垮埄銆備婦渚嬫潵璇達紝鏂規硶 supportDBChecker 鐢ㄤ簬媯鏌ョ敤鎴蜂嬌鐢ㄧ殑鏁版嵁搴撶増鏈槸鍚﹀湪緋葷粺鐨勬敮鎸佺殑鑼冨洿涔嬪唴錛屽鏋滅敤鎴蜂嬌鐢ㄤ簡涓嶈鏀寔鐨勬暟鎹簱鐗堟湰錛屽垯浼氭姏鍑鴻繍琛屾椂寮傚父 UnsupportedDBVersionException銆傛祴璇曟柟娉?supportDBChecker 鍦ㄦ暟鎹簱鐗堟湰涓嶆敮鎸佹椂鏄惁浼氭姏鍑烘寚瀹氬紓甯哥殑鍗曞厓嫻嬭瘯鏂規硶澶т綋濡備笅錛?/p>
@Test(expected=UnsupportedDBVersionException.class) public void unsupportedDBCheck(){ …… } |
娉ㄨВ org.junit.Test 鐨勫彟涓涓弬鏁?timeout錛屾寚瀹氳嫻嬭瘯鏂規硶琚厑璁歌繍琛岀殑鏈闀挎椂闂村簲璇ユ槸澶氬皯錛屽鏋滄祴璇曟柟娉曡繍琛屾椂闂磋秴榪囦簡鎸囧畾鐨勬縐掓暟錛屽垯 JUnit 璁や負嫻嬭瘯澶辮觸銆傝繖涓弬鏁板浜庢ц兘嫻嬭瘯鏈変竴瀹氱殑甯姪銆備緥濡傦紝濡傛灉瑙f瀽涓浠借嚜瀹氫箟鐨?XML 鏂囨。鑺辮垂浜嗗浜?1 縐掔殑鏃墮棿錛屽氨闇瑕侀噸鏂拌冭檻 XML 緇撴瀯鐨勮璁★紝閭e崟鍏冩祴璇曟柟娉曞彲浠ヨ繖鏍鋒潵鍐欙細
@Test(timeout=1000) public void selfXMLReader(){ …… } |
JUnit 鎻愪緵娉ㄨВ org.junit.Ignore 鐢ㄤ簬鏆傛椂蹇界暐鏌愪釜嫻嬭瘯鏂規硶錛屽洜涓烘湁鏃跺欑敱浜庢祴璇曠幆澧冨彈闄愶紝騫朵笉鑳戒繚璇佹瘡涓涓祴璇曟柟娉曢兘鑳芥紜繍琛屻備緥濡備笅闈㈢殑浠g爜渚胯〃紺虹敱浜庢病鏈変簡鏁版嵁搴撻摼鎺ワ紝鎻愮ず JUnit 蹇界暐嫻嬭瘯鏂規硶 unsupportedDBCheck錛?/p>
@ Ignore(“db is down”) @Test(expected=UnsupportedDBVersionException.class) public void unsupportedDBCheck(){ …… } |
浣嗘槸涓瀹氳灝忓績銆傛敞瑙?org.junit.Ignore 鍙兘鐢ㄤ簬鏆傛椂鐨勫拷鐣ユ祴璇曪紝濡傛灉闇瑕佹案榪滃拷鐣ヨ繖浜涙祴璇曪紝涓瀹氳紜琚祴璇曚唬鐮佷笉鍐嶉渶瑕佽繖浜涙祴璇曟柟娉曪紝浠ュ厤蹇界暐蹇呰鐨勬祴璇曠偣銆?/p>
鍙堜竴涓柊姒傚康鍑虹幇浜?#8212;—嫻嬭瘯榪愯鍣紝JUnit 涓墍鏈夌殑嫻嬭瘯鏂規硶閮芥槸鐢卞畠璐熻矗鎵ц鐨勩侸Unit 涓哄崟鍏冩祴璇曟彁渚涗簡榛樿鐨勬祴璇曡繍琛屽櫒錛屼絾 JUnit 騫舵病鏈夐檺鍒舵偍蹇呴』浣跨敤榛樿鐨勮繍琛屽櫒銆傜浉鍙嶏紝鎮ㄤ笉浠呭彲浠ュ畾鍒惰嚜宸辯殑榪愯鍣紙鎵鏈夌殑榪愯鍣ㄩ兘緇ф壙鑷?org.junit.runner.Runner錛夛紝鑰屼笖榪樺彲浠ヤ負姣忎竴涓祴璇曠被鎸囧畾浣跨敤鏌愪釜鍏蜂綋鐨勮繍琛屽櫒銆傛寚瀹氭柟娉曚篃寰堢畝鍗曪紝浣跨敤娉ㄨВ org.junit.runner.RunWith 鍦ㄦ祴璇曠被涓婃樉寮忕殑澹版槑瑕佷嬌鐢ㄧ殑榪愯鍣ㄥ嵆鍙細
@RunWith(CustomTestRunner.class) public class TestWordDealUtil { …… } |
鏄捐屾槗瑙侊紝濡傛灉嫻嬭瘯綾繪病鏈夋樉寮忕殑澹版槑浣跨敤鍝竴涓祴璇曡繍琛屽櫒錛孞Unit 浼氬惎鍔ㄩ粯璁ょ殑嫻嬭瘯榪愯鍣ㄦ墽琛屾祴璇曠被錛堟瘮濡備笂闈㈡彁鍙婄殑鍗曞厓嫻嬭瘯浠g爜錛夈備竴鑸儏鍐典笅錛岄粯璁ゆ祴璇曡繍琛屽櫒鍙互搴斿緇濆ぇ澶氭暟鐨勫崟鍏冩祴璇曡姹傦紱褰撲嬌鐢?JUnit 鎻愪緵鐨勪竴浜涢珮綰х壒鎬э紙渚嬪鍗沖皢浠嬬粛鐨勪袱涓壒鎬э級鎴栬呴拡瀵圭壒孌婇渶姹傚畾鍒?JUnit 嫻嬭瘯鏂瑰紡鏃訛紝鏄懼紡鐨勫0鏄庢祴璇曡繍琛屽櫒灝卞繀涓嶅彲灝戜簡銆?/p>
鍦ㄥ疄闄呴」鐩腑錛岄殢鐫欏圭洰榪涘害鐨勫紑灞曪紝鍗曞厓嫻嬭瘯綾諱細瓚婃潵瓚婂錛屽彲鏄洿鍒扮幇鍦ㄦ垜浠繕鍙細涓涓竴涓殑鍗曠嫭榪愯嫻嬭瘯綾伙紝榪欏湪瀹為檯欏圭洰瀹炶返涓偗瀹氭槸涓嶅彲琛岀殑銆備負浜嗚В鍐寵繖涓棶棰橈紝JUnit 鎻愪緵浜嗕竴縐嶆壒閲忚繍琛屾祴璇曠被鐨勬柟娉曪紝鍙仛嫻嬭瘯濂椾歡銆傝繖鏍鳳紝姣忔闇瑕侀獙璇佺郴緇熷姛鑳芥紜ф椂錛屽彧鎵ц涓涓垨鍑犱釜嫻嬭瘯濂椾歡渚垮彲浠ヤ簡銆傛祴璇曞浠剁殑鍐欐硶闈炲父綆鍗曪紝鎮ㄥ彧闇瑕侀伒寰互涓嬭鍒欙細
package com.ai92.cooljunit; import org.junit.runner.RunWith; import org.junit.runners.Suite; …… /** * 鎵歸噺嫻嬭瘯 宸ュ叿鍖?涓祴璇曠被 * @author Ai92 */ @RunWith(Suite.class) @Suite.SuiteClasses({TestWordDealUtil.class}) public class RunAllUtilTestsSuite { } |
涓婁緥浠g爜涓紝鎴戜滑灝嗗墠鏂囨彁鍒扮殑嫻嬭瘯綾?TestWordDealUtil 鏀懼叆浜嗘祴璇曞浠?RunAllUtilTestsSuite 涓紝鍦?Eclipse 涓繍琛屾祴璇曞浠訛紝鍙互鐪嬪埌嫻嬭瘯綾?TestWordDealUtil 琚皟鐢ㄦ墽琛屼簡銆傛祴璇曞浠朵腑涓嶄粎鍙互鍖呭惈鍩烘湰鐨勬祴璇曠被錛岃屼笖鍙互鍖呭惈鍏跺畠鐨勬祴璇曞浠訛紝榪欐牱鍙互寰堟柟渚跨殑鍒嗗眰綆$悊涓嶅悓妯″潡鐨勫崟鍏冩祴璇曚唬鐮併備絾鏄紝鎮ㄤ竴瀹氳淇濊瘉嫻嬭瘯濂椾歡涔嬮棿娌℃湁寰幆鍖呭惈鍏崇郴錛屽惁鍒欐棤灝界殑寰幆灝變細鍑虹幇鍦ㄦ偍鐨勯潰鍓?#8230;…銆?/p>
package com.ai92.cooljunit; import static org.junit.Assert.assertEquals; import java.util.Arrays; import java.util.Collection; import org.junit.Test; import org.junit.runner.RunWith; import org.junit.runners.Parameterized; import org.junit.runners.Parameterized.Parameters; @RunWith(Parameterized.class) public class TestWordDealUtilWithParam { private String expected; private String target; @Parameters public static Collection words(){ return Arrays.asList(new Object[][]{ {"employee_info", "employeeInfo"}, // 嫻嬭瘯涓鑸殑澶勭悊鎯呭喌 {null, null}, // 嫻嬭瘯 null 鏃剁殑澶勭悊鎯呭喌 {"", ""}, // 嫻嬭瘯絀哄瓧絎︿覆鏃剁殑澶勭悊鎯呭喌 {"employee_info", "EmployeeInfo"}, // 嫻嬭瘯褰撻瀛楁瘝澶у啓鏃剁殑鎯呭喌 {"employee_info_a", "employeeInfoA"}, // 嫻嬭瘯褰撳熬瀛楁瘝涓哄ぇ鍐欐椂鐨勬儏鍐? {"employee_a_info", "employeeAInfo"} // 嫻嬭瘯澶氫釜鐩歌繛瀛楁瘝澶у啓鏃剁殑鎯呭喌 }); } /** * 鍙傛暟鍖栨祴璇曞繀欏葷殑鏋勯犲嚱鏁? * @param expected 鏈熸湜鐨勬祴璇曠粨鏋滐紝瀵瑰簲鍙傛暟闆嗕腑鐨勭涓涓弬鏁? * @param target 嫻嬭瘯鏁版嵁錛屽搴斿弬鏁伴泦涓殑絎簩涓弬鏁? */ public TestWordDealUtilWithParam(String expected , String target){ this.expected = expected; this.target = target; } /** * 嫻嬭瘯灝?Java 瀵硅薄鍚嶇О鍒版暟鎹簱鍚嶇О鐨勮漿鎹? */ @Test public void wordFormat4DB(){ assertEquals(expected, WordDealUtil.wordFormat4DB(target)); } } |
寰堟槑鏄撅紝浠g爜鐦﹁韓浜嗐傚湪闈欐佹柟娉?words 涓紝鎴戜滑浣跨敤浜岀淮鏁扮粍鏉ユ瀯寤烘祴璇曟墍闇瑕佺殑鍙傛暟鍒楄〃錛屽叾涓瘡涓暟緇勪腑鐨勫厓绱犵殑鏀劇疆欏哄簭騫舵病鏈変粈涔堣姹傦紝鍙鍜屾瀯閫犲嚱鏁頒腑鐨勯『搴忎繚鎸佷竴鑷村氨鍙互浜嗐傜幇鍦ㄥ鏋滃啀澧炲姞涓縐嶆祴璇曟儏鍐碉紝鍙渶瑕佸湪闈欐佹柟娉?words 涓坊鍔犵浉搴旂殑鏁扮粍鍗沖彲錛屼笉鍐嶉渶瑕佸鍒剁矘璐村嚭涓涓柊鐨勬柟娉曞嚭鏉ヤ簡銆?/p>
闅忕潃欏圭洰鐨勮繘灞曪紝欏圭洰鐨勮妯″湪涓嶆柇鐨勮啫鑳錛屼負浜嗕繚璇侀」鐩殑璐ㄩ噺錛屾湁璁″垝鐨勬墽琛屽叏闈㈢殑鍗曞厓嫻嬭瘯鏄潪甯告湁蹇呰鐨勩備絾鍗曢潬 JUnit 鎻愪緵鐨勬祴璇曞浠跺緢闅捐儨浠昏繖欏瑰伐浣滐紝鍥犱負欏圭洰涓崟鍏冩祴璇曠被鐨勪釜鏁板湪涓嶅仠鐨勫鍔狅紝嫻嬭瘯濂椾歡鍗存棤娉曞姩鎬佺殑璇嗗埆鏂板姞鍏ョ殑鍗曞厓嫻嬭瘯綾伙紝闇瑕佹墜鍔ㄤ慨鏀規祴璇曞浠訛紝榪欐槸涓涓緢瀹規槗閬楀繕寰楁楠わ紝紼嶆湁鐤忓拷灝變細褰卞搷鍏ㄩ潰鍗曞厓嫻嬭瘯鐨勮鐩栫巼銆?/p>
褰撶劧瑙e喅鐨勬柟娉曟湁澶氱澶氭牱錛屽叾涓皢 JUnit 涓庢瀯寤哄埄鍣?Ant 緇撳悎浣跨敤鍙互寰堢畝鍗曠殑瑙e喅榪欎釜闂銆侫nt —— 澶囧彈璧炶獕鐨?Java 鏋勫緩宸ュ叿銆傚畠鍑熷嚭鑹茬殑鏄撶敤鎬с佸鉤鍙版棤鍏蟲т互鍙婂欏圭洰鑷姩嫻嬭瘯鍜岃嚜鍔ㄩ儴緗茬殑鏀寔錛屾垚涓轟紬澶氶」鐩瀯寤鴻繃紼嬩腑涓嶅彲鎴栫己鐨勭嫭绔嬪伐鍏鳳紝騫跺凡緇忔垚涓轟簨瀹炰笂鐨勬爣鍑嗐侫nt 鍐呯疆浜嗗 JUnit 鐨勬敮鎸侊紝瀹冩彁渚涗簡涓や釜 Task錛歫unit 鍜?junitreport錛屽垎鍒敤浜庢墽琛?JUnit 鍗曞厓嫻嬭瘯鍜岀敓鎴愭祴璇曠粨鏋滄姤鍛娿備嬌鐢ㄨ繖涓や釜 Task 緙栧啓鏋勫緩鑴氭湰錛屽彲浠ュ緢綆鍗曠殑瀹屾垚姣忔鍏ㄩ潰鍗曞厓嫻嬭瘯鐨勪換鍔°?/p>
涓嶈繃錛屽湪浣跨敤 Ant 榪愯 JUnit 涔嬪墠錛屾偍闇瑕佺◢浣滀竴浜涢厤緗傛墦寮 Eclipse 棣栭夐」鐣岄潰錛岄夋嫨 Ant -> Runtime 棣栭夐」錛堣 鍥?7錛夛紝灝?JUnit 4.1 鐨?JAR 鏂囦歡娣誨姞鍒?Classpath Tab 欏典腑鐨?Global Entries 璁劇疆欏歸噷銆傝寰楁鏌ヤ竴涓?Ant Home Entries 璁劇疆欏逛腑鐨?Ant 鐗堟湰鏄惁鍦?1.7.0 涔嬩笂錛屽鏋滀笉鏄鏇挎崲涓烘渶鏂扮増鏈殑 Ant JAR 鏂囦歡銆?/p>
鍥?7 Ant Runtime 棣栭夐」
鍓╀笅鐨勫伐浣滃氨鏄緙栧啓 Ant 鏋勫緩鑴氭湰 build.xml銆傝櫧鐒惰繖涓繃紼嬬◢瀚岀箒鐞愶紝浣嗚繖鏄竴浠朵竴鍔蟲案閫哥殑浜嬫儏銆傜幇鍦ㄦ垜浠氨鎶婂墠闈㈢紪鍐欑殑嫻嬭瘯鐢ㄤ緥閮芥斁緗埌 Ant 鏋勫緩鑴氭湰涓墽琛岋紝涓洪」鐩?coolJUnit 鐨勬瀯寤鴻剼鏈坊鍔犱竴涓嬪唴瀹癸細
<?xml version="1.0"?> <!-- ============================================= auto unittest task ai92 ========================================== --> <project name="auto unittest task" default="junit and report" basedir="."> <property name="output folder" value="bin"/> <property name="src folder" value="src"/> <property name="test folder" value="testsrc"/> <property name="report folder" value="report" /> <!-- - - - - - - - - - - - - - - - - - target: test report folder init - - - - - - - - - - - - - - - - - --> <target name="test init"> <mkdir dir="${report folder}"/> </target> <!-- - - - - - - - - - - - - - - - - - target: compile - - - - - - - - - - - - - - - - - --> <target name="compile"> <javac srcdir="${src folder}" destdir="${output folder}" /> <echo>compilation complete!</echo> </target> <!-- - - - - - - - - - - - - - - - - - target: compile test cases - - - - - - - - - - - - - - - - - --> <target name="test compile" depends="test init"> <javac srcdir="${test folder}" destdir="${output folder}" /> <echo>test compilation complete!</echo> </target> <target name="all compile" depends="compile, test compile"> </target> <!-- ======================================== target: auto test all test case and output report file ===================================== --> <target name="junit and report" depends="all compile"> <junit printsummary="on" fork="true" showoutput="true"> <classpath> <fileset dir="lib" includes="**/*.jar"/> <pathelement path="${output folder}"/> </classpath> <formatter type="xml" /> <batchtest todir="${report folder}"> <fileset dir="${output folder}"> <include name="**/Test*.*" /> </fileset> </batchtest> </junit> <junitreport todir="${report folder}"> <fileset dir="${report folder}"> <include name="TEST-*.xml" /> </fileset> <report format="frames" todir="${report folder}" /> </junitreport> </target> </project> |
Target junit report 鏄?Ant 鏋勫緩鑴氭湰涓殑鏍稿績鍐呭錛屽叾瀹?target 閮芥槸涓哄畠鐨勬墽琛屾彁渚涘墠鏈熸湇鍔°俆ask junit 浼氬鎵捐緭鍑虹洰褰曚笅鎵鏈夊懡鍚嶄互“Test”寮澶寸殑 class 鏂囦歡錛屽茍鎵ц瀹冧滑銆傜揣鎺ョ潃 Task junitreport 浼氬皢鎵ц緇撴灉鐢熸垚 HTML 鏍煎紡鐨勬祴璇曟姤鍛婏紙鍥?8錛夋斁緗湪“report folder”涓嬨?/p>
涓烘暣涓」鐩殑鍗曞厓嫻嬭瘯綾葷‘瀹氫竴縐嶅懡鍚嶉鏍箋備笉浠呮槸鍑轟簬鍖哄垎綾誨埆鐨勮冭檻錛岃繖涓?Ant 鎵歸噺鎵ц鍗曞厓嫻嬭瘯涔熼潪甯告湁甯姪錛屾瘮濡傚墠闈緥瀛愪腑鐨勬祴璇曠被閮藉凡“Test”鎵撳ご錛岃屾祴璇曞浠跺垯浠?#8220;Suite”緇撳熬絳夌瓑銆?/p>
鍥?8 junitreport 鐢熸垚鐨勬祴璇曟姤鍛?/strong>
鐜板湪鎵ц涓嬈″叏闈㈢殑鍗曞厓嫻嬭瘯鍙樺緱闈炲父綆鍗曚簡錛屽彧闇瑕佽繍琛屼竴涓?Ant 鏋勫緩鑴氭湰錛屽氨鍙互璧板畬鎵鏈夋祦紼嬶紝騫惰兘寰楀埌涓浠借灝界殑嫻嬭瘯鎶ュ憡銆傛偍鍙互鍦?Ant 鍦ㄧ嚎鎵嬪唽涓幏寰椾笂闈㈡彁鍙婄殑姣忎竴涓?Ant 鍐呯疆 task 鐨勪嬌鐢ㄧ粏鑺傘?/p>
闅忕潃瓚婃潵瓚婂鐨勫紑鍙戜漢鍛樺紑濮嬭鍚屽茍鎺ュ彈鏋侀檺緙栫▼錛圶P錛夌殑鎬濇兂錛屽崟鍏冩祴璇曠殑浣滅敤鍦ㄨ蔣浠跺伐紼嬩腑鍙樺緱瓚婃潵瓚婇噸瑕併傛湰鏂囨棬鍦ㄥ皢鏈鏂扮殑鍗曞厓嫻嬭瘯宸ュ叿 JUnit 4 浠嬬粛緇欐偍錛屼互鍙婂浣曠粨鍚?IDE Eclipse 鍜屾瀯寤哄伐鍏?Ant 鍒涘緩鑷姩鍖栧崟鍏冩祴璇曟柟妗堛傚茍涓旇繕鏈熸湜鎮ㄨ兘澶熼氳繃鏈枃“鎰熸煋”涓浜涘ソ鐨勫崟鍏冩祴璇曟剰璇嗭紝鍥犱負 JUnit 鏈韓浠呬粎鏄竴浠藉伐鍏瘋屽凡錛屽畠鐨勭湡姝d紭鍔挎潵鑷簬瀹冪殑鎬濇兂鍜屾妧鏈?/p>