您的位置:軟件測試 > 開源軟件測試 > 開源單元測試工具 > DBunit
DBUnit 進(jìn)行單元測試
作者:網(wǎng)絡(luò)轉(zhuǎn)載 發(fā)布時間:[ 2013/6/28 13:22:03 ] 推薦標(biāo)簽:

現(xiàn)實(shí)系統(tǒng)中通常會有一些具有外部依賴性的對象,這些對象和數(shù)據(jù)庫或者其他對象存在諸多關(guān)聯(lián)。如果我們對這樣的對象編寫單元和組件級測試的話,可以想象將是非常麻煩的一件事.因?yàn)檫@種外部依賴性的存在,使的我們很難將對象孤立出來進(jìn)行測試。經(jīng)常提及的白盒測試法,基本上是通過控制對象的外部依賴性來達(dá)到隔離對象的目的,使的可以操作這些對象的狀態(tài)和相關(guān)行為。  
運(yùn)用 模擬對象(mock objects) 或者stubs,是一個控制對象外部依賴性的解決方案。通過隔離那些關(guān)聯(lián)的數(shù)據(jù)庫訪問類,象JDBC的相關(guān)操作類,對于控制對象外部依賴性將是很有效的。但模擬對象的解決方案對一些特殊的應(yīng)用系統(tǒng)架構(gòu)顯得力不從心了,象那些運(yùn)用了EJB的CMP(container-managed persistence)或者 JDO(java Data Objects)的應(yīng)用系統(tǒng)架構(gòu),在這些架構(gòu)里,數(shù)據(jù)庫的訪問對象是在底層的而且很隱蔽! 
由Manuel Laflamme編寫的開放源代碼的DBUnit架構(gòu)體系,對于控制系統(tǒng)內(nèi)部的數(shù)據(jù)庫依賴性提供了一個非常不錯的解決方案。他允許程序員在整個的測試過程中自由的管理控制數(shù)據(jù)庫的狀態(tài),這很重要。利用DBUnit,在測試之前,我們可以給目標(biāo)數(shù)據(jù)庫植入我們需要的數(shù)據(jù)集,而且,在測試完畢后,數(shù)據(jù)庫完全能夠回溯到測試前的狀態(tài)。  
  在很多成功的軟件項(xiàng)目中,測試自動化往往是關(guān)鍵的層面。DBUnit允許開發(fā)人員創(chuàng)建測試用例代碼,在這些測試用例的生命周期內(nèi)我們可以很好的控制數(shù)據(jù)庫的狀態(tài)。而且,這些測試用例是很容易實(shí)現(xiàn)自動化的。這樣在測試過程中我們無須對它進(jìn)行人工的干預(yù),為人工干預(yù)造成的后果而擔(dān)心更沒必要了! 
  簡單介紹
  配置使用DBUnit的第一步我們首先需要知道如何生成數(shù)據(jù)庫schema,這個文件是XML格式的,其中包括了數(shù)據(jù)庫的表及相關(guān)數(shù)據(jù)信息! 
  例如,這里有一個數(shù)據(jù)庫表employee,我們可以用SQL的形式這樣將他表示出來。而且,我們可以看到,一個簡單的數(shù)據(jù)集可以這樣表示在DBUnit中,上面這個表和抽樣數(shù)據(jù)信息可以用XML文件的形式這樣表示:

    <EMPLOYEE employee_uid='1' start_date='2001-11-01' first_name='Andrew' ssn='xxx-xx-xxxx' last_name='Glover' />  

這個生成的XML格式的文件可以作為系統(tǒng)所需的所有種子文件(seed files)的樣本模版.
  為相互關(guān)聯(lián)的測試場景創(chuàng)建多個種子文件是一個很有效的策略,象通過不同的數(shù)據(jù)庫文件來區(qū)分隔離數(shù)據(jù)庫狀態(tài)是一個道理。多種子文件策略可以將我們的測試目標(biāo)鎖定到較小的范圍,目標(biāo)數(shù)據(jù)可以只針對數(shù)據(jù)庫的表,而不是整個數(shù)據(jù)庫! 
  為了給目標(biāo)數(shù)據(jù)庫植入不同的職員記錄,我們需要的XML數(shù)據(jù)文件如下所示:

      <?xml version='1.0' encoding='UTF-8'?>   
      <dataset> 
      <EMPLOYEE employee_uid='1' 
      start_date='2001-01-01' 
      first_name='Drew' ssn='000-29-2030' 
      last_name='Smith' /> 
       
      <EMPLOYEE employee_uid='2' 
      start_date='2002-04-04' 
      first_name='Nick' ssn='000-90-0000' 
      last_name='Marquiss' />  
     
      <EMPLOYEE employee_uid='3' 
      start_date='2003-06-03' 
      first_name='Jose' ssn='000-67-0000' 
      last_name='Whitson' /> 
      </dataset> 

  
  現(xiàn)在,要讓DBUnit和我們所需的數(shù)據(jù)庫schema一起工作了,對于程序員來說,我們使用DBUnit進(jìn)行測試可以有兩種選擇:通過直接編碼方式進(jìn)行測試或者與Ant結(jié)合.  
  編碼方式
  DBUnit框架提供了一個基本的抽象測試用例類,叫做DatabaseTestCase,它是JUnit框架中的基礎(chǔ)類TestCase的子類。如果我們使用這個類必須首先實(shí)現(xiàn)兩個鉤子方法(hook
methods):getConnection()和getDataSet().  
  方法getConnection()需要返回一個IDatabaseConnection類型的對象,這個對象是一個基于普通JDBC連接的包裝類。例如,下面的代碼段演示了在MySQL數(shù)據(jù)庫環(huán)境下,IDatabaseConnection類型連接對象的創(chuàng)建方法。  
  
    protected IDatabaseConnection getConnection() 
      throws Exception { 
       
      Class driverClass = Class.forName("org.gjt.mm.mysql.Driver");  
      Connection jdbcConnection = DriverManager.getConnection("jdbc:mysql://127.0.0.1/hr", "hr", "hr");   
      return new DatabaseConnection(jdbcConnection); 
      } 

  
  方法getDataSet()返回一個IDataSet類型對象,其實(shí),說白了,他是我們先前提到的XML數(shù)據(jù)的種子文件的另一種表現(xiàn)形式。  
  
    protected IDataSet getDataSet() throws Exception { 
      return new FlatXmlDataSet( 
      new 
      FileInputStream("hr-seed.xml")); 
      } 

上一頁12345下一頁
軟件測試工具 | 聯(lián)系我們 | 投訴建議 | 誠聘英才 | 申請使用列表 | 網(wǎng)站地圖
滬ICP備07036474 2003-2017 版權(quán)所有 上海澤眾軟件科技有限公司 Shanghai ZeZhong Software Co.,Ltd