亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

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

JUnit實施

2019-11-18 13:06:40
字體:
來源:轉載
供稿:網友

  測試的概念
  回歸測試框架-JUnit
  Design by Contract
  Refactoring
  IDE對JUnit的支持
  JUnit簡介
  安裝
  Fixture
  TestCase
  TestSuite
  TestRunner
  JUnit最佳實踐
  JUnit與J2EE
  測試的概念
   長期以來,我所接觸的軟件開發人員很少有人能在開發的過程中進行測試工作。大部分的項目都是在最終驗收的時候編寫測試文檔。有些項目甚至沒有測試文檔?,F在情況有了改變。我們一直提倡UML、RUP、軟件工程、CMM,目的只有一個,提高軟件編寫的質量。舉一個極端的例子:假如你是一個超級程序設計師,一個傳奇般的人物。(你可以一邊喝咖啡,一邊聽著音樂,同時編寫這操作系統中關于進程調度的模塊,而且兩天時間內就完成了?。┪艺娴贸姓J,有這樣的人。(那個編寫UNIX中的vi編輯器的家伙就是這種人。)然而非常遺憾的是這些神仙們并沒有留下如何修成正果的README。所以我們這些凡人--在同一時間只能將注重力集中到若干點(據科學統計,我并不太相信,一般的人只能同時考慮最多7個左右的問題,高手可以達到12個左右),而不能既縱覽全局又了解細節--只能期望于其他的方式來保證我們所編寫的軟件質量。
   為了說明我們這些凡人是如何的笨。有一個聰明人提出了軟件熵(software entropy)的概念:一個程序從設計很好的狀態開始,隨著新的功能不斷地加入,程序逐漸地失去了原有的結構,最終變成了一團亂麻。你可能會爭辯,在這個例子中,設計很好的狀態實際上并不好,假如好的話,就不會發生你所說的情況。是的,看來你變聰明了,可惜你還應該注重到兩個問題:1)我們不能指望在恐龍紀元(大概是十年前)設計的結構到了現在也能適用吧。2)擁有簽字權的客戶代表可不理會加入一個新功能是否會對軟件的結構有什么影響,即便有影響也是程序設計人員需要考慮的問題。假如你拒絕加入這個你認為致命的新功能,那么你很可能就失去了你的住房貸款和面包(對中國工程師來說也許是米飯或面條,要看你是南方人還是北方人)。
   另外,需要說明的是我看過的一些講解測試的書都沒有我寫的這么有人情味(不好意思...)。我希望看到這片文章的兄弟姐妹能很輕易地接受測試的概念,并付諸實施。所以有些地方寫的有些夸張,歡迎對測試有深入理解的兄弟姐妹能體察民情,并不吝賜教。
   好了,我們現在言歸正傳。要測試,就要明白測試的目的。我認為測試的目的很簡單也極具吸引力:寫出高質量的軟件并解決軟件熵這一問題。想象一下,假如你寫的軟件和Richard Stallman(GNU、FSF的頭兒)寫的一樣有水準的話,是不是很有成就感?假如你一致保持這種高水準,我保證你的薪水也會有所變動。
   測試也分類,白箱測試、黑箱測試、單元測試、集成測試、功能測試...。我們先不管有多少分類,如何分類。先看那些對我們有用的分類,關于其他的測試,有愛好的人可參閱其他資料。白箱測試是指在知道被測試的軟件如何(How)完成功能和完成什么樣(What)的功能的條件下所作的測試。一般是由開發人員完成。因為開發人員最了解自己編寫的軟件。本文也是以白箱測試為主。黑箱測試則是指在知道被測試的軟件完成什么樣(What)的功能的條件下所作的測試。一般是由測試人員完成。黑箱測試不是我們的重點。本文主要集中在單元測試上,單元測試是一種白箱測試。目的是驗證一個或若干個類是否按所設計的那樣正常工作。集成測試則是驗證所有的類是否能互相配合,協同完成特定的任務,目前我們暫不關心它。下面我所提到的測試,除非非凡說明,一般都是指單元測試。
   需要強調的是:測試是一個持續的過程。也就是說測試貫穿與開發的整個過程中,單元測試尤其適合于迭代增量式(iterative and incremental)的開發過程。Martin Fowler(有點兒像引用孔夫子的話)甚至認為:“在你不知道如何測試代碼之前,就不應該編寫程序。而一旦你完成了程序,測試代碼也應該完成。除非測試成功,你不能認為你編寫出了可以工作的程序?!蔽也⒉恢竿械拈_發人員都能有如此高的覺悟,這種層次也不是一蹴而就的。但我們一旦了解測試的目的和好處,自然會堅持在開發過程中引入測試。 因為我們是測試新手,我們也不理會那些復雜的測試原理,先說一說最簡單的:測試就是比較預期的結果是否與實際執行的結果一致。假如一致則通過,否則失敗??聪旅娴睦樱?br />  
  //將要被測試的類
  public class Car{
  public int getWheels() {
  return 4;
  }
  }
  
  //執行測試的類
  public class testCar {
  public static void main(String[] args) {
  testCar myTest = new testCar();
  myTest.testGetWheels();
  }
  
  public testGetWheels () {
  int eXPectedWheels = 4;
  Car myCar = Car();
  if (expectedWheels==myCar.getWheels())
  System.out.  else
  System.out.println("test [Car]: getWheels DOESN'T work!");
  }
  }
  
   假如你立即動手寫了上面的代碼,你會發現兩個問題,第一,假如你要執行測試的類testCar,你必須必須手工敲入如下命令:
  
  [Windows] d:>
java testCar
  [Unix] % java testCar
  
   即便測試如例示的那樣簡單,你也有可能不愿在每次測試的時候都敲入上面的命令,而希望在某個集成環境中(IDE)點擊一下鼠標就能執行測試。后面的章節會介紹到這些問題。第二,假如沒有一定的規范,測試類的編寫將會成為另一個需要定義的標準。沒有人希望查看別人是如何設計測試類的。假如每個人都有不同的設計測試類的方法,光維護被測試的類就夠煩了,誰還顧得上維護測試類?另外有一點我不想提,但是這個問題太明顯了,測試類的代碼多于被測試的類!這是否意味這雙倍的工作?不!1)不論被測試類-Car
   的 getWheels 方法如何復雜,測試類-testCar 的testGetWheels
   方法只會保持一樣的代碼量。2)提高軟件的質量并解決軟件熵這一問題并不是沒有代價的。testCar就是代價。
   我們目前所能做的就是盡量降低所付出的代價:我們編寫的測試代碼要能被維護人員輕易的讀取,我們編寫測試代碼要有一定的規范。最好IDE工具可以支持這些規范。好了,你所需要的就是JUnit。一個Open Source的項目。用其主頁上的話來說就是:“ JUnit是由 Erich Gamma 和 Kent Beck 編寫的一個回歸測試框架(regression testing framework)。用于Java開發人員編寫單元測試之用。”所謂框架就是Erich Gamma 和 Kent Beck 定下了一些條條框框,你編寫的測試代碼必須遵循這個條條框框:繼續某個類,實現某個接口。其實也就是我們前面所說的規范。好在JUnit目前得到了大多數軟件工程師的認可。遵循JUnit我們會得到很多的支持。回歸測試就是你不斷地對所編寫的代碼進行測試:編寫一些,測試一些,調試一些,然后循環這一過程,你會不斷地重復先前的測試,哪怕你正編寫其他的類,由于軟件熵的存在,你可能在編寫第五個類的時候發現,第五個類的某個操作會導致第二個類的測試失敗。通過回歸測試我們抓住了這條大Bug。
  
  回歸測試框架-JUnit
   通過前面的介紹,我們對JUnit有了一個大概的輪廓。知道了它是干什么的?,F在讓我們動手改寫上面的測試類testCar使其符合Junit的規范--能在JUnit中運行。
  
  //執行測試的類(JUnit版)
  import junit.framework.*;
  
  public class testCar extends TestCase {
  
  protected int expectedWheels;
  protected Car myCar;
  
  public testCar(String name) {
  super(name);
  }
  
  protected void setUp() {
  expectedWheels = 4;
  myCar = new Car();
  }
  
  public static Test suite() {
  /*
  * the type safe way
  *
  TestSuite suite= new TestSuite();
  suite.addTest(
  new testCar("Car.getWheels") {
  protected void runTest() { testGetWheels(); }
  }
  );
  return suite;
  */
  
  /*
  * the dynamic way
  */
  return new TestSuite(testCar.class);
  }
  
  public void testGetWheels() {
  assertEquals(expectedWheels, myCar.getWheels());
  }
  }
  
   改版后的testCar已經面目全非。先讓我們了解這些改動都是什么含義,再看如何執行這個測試。
   1>import語句,引入JUnit的類。(沒問題吧)
   2>繼續 TestCase ??梢詴簳r將一個TestCase看作是對某個類進行測試的方法的集合。具體介紹請參看JUnit資料
   3>setUp()設定了進行初始化的任務。我們以后會看到setUp會有非凡的用處。
   4>testGetWheeels()對預期的值和myCar.getWheels()返回的值進行比較,并打印比較的結果。assertEquals是junit.framework.Assert中所定義的方法,junit.framework.TestCase繼續了junit.framework.Assert。
   5>suite()是一個很非凡的靜態方法。JUnit的TestRunner會調用suite方法來確定有多少個測試可以執行。上面的例子顯示了兩種方法:靜態的方法是構造一個內部類,并利用構造函數給該測試命名(test
   name, 如 Car.getWheels ),其覆蓋的runTest()方法,指明了該測試需要執行那些方法--testGetWheels()。動態的方法是利用內?。╮eflection
   )來實現runTest(),找出需要執行那些測試。此時測試的名字即是測試方法(test method,如testGetWheels)的名字。JU

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
日韩中文字幕免费看| 91久久久久久久久久久| 九九久久综合网站| 狠狠做深爱婷婷久久综合一区| 欧洲亚洲在线视频| 成人久久一区二区| 色哟哟亚洲精品一区二区| 欧美乱大交xxxxx另类电影| 国产精品丝袜一区二区三区| 欧美激情综合色| 国产欧美一区二区三区视频| 最近中文字幕mv在线一区二区三区四区| 亚洲精品久久久久中文字幕欢迎你| 欧美精品激情在线| 国产精品一二三视频| 91九色精品视频| 91亚洲精品久久久| 国产狼人综合免费视频| 亚洲人成在线一二| 国产亚洲成av人片在线观看桃| 色综合久久88色综合天天看泰| 久久综合免费视频| 秋霞成人午夜鲁丝一区二区三区| 亚洲成人久久久久| 亚洲成人精品久久久| 国产99视频在线观看| 欧美www视频在线观看| www.亚洲男人天堂| 成人国产精品一区| 亚洲电影免费观看高清完整版在线观看| 精品日本高清在线播放| 亚洲国产精品国自产拍av秋霞| 奇门遁甲1982国语版免费观看高清| 久久久久国色av免费观看性色| 久久69精品久久久久久国产越南| 91精品视频在线免费观看| 亚洲深夜福利视频| 中文字幕在线看视频国产欧美在线看完整| 欧美性xxxxxxxxx| 久久久久这里只有精品| 国产精品pans私拍| 91精品国产色综合久久不卡98口| 色婷婷综合久久久久中文字幕1| 欧美激情视频一区二区| 久久夜色精品国产亚洲aⅴ| 亚洲影院在线看| 午夜精品久久久久久久久久久久| 欧美丝袜一区二区| 国产亚洲aⅴaaaaaa毛片| 97久久国产精品| 九色精品美女在线| 国产在线久久久| 亚洲精品v天堂中文字幕| 国产精品亚洲欧美导航| 成人精品网站在线观看| 伊人久久久久久久久久| 91成人国产在线观看| 国产成人鲁鲁免费视频a| 国产成人av在线| 欧美日韩免费在线| 26uuu另类亚洲欧美日本一| 97人人做人人爱| 激情久久av一区av二区av三区| 亚洲国产高潮在线观看| 国产福利视频一区二区| 欧美一级视频一区二区| 热re91久久精品国99热蜜臀| 亚洲天堂开心观看| 国产美女高潮久久白浆| 色无极亚洲影院| 欧美高清视频在线播放| 亚洲自拍偷拍第一页| 亚洲欧美中文日韩v在线观看| 亚洲视频在线观看网站| 亚洲电影av在线| 亚洲一区美女视频在线观看免费| 另类图片亚洲另类| 色婷婷综合久久久久中文字幕1| 亚洲精品之草原avav久久| 亚洲精品v天堂中文字幕| 综合网中文字幕| 国产成人一区二区在线| 91在线观看免费观看| 欧美影院在线播放| 欧美中文字幕在线| 久久久久久香蕉网| 欧美在线日韩在线| 久久久久久国产精品久久| 欧美日韩aaaa| 成人性生交大片免费观看嘿嘿视频| 97精品一区二区视频在线观看| 秋霞午夜一区二区| 亚洲毛片一区二区| 一区二区在线视频| 97精品久久久中文字幕免费| 最近2019年中文视频免费在线观看| 亚洲国产精品久久91精品| 日韩三级成人av网| 日韩在线视频观看正片免费网站| 精品网站999www| 亚洲人成绝费网站色www| 久久久免费观看| 欧美黑人性视频| 欧美老肥婆性猛交视频| 欧美日韩国产一区二区三区| 国产成人精品国内自产拍免费看| 91免费人成网站在线观看18| 欧美国产视频日韩| 亚洲小视频在线观看| 日韩av色综合| 国产精品v片在线观看不卡| 日韩av在线电影网| 一区二区三区四区在线观看视频| 欧美久久精品午夜青青大伊人| 高清日韩电视剧大全免费播放在线观看| 欧美国产亚洲精品久久久8v| 欧美亚洲另类激情另类| 国产精品视频一| 欧美午夜视频一区二区| 亚洲国产另类 国产精品国产免费| 欧美视频在线观看免费网址| 国产精品第2页| 日韩精品在线视频| 国产丝袜一区二区三区免费视频| 国产精品福利久久久| 国产精品揄拍一区二区| 69视频在线免费观看| 亚洲日本欧美中文幕| 国产精品久久久久久婷婷天堂| 国产亚洲精品久久久久久牛牛| 岛国视频午夜一区免费在线观看| 久久久久久av| 中文字幕亚洲专区| 国产精品久久电影观看| 青青草成人在线| 国模吧一区二区三区| 成人观看高清在线观看免费| 亚洲深夜福利视频| 日韩一级黄色av| 亚洲白虎美女被爆操| 国产日产欧美精品| 成人免费视频网址| 亚洲视频日韩精品| 亚洲第一视频在线观看| 亚洲欧洲国产伦综合| 孩xxxx性bbbb欧美| 欧美裸体视频网站| 久久综合久久美利坚合众国| 夜夜狂射影院欧美极品| 亚洲最大福利视频网站| 日韩视频在线免费| 色99之美女主播在线视频| 欧美日韩福利电影| 国产一区二区三区精品久久久| 欧美午夜宅男影院在线观看| 亚洲欧洲一区二区三区在线观看| 精品国产自在精品国产浪潮| 国产精品扒开腿做爽爽爽的视频| 亚洲欧美综合另类中字| 欧美日韩国产二区| 亚洲国产精品成人av| 中文字幕亚洲欧美日韩在线不卡| 日韩精品在线视频| 亚洲欧美日韩爽爽影院|