Test a little ,code a little ,實(shí)戰(zhàn)junit
Notyy的junit教程(一)
有了junit,java程序的單元測(cè)試變成非常簡(jiǎn)單的事。而在寫(xiě)代碼前先寫(xiě)測(cè)試這個(gè)似乎不可思議的規(guī)定也變的十分合理而且能有效的幫助程序的設(shè)計(jì)。
下面是一個(gè)aclearcase/" target="_blank" >ccountbean的例子,假設(shè)我們要實(shí)現(xiàn)一個(gè)帳戶(hù)管理程序,能夠向帳戶(hù)中增加、減少金額,還能在帳戶(hù)間轉(zhuǎn)帳。很顯然需要有一個(gè)account類(lèi),且慢寫(xiě)代碼!在寫(xiě)代碼前先寫(xiě)測(cè)試,測(cè)試如何寫(xiě)?假設(shè)你已經(jīng)有這個(gè)account類(lèi),你希望如何使用它?顯然首先要初始化它,一個(gè)帳戶(hù)應(yīng)該知道他的擁有者,和他現(xiàn)有的金額,那么他應(yīng)該有個(gè)構(gòu)建器形如:
account(String Owner,double Balance);那先寫(xiě)測(cè)試這個(gè)構(gòu)建器的代碼,如下:
package account;
import junit.framework.TestCase;
public class AccountTest extends TestCase {
private Account AccountA;
private Account AccountB;
public AccountTest(String name) {
super(name);
}
public static void main(String args[]) {
junit.textui.TestRunner.run(AccountTest.class);
}
public void testAccount(){
AccountA=new Account("notyy",100);
AccountB=new Account("bricks",200);
assertEquals("notyy",AccountA.Owner);
assertEquals(100,AccountA.Balance,2);
assertEquals("bricks",AccountB.Owner);
assertEquals(200,AccountB.Balance,2);
}
}這段代碼無(wú)法編譯,因?yàn)闆](méi)有account類(lèi),我們來(lái)為account類(lèi)寫(xiě)個(gè)骨架,使他能夠編譯。代碼如下:
package account;
public class Account {
private String Owner;
private double Balance;
public Account(String aOwner,double aBalance) {
}
}
編譯后,寫(xiě)個(gè)批命令來(lái)運(yùn)行測(cè)試程序,如下:
test.bat
java -cp %classpath%;d:javaprjaccountclasses account.AccountTest
別忘了把junit.jar包含在你的classpath里,junit的配置這里不再多說(shuō)。
運(yùn)行test.bat得到如下結(jié)果
FAILURES!!!
Test Results:
Run:1 Failure :1 Errors:0
There was 1 failure
1) testAccount(account.AccountTest) “expected . but was ”
感覺(jué)如何,測(cè)試程序得出了我們預(yù)料的結(jié)果,因?yàn)闃?gòu)建器還沒(méi)有實(shí)現(xiàn)呢!
現(xiàn)在我們來(lái)實(shí)現(xiàn)構(gòu)建器
public Account(String aOwner,double aBalance) {
Owner=aOwner;
Balance=aBalance;
}