锘??xml version="1.0" encoding="utf-8" standalone="yes"?>亚洲女人18毛片水真多,亚洲激情视频网站,亚洲人成色77777在线观看http://www.tkk7.com/jiangshachina/category/32067.html鍚屾槸Java鐖卞ソ鑰咃紝鐩擱綍蹇呮浘鐩歌瘑錛?lt;br>    a cup of Java, cheers!zh-cnWed, 04 Jan 2012 20:59:08 GMTWed, 04 Jan 2012 20:59:08 GMT60鎺㈢儲JUnit4鎵╁睍錛氭繁鍏ule(鍘?http://www.tkk7.com/jiangshachina/archive/2012/01/04/367802.htmlSha JiangSha JiangTue, 03 Jan 2012 16:13:00 GMThttp://www.tkk7.com/jiangshachina/archive/2012/01/04/367802.htmlhttp://www.tkk7.com/jiangshachina/comments/367802.htmlhttp://www.tkk7.com/jiangshachina/archive/2012/01/04/367802.html#Feedback0http://www.tkk7.com/jiangshachina/comments/commentRss/367802.htmlhttp://www.tkk7.com/jiangshachina/services/trackbacks/367802.html
鎺㈢儲JUnit4鎵╁睍錛氭繁鍏ule
鏈枃鏄?鎺㈢儲JUnit4鎵╁睍"緋誨垪涓殑絎笁綃囷紝灝嗚繘涓姝ユ帰絀禦ule鐨勫簲鐢紝灞曠ず濡備綍浣跨敤Rule鏉ユ浛浠BeforeClass錛孈AfterClass錛孈Before鍜孈After鐨勫姛鑳姐?2012.01.04鏈鍚庢洿鏂?

鍦ㄦ湰緋誨垪鐨勭浜岀瘒銆婃帰绱Unit4鎵╁睍錛氬簲鐢≧ule銆?/a>涓彁鍒幫紝鍙互浣跨敤Rule鏇夸唬鐜版湁鐨勫ぇ閮ㄥ垎Runner鎵╁睍錛岃屼笖涔熶笉鎻愬″Runner涓殑withBefores()錛寃ithAfters()絳夋柟娉曡繘琛屾墿灞曘傛湰鏂囧皢浠嬬粛濡備綍浣跨敤Rule鍘誨疄鐜癅Before錛孈After鍜孈BeforeClass鐨勭浉鍚屽姛鑳姐?/span>

1. BaseRule
    棣栧厛瑕佸垱寤轟竴涓緝閫氱敤鐨凾estRule瀹炵幇BaseRule錛屽畠浼氶噴鏀懼嚭涓や釜鎵╁睍鐐癸紝涓涓湪鎵ц嫻嬭瘯鏂規硶涔嬪墠錛宐efore()錛涘彟涓涓湪鎵ц嫻嬭瘯鏂規硶涔嬪悗after()銆備笅闈㈡槸璇ョ被鐨勪唬鐮侊紝
public abstract class BaseRule implements TestRule {

    @Override
    
public Statement apply(Statement base, Description description) {
        
return new RuleStatement(base, description);
    }

    
private class RuleStatement extends Statement {

        
private Statement base = null;

        
private Description description = null;

        
private RuleStatement(Statement base, Description description) {
            
this.base = base;
            
this.description = description;
        }

        @Override
        
public void evaluate() throws Throwable {
            before(base, description);
            
try {
                base.evaluate();
            } 
finally {
                after(base, description);
            }
        }
    }

    
protected void before(Statement base, Description description) throws Throwable {

    }

    
protected void after(Statement base, Description description) {

    }
}
濡傛灉瀵笿Unit4鐨勬簮浠g爜鐣ユ湁璁ょ煡錛屽彲鑳戒細鍙戠幇BaseRule涓嶫Unit4鎻愪緵鐨凾estRule瀹炵幇ExternalResource浠g爜鐩鎬技銆傚叧閿殑涓嶅悓涔嬪鏄紝BaseRule涓殑before()涓巃fter()鏂規硶閮芥彁渚涗簡Statement涓嶥escription綾誨瀷鐨勫弬鏁幫紝榪欎嬌寰楀畠鑳藉瀹屾垚鏇村鏉傜殑宸ヤ綔銆?/span>

2. CalculatorTest
    鏈枃浣跨敤鐨凜alculatorTest灝嗕笉浣跨敤@BeforeClass錛孈Before鍜孈After錛岃屼細鍒涘緩涓や釜BaseRule鐨勫疄渚嬶細涓涓敤浜庢浛浠BeforeClass鍜孈AfterClass(鏈郴鍒楃洰鍓嶈繕鏈嬌鐢ㄨ繃@AfterClass)錛屽彟涓涓垯鏇夸唬@Before鍜孈After銆?/span>
public class CalculatorTest {

    
private static final DateFormat format = new SimpleDateFormat("yyyy-MM-dd_HH:mm:ss_SSS");

    
private static Calculator calculator = null;

    @ClassRule
    
public static BaseRule classRule = new BaseRule() {

        
protected void before(Statement base, Description description) throws Throwable {
            calculator 
= new Calculator();
        };
    };

    @Rule
    
public BaseRule rule = new BaseRule() {

        
protected void before(Statement base, Description description) throws Throwable {
            printBeforeLog(description);
        };

        
protected void after(Statement base, Description description) {
            printAfterLog(description);
        };

        
private void printBeforeLog(Description description) {
            TestLogger testLogger 
= description.getAnnotation(TestLogger.class);
            
if (testLogger != null) {
                StringBuilder log 
= new StringBuilder(format.format(new Date()));
                log.append(
" ").append(description.getClassName()).append("#")
                        .append(description.getMethodName()).append(
"")
                        .append(testLogger.log());
                System.out.println(log.toString());
            }
        }

        
private void printAfterLog(Description description) {
            StringBuilder log 
= new StringBuilder(format.format(new Date()));
            log.append(
" ").append(description.getClassName()).append("#")
                    .append(description.getMethodName()).append(
" end");
            System.out.println(log.toString());
        }
    };

    @Test
    @TestLogger(log 
= "a simple division")
    
public void simpleDivide() {
        
int value = calculator.divide(82);
        Assert.assertTrue(value 
== 4);
    }

    @Test(expected 
= ArithmeticException.class)
    @TestLogger(log 
= "divided by zero, and an ArithmeticException thrown.")
    
public void dividedByZero() {
        calculator.divide(
80);
    }
}
鍊煎緱娉ㄦ剰鐨勬槸錛宑lassRule鏄潤鎬佸彉閲忥紝瀹冧嬌鐢ˊClassRule Annotation錛屽皢鏇夸唬@BeforeClass鍜孈AfterClass錛涜宺ule鏄垚鍛樺彉閲忥紝瀹冧嬌鐢ˊRule Annotation錛屽皢鏇夸唬@Before鍜孈After銆備笌
涔嬪墠鏂囩珷涓嶅悓鐨勬槸錛屾澶勪笉浠呬細鍦ㄦ墽琛屾祴璇曟柟娉曚箣鍓嶆墦鍗版寚瀹氬唴瀹圭殑鏃ュ織(printBeforeLog())錛岃繕浼氬湪鎵ц嫻嬭瘯鏂規硶涔嬪悗鎵撳嵃涓鏉″浐瀹氭牸寮忕殑鏃ュ織(printAfterLog())錛岀敤浜庢寚紺鴻嫻嬭瘯鏂規硶宸茬粡鎵ц瀹屾瘯浜嗐?/span>

3. 灝忕粨
    浣跨敤Rule鍙互鏇夸唬緇濆ぇ閮ㄥ垎鐨凴unner鎵╁睍錛岃屼笖鐗瑰畾鐨凴ule瀹炵幇鍙互琚鐢紝涔熸槗浜庢坊鍔犳垨縐婚櫎Rule瀹炰緥錛岃繖浜涢兘澶уぇ鍦版彁楂樹簡鐏墊椿鎬с傚煎緱娉ㄦ剰鍦版槸錛屾湰鏂囪櫧鐒朵嬌鐢≧ule浠f浛浜咢BeforeClass錛孈AfterClass錛孈Before鍜孈After鐨勫姛鑳斤紝浣嗗茍涓嶆剰鍛崇潃灝卞簲褰撹繖涔堝仛銆傚氨鎴戜釜浜烘墍鎯籌紝灝嗕紶緇熺殑Fixture鍔熻兘浜ょ敱@BeforeClass錛孈AfterClass錛孈Before鍜孈After瀹炵幇錛屼粛鐒舵槸涓縐嶄笉閿欑殑閫夋嫨銆?/span>


Sha Jiang 2012-01-04 00:13 鍙戣〃璇勮
]]>
鎺㈢儲JUnit4鎵╁睍錛氬簲鐢≧ule(鍘?http://www.tkk7.com/jiangshachina/archive/2011/12/24/366801.htmlSha JiangSha JiangSat, 24 Dec 2011 15:26:00 GMThttp://www.tkk7.com/jiangshachina/archive/2011/12/24/366801.htmlhttp://www.tkk7.com/jiangshachina/comments/366801.htmlhttp://www.tkk7.com/jiangshachina/archive/2011/12/24/366801.html#Feedback0http://www.tkk7.com/jiangshachina/comments/commentRss/366801.htmlhttp://www.tkk7.com/jiangshachina/services/trackbacks/366801.html
鎺㈢儲JUnit4鎵╁睍錛氫嬌鐢≧ule
鍦ㄤ笂涓綃囨枃绔?a href="http://www.tkk7.com/jiangshachina/archive/2011/12/14/366289.html">銆婃帰绱Unit4鎵╁睍錛氭墿灞昍unner銆?/a>涓紝璁ㄨ浜嗕竴縐嶆墿灞旿Unit4鐨勬柟寮忥紝鍗籌紝鐩存帴淇敼Test Runner鐨勫疄鐜?BlockJUnit4ClassRunner)銆備絾榪欑鏂規硶鏄劇劧涓嶄究浜庣伒媧誨湴娣誨姞鎴栧垹闄ゆ墿灞曞姛鑳姐傛湰鏂囧皢浣跨敤JUnit4.7鎵嶅紑濮嬪紩鍏ョ殑鎵╁睍鏂瑰紡--Rule鏉ュ疄鐜扮浉鍚岀殑鎵╁睍鍔熻兘銆?2010.12.25鏈鍚庢洿鏂?

1. Rule
Rule鏄疛Unit4.7鎵嶅紑濮嬫彁渚涚殑涓縐嶆墿灞曟柟寮忥紝瀹冭兘澶熸浛浠eぇ閮ㄥ垎宸叉湁鐨凴unner鎵╁睍銆侸Unit鍖呭惈涓ょRule Annotation錛欯ClassRule涓嶡Rule銆侤ClassRule搴旂敤浜庢祴璇曠被涓殑闈欐佸彉閲忥紝鑰孈Rule搴旂敤浜庢垚鍛樺彉閲忥紱鐩稿悓鍦版槸錛岃繖浜涘彉閲忓繀欏繪槸TestRule鎺ュ彛鐨勫疄渚嬶紝涓旇闂慨楗扮蹇呴』涓簆ublic銆?br />鍦?a href="http://www.tkk7.com/jiangshachina/archive/2011/12/14/366289.html">涓婄瘒鍗氭枃涓紝瀵笲lockJUnit4ClassRunner榪涜浜嗘墿灞曪紝琚墿灞曠殑鏂規硶鏄痬ethodBlock錛岀幇鍦ㄦ垜浠潵鐪嬬湅璇ユ柟娉曚綋涓殑浠g爜錛?br />
protected Statement methodBlock(FrameworkMethod method) {
    Object test;
    
try {
        test
= new ReflectiveCallable() {
            @Override
            
protected Object runReflectiveCall() throws Throwable {
                
return createTest();
            }
        }.run();
    } 
catch (Throwable e) {
        
return new Fail(e);
    }

    Statement statement
= methodInvoker(method, test);
    statement
= possiblyExpectingExceptions(method, test, statement);
    statement
= withPotentialTimeout(method, test, statement);
    statement
= withBefores(method, test, statement);
    statement
= withAfters(method, test, statement);
    statement
= withRules(method, test, statement);
    
return statement;
}
浣嗗湪BlockJUnit4ClassRunner涓紝possiblyExpectingExceptions()錛寃ithPotentialTimeout()錛寃ithBefores()鍜寃ithAfters()閮藉凡緇忚鏍囨敞涓鴻繃鏃訛紝JUnit寤鴻浣跨敤Rule鏉ユ浛浠h繖浜涙柟娉曠殑鍔熻兘銆?br />
2. TestLogRule
濡傜1鑺傛墍榪幫紝Rule Annotation瑕佷綔鐢ㄤ簬TestRule鎺ュ彛鐨勫疄渚嬶紝閭d箞灝辮鍏堝垱寤轟竴涓猅estRule鐨勫疄鐜扮被銆?br />
public class TestLogRule implements TestRule {

    
private static final DateFormat format = new SimpleDateFormat("yyyy-MM-dd_HH:mm:ss_SSS");

    @Override
    
public Statement apply(Statement base, Description description) {
        TestLogger testLogger 
= description.getAnnotation(TestLogger.class);
        
if (testLogger != null) {
            StringBuilder log 
= new StringBuilder(format.format(new Date()));
            log.append(
" ").append(description.getClassName()).append("#")
                    .append(description.getMethodName()).append(
"")
                    .append(testLogger.log());
        System.out.println(log.toString());
    }

        
return base;
    }
}
濡備笂鎵紺猴紝TestLogRule涓?a href="http://www.tkk7.com/jiangshachina/archive/2011/12/14/366289.html">涓婄瘒鍗氭枃涓殑LoggedRunner鐨勪唬鐮佹湁璁稿鐩稿悓涔嬪錛屽姛鑳藉垯閮芥槸鎵撳嵃鍑烘寚瀹氱殑鏃ュ織錛屾瘡琛屾棩蹇楀張浠ュ綋鏃剁殑鎵ц鏃墮棿涓庡畬鏁存柟娉曞悕浣滀負鍓嶇紑銆?br />
3. 浣跨敤Rule鐨凜alculatorTest
涓嬮潰鏄柊鐨勬祴璇曠被CalculatorTest錛屽畠灝嗕笉浣跨敤BlockJUnit4ClassRunner鐨勬墿灞昄oggedRunner浣滀負嫻嬭瘯鎵ц鍣紝鎵浠ヨ綾繪病鏈変嬌鐢ˊRunWith(LoggedRunner.class)錛岄偅涔堝湪鎵ц璇ユ祴璇曠被鏃朵粛鐒朵細浣跨敤BlockJUnit4ClassRunner銆?br />
public class CalculatorTest {

    
private static Calculator calculator = null;

    @Rule
    
public TestLogRule testLogRule = new TestLogRule();

    @BeforeClass
    
public static void createCalculator() {
        calculator 
= new Calculator();
    }

    @Test
    @TestLogger(log 
= "a simple division")
    
public void simpleDivide() {
        
int value = calculator.divide(82);
        Assert.assertTrue(value 
== 4);
    }

    @Test(expected 
= ArithmeticException.class)
    @TestLogger(log 
= "divided by zero, and an ArithmeticException thrown.")
    
public void dividedByZero() {
        calculator.divide(
80);
    }
}
涓?a href="http://www.tkk7.com/jiangshachina/archive/2011/12/14/366289.html">涓婄瘒鍗氭枃涓殑CalculatorTest鐩告瘮錛屾湰鏂囦腑鐨凜alculatorTest闄や簡娌℃湁浣跨敤LoggedRunner涔嬪錛岃繕澶氫簡涓よ浠g爜
@Rule
public TestLogRule testLogRule = new TestLogRule();
鍦ㄦ墽琛屽崟鍏冩祴璇曟柟娉曚箣鍓嶏紝BlockJUnit4ClassRunner浼氳皟鐢═estRule/TestLogRule涓殑apply()鏂規硶錛屽嵆錛屼細鍏堟墦鍗板嚭鏃ュ織鍐呭銆?br />
4. 灝忕粨
浣跨敤Rule瀵笿Unit榪涜鎵╁睍錛岃兘澶熼伩鍏嶅榛樿Runner鐨勬墿灞曪紝涓烘祴璇曠被娣誨姞鎴栫Щ闄ule鍗佸垎鏂逛究錛岃屼笖Rule瀹炵幇綾繪湰韜篃鑳藉緢鏂逛究鍦拌澶嶇敤銆傚湪涓嬩竴綃囧崥鏂?/a>涓皢榪涗竴姝ユ帰绱ule鐨勫簲鐢ㄣ?/div>

Sha Jiang 2011-12-24 23:26 鍙戣〃璇勮
]]>
鎺㈢儲JUnit4鎵╁睍錛氭墿灞昍unner(鍘?http://www.tkk7.com/jiangshachina/archive/2011/12/14/366289.htmlSha JiangSha JiangTue, 13 Dec 2011 16:01:00 GMThttp://www.tkk7.com/jiangshachina/archive/2011/12/14/366289.htmlhttp://www.tkk7.com/jiangshachina/comments/366289.htmlhttp://www.tkk7.com/jiangshachina/archive/2011/12/14/366289.html#Feedback4http://www.tkk7.com/jiangshachina/comments/commentRss/366289.htmlhttp://www.tkk7.com/jiangshachina/services/trackbacks/366289.html
鎺㈢儲JUnit4鎵╁睍錛氭墿灞昍unner
鍦ㄤ嬌鐢↗Unit鐨勮繃紼嬩腑錛屽ぇ瀹跺彲鑳戒細瀵笿Unit榪涜涓浜涙墿灞曘傛湰鏂囦腑鐨勭ず渚嬩負JUnit4瀹氫箟浜嗕竴涓柊鐨凙nnotation錛屽茍鐩稿簲鍦板宸叉湁鐨凴unner榪涜鎵╁睍錛屼嬌鍏惰兘澶熻В鏋愭柊寮曞叆鐨凙nnotation銆?2011.12.25鏈鍚庢洿鏂?

鏈枃鑷嗛犱簡涓涓ず渚嬶紝浼氬湪鎵ц鍗曞厓嫻嬭瘯鏂規硶涔嬪墠錛岃嚜鍔ㄥ湴涓哄崟鍏冩祴璇曟柟娉曟墦鍗版棩蹇椼傝紺轟緥浼氫負JUnit瀹氫箟涓涓柊鐨凙nnotation鐢ㄤ簬鎸囧畾瑕佹墦鍗扮殑鏃ュ織鍐呭錛屽茍瀵笿Unit榛樿鎻愪緵鐨凴unner瀹炵幇BlockJUnit4ClassRunner榪涜鎵╁睍錛屼嬌鍏惰兘澶熻瘑鍒繖涓柊鐨凙nnotation銆?br />
1. 瀹氫箟Annotation
    TestLogger鏄竴涓綔鐢ㄤ簬鏂規硶鐨凙nnotation錛屽畠鍙湁涓涓睘鎬э紝鐢ㄤ簬鎸囧畾鏃ュ織鐨勫唴瀹癸紝鍏朵唬鐮佸涓嬫墍紺猴紝
@Target({ ElementType.METHOD })
@Retention(RetentionPolicy.RUNTIME)
public @interface TestLogger {
    
public String log() default "";
}

2. 鎵╁睍Runner
    JUnit鎻愪緵浜嗚嫢騫蹭釜Runner鐨勫疄鐜幫紝濡侭lockJUnit4ClassRunner錛孲uite錛屽叾涓瑽lockJUnit4ClassRunner鐢ㄦ潵鎵ц鍗曚釜嫻嬭瘯鐢ㄤ緥綾匯侺oggedRunner灝嗘墿灞旴lockJUnit4ClassRunner錛岃鍐欏叾涓殑methodBlock()鏂規硶銆傛柊鐨刴ethodBlock()鏂規硶浼氬湪涓寮濮嬭瘯鍥捐幏鍙栬鎵ц嫻嬭瘯鏂規硶涓殑TestLogger Annotation錛屽鏋滃瓨鍦ㄧ殑璇濓紝灝變細鎵撳嵃鍑烘寚瀹氱殑鏃ュ織錛屾瘡琛屾棩蹇椾互褰撴椂鐨勬墽琛屾椂闂翠笌瀹屾暣鏂規硶鍚嶄綔涓哄墠緙銆傝綾葷殑浠g爜濡備笅鎵紺猴紝
public class LoggedRunner extends BlockJUnit4ClassRunner {

    
private static final DateFormat format = new SimpleDateFormat("yyyy-MM-dd_HH:mm:ss_SSS");

    
public LoggedRunner(Class<?> klass) throws InitializationError {
        
super(klass);
    }

    @Override
    
protected Statement methodBlock(FrameworkMethod method) {
        Method classMethod 
= method.getMethod();
        TestLogger loggerAnnotation 
= classMethod.getAnnotation(TestLogger.class);
        
if (loggerAnnotation != null) {
            StringBuilder log 
= new StringBuilder(format.format(new Date()));
            log.append(
" ").append(classMethod.getDeclaringClass().getName())
                    .append(
"#").append(classMethod.getName()).append("")
                    .append(loggerAnnotation.log());
            System.out.println(log.toString());
        }

        
return super.methodBlock(method);
    }
}

3. 搴旂敤紼嬪簭
    Calculator鏄竴涓畝鍗曠殑搴旂敤紼嬪簭錛屽叾涓畾涔変簡涓涓櫎娉曟柟娉曪紝浠g爜濡備笅鎵紺猴紝
public class Calculator {

    
public int divide(int a, int b) {
        
return a / b;
    }
}

4. 鍗曞厓嫻嬭瘯紼嬪簭
    CalculatorTest鏄竴涓畝鍗曠殑鍗曞厓嫻嬭瘯紼嬪簭錛屽畠浼氫嬌鐢ㄤ袱縐嶆柟寮忓Calculator涓殑divide()鏂規硶榪涜鍗曞厓嫻嬭瘯銆傚叾浠g爜濡備笅鎵紺猴紝
@RunWith(LoggedRunner.class)
public class CalculatorTest {

    
private static Calculator calculator = null;

    @BeforeClass
    
public static void createCalculator() {
        calculator 
= new Calculator();
    }

    @Test
    @TestLogger(log 
= "a simple division.")
    
public void simpleDivide() {
        
int value = calculator.divide(82);
        Assert.assertTrue(value 
== 4);
    }

    @Test(expected 
= ArithmeticException.class)
    @TestLogger(log 
= "divided by zero, and an ArithmeticException thrown.")
    
public void dividedByZero() {
        calculator.divide(
80);
    }
}

鍊煎緱娉ㄦ剰鐨勬槸錛孋alculatorTest鐗瑰埆鎸囧畾LoggedRunner浣滀負嫻嬭瘯鎵ц鍣?@RunWith(LoggedRunner.class))錛涘悓鏃訛紝姣忎釜鍗曞厓嫻嬭瘯鏂規硶錛宻impleDivide()涓巇ividedByZero()錛岄兘浣跨敤浜咥nnotation TestLogger錛屼負鍏舵寚瀹氭棩蹇楀唴瀹廣傚綋鎵ц涓婅堪鍗曞厓嫻嬭瘯鏃訛紝浼氳嚜鍔ㄥ湴鎵撳嵃鍑哄涓嬪艦寮忕殑鏃ュ織鍐呭錛?br />
2011-12-13_23:48:38_218 test.CalculatorTest#simpleDivide: a simple division
2011-12-13_23:48:38_218 test.CalculatorTest#dividedByZero: divided by zero, and an ArithmeticException thrown.

5. 灝忕粨
閫氳繃瀵笲lockJUnit4ClassRunner鐨勬墿灞曪紝鍙互璁㎎Unit鍦ㄨ繍琛屾祴璇曠敤渚嬫椂鍋氫竴浜涢澶栫殑宸ヤ綔銆備絾榪欑鐩存帴淇敼榛樿Test Runner鐨勬柟寮忓茍涓嶈鎻愬★紝鍦?a href="http://www.tkk7.com/jiangshachina/archive/2011/12/24/366801.html">涓嬩竴綃囨枃绔?/a>涓皢浼氫粙緇嶄嬌鐢═est Rule鏉ヨ揪鍒扮浉鍚岀殑鎵╁睍鐩殑銆?br /> 

Sha Jiang 2011-12-14 00:01 鍙戣〃璇勮
]]>
浣曟椂緙栧啓鍗曞厓嫻嬭瘯錛?璇?http://www.tkk7.com/jiangshachina/archive/2008/06/09/206812.htmlSha JiangSha JiangMon, 09 Jun 2008 12:55:00 GMThttp://www.tkk7.com/jiangshachina/archive/2008/06/09/206812.htmlhttp://www.tkk7.com/jiangshachina/comments/206812.htmlhttp://www.tkk7.com/jiangshachina/archive/2008/06/09/206812.html#Feedback2http://www.tkk7.com/jiangshachina/comments/commentRss/206812.htmlhttp://www.tkk7.com/jiangshachina/services/trackbacks/206812.html浣曟椂緙栧啓鍗曞厓嫻嬭瘯錛?/span>
    鏄湪緙栧啓涓涓柟娉曚箣鍓嶅氨緙栧啓瀹冪殑鍗曞厓嫻嬭瘯錛岃繕鏄湪鍐欏畬榪欎釜鏂規硶錛岀敋鑷蟲槸鏁翠釜綾諱箣鍚庢墠緙栧啓鍗曞厓嫻嬭瘯鍛紵John Ferguson Smart[1]鍦ㄤ粬鐨?a >blog涓啀嬈℃彁鍑轟簡榪欎釜闂錛屽茍鏍規嵁鑷繁鐨勭粡楠岀粰鍑轟簡涓浜涘緩璁?2008.06.10鏈鍚庢洿鏂?

    閮藉埆涔︾敓鎰忔皵浜嗐傚湪浣犵紪鍐欎竴涓柟娉曚箣鍓嶆垨鏄箣鍚庣紪鍐欏崟鍏冩祴璇?-鏍規嵁鎴戠殑緇忛獙錛屽彧瑕佷綘鍦ㄧ紪鍐欎唬鐮佺殑鍑犱箮鍚屾椂灝辮冭檻騫剁紪鍐欏崟鍏冩祴璇曠▼搴忥紝閭d箞榪欏氨鏃犲叧绱ц浜嗐傝繃鍚庡啀榪斿洖鍘?鎴栬呮牴鏈氨涓嶅洖鍘?鍐欐祴璇曠▼搴忓皢瀵艱嚧闂銆傚氨鎴戜釜浜鴻岃█錛屾垜鍠滄鍦ㄧ紪鍐欏皯閲忎唬鐮佷箣鍓嶆垨绱ф帴鐫鐨勪箣鍚庡氨緙栧啓鍗曞厓嫻嬭瘯--榪欎笉浼氭墦鐮村伐浣滄祦紼嬶紝鍥犱負瀹冨氨鏄祦紼嬬殑涓閮ㄥ垎銆?br />     榪欓渶瑕佷竴鐐瑰効瀹炶返緇忛獙--緙轟箯緇忛獙鐨勫紑鍙戣呯粡甯鎬負瑕佸啓浠涔堟牱鐨勬祴璇曠▼搴忚岀儲鎭箋備絾榪欏彲鑳戒篃鍙嶆槧鍑轟竴涓簨瀹烇細浠栦滑鍚屾牱涔熶笉鐭ラ亾瑕佸啓浠涔堟牱鐨勪唬鐮併備竴浜涗漢璇勮TDD鑳藉榧撳姳榪涜寰璁?-涓縐嶉潪甯稿簳灞傜殑璁捐錛屽畠涓嶉渶瑕佽冭檻杈冨ぇ鐨勫満鏅傝繖浼氬彂鐢熷湪緙轟箯緇忛獙鐨勫紑鍙戣呰韓涓婏紱濡傛灉浣犳暀鏉¤埇鍦板簲鐢ㄨ繖縐嶆柟娉曪紝鍚屾牱涔熶細閬囦笂銆傚儚琛屼負椹卞姩寮鍙戣繖鏍風殑鏂規硶鍦ㄦ澶勫氨浼氬緢閰楓傚綋浣犲湪鍐檊etter鏂規硶涔嬪墠錛屼綘浼氬啓涓涓拡瀵硅繖涓猤etter鏂規硶鐨勫崟鍏冩祴璇曞悧錛熷鏋滄槸鐨勮瘽錛岄偅涔堜綘鐨勫崟鍏冩祴璇曚笓娉ㄧ殑灞傛灝辮緝楂樹簡錛屼篃浼氭洿鎺ヨ繎浜庣敤鎴?鎴栫郴緇?鐨勯渶姹傘?br />     鍥炲埌闂鐨勬湰璐紝涓轟粈涔堟垜鍠滄鎶婂崟鍏冩祴璇曟斁鍦ㄦ渶寮濮嬬殑浣嶇疆錛熷緢綆鍗曪紒鎴戠殑瀹炶返緇忛獙鍛婅瘔鎴戯紝閭f牱鍙互甯姪鎻愰珮浠g爜鐨勮川閲忥紝騫朵笖鑺傜害璋冭瘯鏃墮棿銆傚湪寮濮嬫椂鍐欏崄涓皬鐨勫崟鍏冩祴璇曟墍鑺辯殑鏃墮棿姣斿湪浠ュ悗淇Bug鎵鑺辯殑鏃墮棿瑕佸皯錛屽鏋滀唬鐮佺粡榪囦簡姝g‘鐨勫崟鍏冩祴璇曪紝閭e氨涓嶄細鏈塀ug浜嗐?br />     浜嬪疄涓婏紝鎴戝薄灞¤鍒幫紝濡傛灉鏌愪簺浠g爜緇忚繃浜嗛傚綋鐨勫崟鍏冩祴璇曪紝閭d箞灝變笉浼氭湁緙栫爜闂銆傛渶榪戝氨鏈変竴涓緥瀛愶細鑺變簡涓涓皬鏃剁殑鏃墮棿鍘繪悳瀵籛eb搴旂敤涓殑涓涓棶棰橈紝璇ラ棶棰樺嚭鐜板湪涓涓紪鍐欐紜殑Spring-MVC紼嬪簭涓傜粨鏋滄槸鐢變簬涓涓楠屽櫒綾誨拷鐣ヤ簡涓涓紓甯搞傚緢瀹規槗灝卞彂鐜頒簡榪欎釜闂錛屽疄闄呬笂錛屽湪鐪嬩簡浠g爜(浠g爜媯鏌?Code Review)涔熷緢鏈夋晥)涔嬪悗绔嬪埢灝卞彂鐜頒簡銆備絾鍏抽敭鏄紝鎴戜滑鑺變簡涓涓皬鏃剁敋鑷蟲洿澶氱殑鏃墮棿鍘繪壘榪欎釜闇瑕佽繘琛屾鏌ョ殑綾匯傚鏋滆繖浜涗唬鐮佺粡榪囦簡閫傚綋鐨勬祴璇曪紝閭d箞灝辮兘寰堝揩鍦板彂鐜板茍瑙e喅榪欎釜闂銆?br />     鏍規嵁鎴戠殑緇忛獙錛屽綋浜轟滑鍦ㄧ紪鍐欏畬紼嬪簭涔嬪悗鎵嶅紑濮嬬紪鍐欏崟鍏冩祴璇曪紝灝卞鍚屼簨鍚庢墠鏈夎繖鏍風殑鎯蟲硶錛屼粬浠緢闅懼啓鍑鴻繖浜涙祴璇曚簡 ("鎴戝凡緇忓畬鎴愪簡鎵鏈夌殑浠g爜錛屾鏃舵垜榪樺緱鍘誨啓鍗曞厓嫻嬭瘯")銆傛垨鑰呮牴鏈氨涓嶅幓鍋氥傚湪榪欑鎯呭喌涓嬶紝浠g爜鏄惁瀹屾垚浜嗗憿錛熷鏋滀唬鐮佽繍琛屽湴寰堝ソ錛岄偅灝辯畻鏄畬鎴愪簡銆傝繖鏍風殑璇濓紝鍐嶅啓鍗曞厓嫻嬭瘯灝卞ぇ澶у湴涓уけ浜嗗畠鐨勪環鍊箋傝繕涓嶄粎濡傛錛屼簨鍚庣紪鍐欑殑鍗曞厓嫻嬭瘯灝嗘槸鑲ゆ祬鐨勶紝涓嶄細瀵逛唬鐮佽繘琛岃壇濂藉湴嫻嬭瘯銆傛垨鑰咃紝寮鍙戣呭凡緇忚楀畬浜嗘椂闂達紝浠栦滑鏍規湰灝變笉鎯沖啀涓哄崟鍏冩祴璇曚激紲炰簡銆?br />     TDD涓庝換浣曞叾瀹冪殑緙栫爜瀹炶返涓鏍楓傚綋浣犳鍦ㄥ涔犳煇涓柊鐨勬妧鏈椂錛屼綘浼氬懼悜浜庡瀛︿範鎸囧浜︽浜﹁秼銆傜被浼煎湴錛屽綋浣犲涔犱竴欏規鏈椂錛屼綘涔熶細璇曠潃涓姝ユ鍦版ā浠垮ぇ甯堢殑鍔ㄤ綔錛岃屼笉蹇呭幓鐞嗚В鍏朵腑鐨勯昏緫銆備竴鏃︿綘鐔熸倝浜嗘煇涓妧鏈紝鑳藉鐔熺粌鍦頒嬌鐢ㄥ畠錛屽茍瀵瑰畠鏈変簡鏇存繁鍏ュ湴鐞嗚В錛?em>鐒跺悗錛屼綘灝辮兘鏀硅繘瀹冿紝騫朵笌浣犱箣鍓嶆帉鎻$殑鍏跺畠鎶鏈繘琛屾憾鍚堜簡銆?br />
璇戞敞
[1]John鏄?a >Java Power Tools涓涔︾殑涓諱綔鑰咃紝涔熸槸java.net涓竴浣嶆椿璺冪殑Blogger銆?br />
璇戝悗
    涓婂懆鍦╦ava.net涓婄湅鍒拌繖綃嘊log錛屽啀鑱旀兂鍒拌嚜宸卞湪騫蟲椂宸ヤ綔涓殑鍗曞厓嫻嬭瘯瀹炶返錛屾湁浜涙劅瑙︼紝鏁呭皢鍏剁炕璇戜簡鍑烘潵錛屼笌澶у鍏變韓銆?br />     浜嬪厛灝辯紪鍐欏崟鍏冩祴璇曪紝榪樻槸浜嬪悗鎵嶇紪鍐欏崟鍏冩祴璇曪紵榪欐槸涓涓侀棶棰樸傛寜鐓DD鐨勬濇兂錛岃嚜鐒舵槸瑕佸厛緙栧啓鍗曞厓嫻嬭瘯錛岀劧鍚庡啀緙栧啓鑳藉閫氳繃璇ュ崟鍏冩祴璇曠殑鏂規硶銆?br />     浣嗭紝鍗曞厓嫻嬭瘯騫朵笉鏄疶DD鐨勪笓灞為鍦幫紝寰堝涓嶅疄璺礣DD鐨勯」鐩篃鍦ㄥ簲鐢ㄧ潃鍗曞厓嫻嬭瘯銆?br />     鎴戣涓猴紝鍦ㄤ笉瀹炶返TDD鐨勯」鐩腑(鎴戣嚜宸辨墍澶勭殑鐜灝辨槸濡傛)錛屼簨鍚庣紪鍐欏崟鍏冩祴璇曚粛鏈夌潃鍏跺悎鐞嗘э細
    1. 浠ユ秷鏋佺殑鎬佸害鏉ョ湅錛屾棦鐒墮」鐩湰韜笉涓ユ牸瑕佹眰浜嬪厛緙栧啓鍗曞厓嫻嬭瘯錛岄偅涔堝氨鍙互鍦ㄤ簨鍚庡幓鍋氫簡銆傝繖鑷沖皯姣斾笉鍘誨仛瑕佸ソ錛岃亰鑳滀簬鏃犲槢銆?鍢垮樋錛屾槸澶熸秷鏋佺殑錛屼絾涔熸嬁浣犳病鍔炴硶)
    2. 浜嬪悗緙栧啓鍗曞厓嫻嬭瘯鑷沖皯涔熸槸涓縐嶆楠屾墜孌碉紝褰撶劧錛岃偗瀹氭瘮涓嶄笂浜嬪厛緙栧啓鐨勫崟鍏冩祴璇曘傚洜涓猴紝浜嬪悗緙栧啓鐨勫崟鍏冩祴璇曞緢鍙兘浼?灝嗗氨"宸茬粡鍐欏ソ鐨勫簲鐢ㄧ▼搴忥紝姝eJohn鎵璇?浜嬪悗緙栧啓鐨勫崟鍏冩祴璇曞皢鏄偆嫻呯殑錛屼笉浼氬浠g爜榪涜鑹ソ鍦版祴璇?銆備絾...浠嶇劧鏄亰鑳滀簬鏃犲槢 :-D (鍝堝搱錛屾湁瀹屾病瀹屼簡)
    3. 鍙互鎶婂崟鍏冩祴璇曪紝鍏朵腑灝卞寘鍚簨鍚庡崟鍏冩祴璇曪紝浣滀負"鍚庢潵鑰?浜嗚В銆佸涔犲簲鐢ㄧ▼搴忕殑鎵嬫銆傚洜涓哄崟鍏冩祴璇曠▼搴忓氨鏄簲鐢ㄧ▼搴忕殑"瀹㈡埛"錛屾墍浠ユ棤璁哄畠鏄簨鍏堝啓鐨勶紝榪樻槸浜嬪悗鍐欑殑錛岄兘鑳藉琛ㄧ幇鍑哄簲鐢ㄧ▼搴忕殑琛屼負銆?br />     4. 浜嬪悗鍗曞厓嫻嬭瘯錛屼篃鍙兘杞寲涓轟簨鍏堝崟鍏冩祴璇曘傚湪搴旂敤紼嬪簭鐨勬暣涓敓鍛藉懆鏈熶腑錛岀淮鎶ら樁孌墊槸鏈闀跨殑銆傚湪"婕暱"鐨勭淮鎶よ繃紼嬩腑錛?涔嬪墠"鎵鍐欑殑"浜嬪悗"鍗曞厓嫻嬭瘯灝嗕細鎴愪負"鍚庢潵鑰?(鍖呮嫭鍘熷浣滆呮湰浜?鐨?浜嬪厛"鍗曞厓嫻嬭瘯銆傚湪鏀硅繘紼嬪簭鐨勮繃紼嬩腑錛岃繖浜涘崟鍏冩祴璇曚粛鐒惰兘璧峰埌鐩戠潱鐨勪綔鐢ㄣ?orz錛屾湁鐐瑰効璇¤京)
    铏界劧錛屼簨鍚庡崟鍏冩祴璇曟槑鏄句笉濡備簨鍏堝崟鍏冩祴璇曪紝浣嗗畠鐨勪綔鐢ㄤ粛鐒朵笉鍙綆浼般傚彧瑕佺紪鍐欎簡浼樼鐨勫崟鍏冩祴璇曠▼搴忥紝鏃犺鏄湪鍝釜闃舵錛屽畠閮戒細瀵規敼榪涘簲鐢ㄧ▼搴忔湁鑾ぇ鐨勫府鍔┿?榪欏彲涓嶆槸"鑱婅儨浜庢棤"鑳藉琛ㄨ揪鐨?



Sha Jiang 2008-06-09 20:55 鍙戣〃璇勮
]]>
主站蜘蛛池模板: 亚洲综合无码一区二区痴汉| 国产亚洲视频在线观看| 丁香花免费完整高清观看| 亚洲日本天堂在线| 亚洲自偷自偷图片| 歪歪漫画在线观看官网免费阅读| 污视频网站在线免费看| 亚洲av无码乱码国产精品| 免费毛片在线看片免费丝瓜视频 | 亚洲免费在线视频播放| 亚洲av日韩综合一区久热| 久久亚洲国产精品123区| 99国产精品免费视频观看| 亚洲成a人无码亚洲成www牛牛| 亚洲国产精品久久久天堂| 免费无码又爽又刺激高潮的视频| a级毛片免费在线观看| 亚洲欧美日韩综合久久久久| 亚洲产国偷V产偷V自拍色戒| 成人国产mv免费视频| 3344永久在线观看视频免费首页| 国产亚洲综合久久| 亚洲国产av高清无码| 亚洲综合伊人久久综合| 在线观看91精品国产不卡免费| 亚洲欧洲免费视频| 亚洲阿v天堂在线2017免费| 亚洲影院天堂中文av色| 久久精品国产亚洲AV大全| 久久国产精品免费观看| 337P日本欧洲亚洲大胆精品| 亚洲精品午夜视频| 亚洲AV无码专区国产乱码电影| 免费一看一级毛片人| a级毛片无码免费真人| 91成人在线免费视频| 国产中文字幕在线免费观看| 美女的胸又黄又www网站免费| 久久久久亚洲精品天堂久久久久久| 四虎永久在线精品免费网址 | 成人无遮挡毛片免费看|