Test a little ,code a little ,實戰junit
Notyy的junit教程(一)
有了junit,java程序的單元測試變成非常簡單的事。而在寫代碼前先寫測試這個似乎不可思議的規定也變的十分合理而且能有效的幫助程序的設計。
下面是一個accountbean的例子,假設我們要實現一個帳戶管理程序,能夠向帳戶中增加、減少金額,還能在帳戶間轉帳。很顯然需要有一個account類,且慢寫代碼!在寫代碼前先寫測試,測試如何寫?假設你已經有這個account類,你希望如何使用它?顯然首先要初始化它,一個帳戶應該知道他的擁有者,和他現有的金額,那么他應該有個構建器形如:
account(String Owner,double Balance);那就先寫測試這個構建器的代碼,如下:
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);
}
}這段代碼無法編譯,因為沒有account類,我們來為account類寫個骨架,使他能夠編譯。代碼如下:
package account;
public class Account {
private String Owner;
private double Balance;
public Account(String aOwner,double aBalance) {
}
}
編譯后,寫個批命令來運行測試程序,如下:
test.bat
java -cp %classpath%;d:\javaprj\account\classes account.AccountTest
別忘了把junit.jar包含在你的classpath里,junit的配置這里不再多說。
運行test.bat得到如下結果
FAILURES!!!
Test Results:
Run:1 Failure :1 Errors:0
There was 1 failure
1) testAccount(account.AccountTest) “expected . but was ”
感覺如何,測試程序得出了我們預料的結果,因為構建器還沒有實現呢!
現在我們來實現構建器
public Account(String aOwner,double aBalance) {
Owner=aOwner;
Balance=aBalance;
}
得到結果:
OK!
測試通過,說明我們的構建器沒有問題!
現在我們來refactoring一下,考慮上面的類有什么問題?owner和balance不應該能直接被外界訪問的吧。把他們改成兩個私有變量,然后用2個get方法來讀取他們。盡管xp explore上建議連getxxx和setxxx方法也該測試,我個人是覺得這樣過于麻煩的:)所以就省了。如果用get方法的話測試程序需要改變一下
改成形如:assertEquals("notyy",AccountA.getOwner());就行了。
為account類增加2個get方法:
public String getOwner(){
return Owner;
}
public double getBalance(){
return Balance;
}
編譯,運行test.bat
OK!一次通過。咱們繼續。Account類可以給自己的帳戶里加錢(credit),方法形如 Account.credit(double aMoney);
先寫testcredit
public void testCredit(){
AccountA=new Account("notyy",100);
AccountB=new Account("bricks",200);
AccountA.credit(100);
//100+100=200
assertEquals(200,AccountA.getBalance(),2);
AccountB.credit(150);
//200+150=350
assertEquals(350,AccountB.getBalance(),2);
}
無法編譯,因為account類沒有credit方法,咱們給他加個方法骨架:
public void credit(double aMoney){
}
編譯通過,運行test.bat,失。
“expected <200.0> but <100.0>”
現在實現credit方法,如下:
public void credit(double aMoney){
Balance+=aMoney;
}
再次編譯運行,OK。2 tests)
哇,轉眼寫了這么長的文章了:)
今天累了。明天再寫。
繼續:)
再來實現扣減方法,和增加幾乎一樣,原樣處理。
先寫test
public void testDiscount(){
AccountA=new Account("notyy",100);
AccountB=new Account("bricks",200);
AccountA.discount(50);
//100-50=50
assertEquals(50.00,AccountA.getBalance(),2);
AccountB.discount(120);
//200-120=80
assertEquals(80,AccountB.getBalance(),2);
}
然后實現
public void discount(double aMoney){
Balance-=aMoney;
}
最后是轉帳功能,轉帳是從一個帳戶轉到另一個帳戶。其實是調用一個帳戶的增加功能和另一個帳戶的減少功能。
每個測試里都要建立accountA和accountB是不是很煩,junit考慮到了這一點,所以可以覆蓋testcase的setUp方法,在該方法內建立一些所有test都要用到的變量等。
public void setUp(){
AccountA=new Account("notyy",100);
AccountB=new Account("bricks",200);
}
這樣,所有的測試方法中都不用再建立這兩個實例了。:)
好,寫轉帳方法的測試
public void testTransfer(){
AccountA.transfer(AccountB,80.00);
//100-80=20
//200+80=280
assertEquals(20.00,AccountA.getBalance(),2);
assertEquals(280.00,AccountB.getBalance(),2);
}
然后建立transfer方法的框架,使它能編譯:
public void transfer(Account aAccount,double aBalance){}
測試時報失敗,expected “20” but was “100”
然后填入實現 :
public void transfer(Account aAccount,double aBalance){
this.discount(aBalance);
aAccount.credit(aBalance);
}
test OK!
簡單的步驟,卻可使你對你實現的方法的正確性確信無疑,而且寫測試的過程也是設計的過程,如果在寫一個方法前,你連應該得到的輸出都想不明白,又怎么能動手去寫呢?
誰說XP只要code,不要設計呢? :)
好了,junit單元測試的第一個例子就寫到這吧。很簡單吧?
文章來源于領測軟件測試網 http://www.kjueaiud.com/
版權所有(C) 2003-2010 TestAge(領測軟件測試網)|領測國際科技(北京)有限公司|軟件測試工程師培訓網 All Rights Reserved
北京市海淀區中關村南大街9號北京理工科技大廈1402室 京ICP備10010545號-5
技術支持和業務聯系:info@testage.com.cn 電話:010-51297073
老湿亚洲永久精品ww47香蕉图片_日韩欧美中文字幕北美法律_国产AV永久无码天堂影院_久久婷婷综合色丁香五月