您的位置:軟件測試 > 開源軟件測試 > 開源單元測試工具 >
追求代碼質(zhì)量: 探究 XMLUnit
作者:網(wǎng)絡(luò)轉(zhuǎn)載 發(fā)布時間:[ 2013/2/25 14:18:01 ] 推薦標簽:

清單 2 中的測試有其他一些重大的缺陷 —— 而不僅僅是硬編碼 String 比較那么簡單。首先,測試并不真正可讀。第二,它驚人的脆弱;一旦 XML 文檔的格式改變(包括添加空格),與其嘗試修復(fù) String 本身,還不如粘貼進一個新的文檔副本。后,測試的本性會迫使您必須應(yīng)付 Date 方面,雖然您并不想如此。

若想確保文檔中第二個 Class 元素的 name 值是 com.acme.web.Account 又該如何呢?當然,您可以使用常規(guī)表達式或 String 搜索,但所需的工作量太大。這樣看來,通過一個解析框架來操縱此 DOM 不是更有意義么?
XMLUnit 能否用于 TestNG?

XMLUnit 是一個 JUnit 擴展,但這并不意味著不能在 TestNG 使用它。只要它具有 API 而且此 API 支持委托同時不基于修飾器,那么您可以將幾乎任何框架整合進 TestNG。

用 XMLUnit 進行測試

當您感覺自己為完成一項任務(wù)而努力過了頭,您可以想想解決此問題是否還有更容易的捷徑可尋。如果所要解決的問題涉及的是編程式地驗證 XML 文檔,那么所應(yīng)想到的解決方案是 XMLUnit。

XMLUnit 是一種 JUnit 擴展框架,有助于開發(fā)人員測試 XML 文檔。實際上,XMLUnit 是一種真正的 XML 測試的“多面手”:可以使用它來驗證 XML 文檔的結(jié)構(gòu)、內(nèi)容甚至該文檔的指定部分。

簡單的做法是使用 XMLUnit 在邏輯上對比運行時 XML 文檔和預(yù)定義的有效控制文件。本質(zhì)上講,這是一種差異測試:假定一個 XML 文檔是正確的,那么此應(yīng)用程序在運行時是否會生成同樣的東西?它是相對簡單的一種測試,但也可以使用它來驗證 XML 文檔的結(jié)構(gòu)和內(nèi)容。也可以通過 XPath 的一點幫助來驗證特定內(nèi)容。
委托而非繼承

首要原則是盡量避免測試用例繼承。許多 JUnit 擴展框架,包括 XMLUnit,都提供可以通過繼承得到的專門的測試用例來協(xié)助測試某一特定的架構(gòu)。從框架繼承來的測試用例都缺乏靈活性,這是 Java 平臺的單一繼承的范型所致。更多的時候,這些相同的 JUnit 擴展框架提供一個委托 API,此 API 可以更易于組合不同的框架,而無需采用嚴格的繼承結(jié)構(gòu)。

驗證內(nèi)容

可以通過委托或繼承的方式使用 XMLUnit。作為佳策略,我建議避免測試用例繼承。另一方面,從 XMLUnit 的 XMLTestCase 繼承確實可以提供一些方便的聲明方法(這些方法不是靜態(tài) 的,因而也不能像 JUnit的 TestCase 聲明一樣被靜態(tài)引用)。

不管您如何選擇使用 XMLUnit,都必須實例化 XMLUnit 的解析器。您可以通過 System.setProperty 調(diào)用實例化它們,也可以通過 XMLUnit 核心類上的一些方便的 static 方法對它們進行實例化。

一旦用所需要的不同的解析器實例化 XMLUnit 之后,可以使用 Diff 類,這是從邏輯上對比兩個 XML 文檔所需的中心機制。在清單 3 中,我利用 XMLUnit 對 >testToXML test 做了一些改進:

清單 3. 改進后的 testToXML 測試

    
public class XMLReportTest extends TestCase {

 protected void setUp() throws Exception {  
  XMLUnit.setControlParser(
    "org.apache.xerces.jaxp.DocumentBuilderFactoryImpl");
  XMLUnit.setTestParser(
    "org.apache.xerces.jaxp.DocumentBuilderFactoryImpl");
  XMLUnit.setSAXParserFactory(
    "org.apache.xerces.jaxp.SAXParserFactoryImpl");
  XMLUnit.setIgnoreWhitespace(true);  
 }

 private Filter[] getFilters(){
  Filter[] fltrs = new Filter[2];
  fltrs[0] = new RegexPackageFilter("java|org");
  fltrs[1] = new SimplePackageFilter("net.");
  return fltrs;
 }

 private Dependency[] getDependencies(){
  Dependency[] deps = new Dependency[2];
  deps[0] = new Dependency("com.acme.resource.Configuration");
  deps[1] = new Dependency("com.acme.xml.Document");
  return deps;
 }

 public void testToXML() {
  BatchDependencyXMLReport report =
    new BatchDependencyXMLReport(new Date(1165203021718L),
   this.getFilters());

  report.addTargetAndDependencies(
    "com.acme.web.Widget", this.getDependencies());
  report.addTargetAndDependencies(
    "com.acme.web.Account", this.getDependencies());

  Diff diff = new Diff(new FileReader(
    new File("./test/conf/report-control.xml")),
    new StringReader(report.toXML()));

  assertTrue("XML was not identical", diff.identical());  
 }
}

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