国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學院 > 開發設計 > 正文

notyy的junit教程

2019-11-18 15:48:49
字體:
來源:轉載
供稿:網友

  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單元測試的第一個例子就寫到這吧。很簡單吧?進入討論組討論。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 乐山市| 鄄城县| 灵武市| 牡丹江市| 蒙阴县| 澄城县| 舒兰市| 翼城县| 行唐县| 阿克苏市| 定日县| 北碚区| 班戈县| 西盟| 顺平县| 克什克腾旗| 阆中市| 安徽省| 宣城市| 马尔康县| 贡嘎县| 凤冈县| 兴化市| 巴南区| 清新县| 商城县| 都匀市| 炎陵县| 衡阳县| 察雅县| 厦门市| 锦州市| 宽甸| 汉川市| 三都| 浪卡子县| 台南县| 高台县| 贵德县| 定州市| 香格里拉县|