2011-10-23 100 views
0

我正在處理需要由XSL解析並輸出XML的大型複雜字典數據(XML)。測試XSLT的最佳/最有效的方法

什麼將被視爲測試XSL是否處理來自XML(輸入)的所有節點的「最佳」方式?

請考慮這個簡單的例子,我認爲這將代表了問題的本質:

的input.xml

<?xml version="1.0" encoding="UTF-8"?> 
<a> 
    <b> 
     <c> 
     some1 
     <d>text2</d> 
     more text1 
     </c> 
    </b> 
    <b> 
     <c> 
     some2 
     <d>text2</d> 
     more text2 
     </c> 
    </b> 
    <d>text3</d> 
    <e> 
     text 
     <d>4</d> 
    </e> 
</a> 

一些tarnsformations.xsl

的Output.xml

<?xml version="1.0" encoding="UTF-8"?> 
<amodified> 
    <bmodified> 
     some1 
     <dd>text2</dd> 
     more text1 
    </bmodified> 
    <bmodified> 
     some2 
     <dd>text2</dd> 
     more text2 
    </bmodified> 
    <dd>text3</dd> 
    <ed>text</ed> 
    <dd>4</dd> 
</amodified> 

在output.xml中,標籤的名稱已被更改以及訂單o f內容(與輸入文件相比較)。 我需要比較輸入中的所有文本字段是否可用。 我認爲最好的解決方案是創建測試,它將從每個標記中提取文本並將其與字符串進行比較,輸出標記taht在output.xml中不存在以記錄文件...?

+3

沒有一個例子的問題並不具有建設性。什麼是「最佳」,什麼是「處理所有節點」?我的猜測是,只處理所有節點不是測試應該驗證的。關於「產生正確的結果」呢?正如問到的那樣,這個問題與XSLT和測試幾乎沒有關係。請編輯和改進。 –

回答

2

我會推薦兩種測試:首先對較小的控制數據集進行單元測試,該數據應該是您在大型字典中找到的數據的模型。這可以被視爲您的xslt過程的單元測試。我通常會從較大的數據集中提取幾個有代表性的部分,並將它們與測試代碼一起存儲。然後,測試將轉換應用於測試數據並對結果進行斷言,驗證轉換是否成功使用。

然後,您還應該對您的生產系統進行健全性檢查,以便(例如)確保所處理的節點總數與您的預期相符。例如,在包含大量條目的字典中,可以運行一個步驟來計算所有條目,然後再運行另一個條目來處理它們。最後,看看您處理了多少條目,並確保計數與您的預期相同。這也很有用,因爲它提供了輸出進度條的方法(%完成)。

無論如何,這就是我們所做的。

如果輸出中的文本與輸入中的文本相同(如您的示例中的Marcin),則可以使用xslt輕鬆比較這些文本。如果你用一個空的xslt樣式表處理一個xml文件(只是<xslt:stylesheet />節點),那麼你將只返回文本,沒有標記。我認爲xmllint也可以做到這一點。因此,只需在輸入和輸出上運行它,然後使用簡單文本比較(如diff)進行比較。

+0

@_Mike:通常處理的節點和節點輸出之間不存在1:1映射。通常的解決方案是在處理節點時提供調試輸出,以便可以在最終輸出中對「已處理指標」進行計數。 –

+0

@Dmitri - 那是真的;但在很多情況下,您可能可以計算預期輸出節點的數量並進行比較。 –

+0

@_Mike:是的,但問題不在於如何驗證輸出節點的數量。問題是:*如何驗證每個輸入節點已被處理*。 –

1

一個可以使用這種技術

<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
xmlns:ext="http://exslt.org/common"> 
<xsl:output method="text"/> 

<xsl:template match="/*"> 
    <xsl:variable name="vrtfResults"> 
     <xsl:apply-templates select="num"/> 
    </xsl:variable> 

    <xsl:variable name="vProcessed" select= 
    "count(ext:node-set($vrtfResults)/nodeProcessed)"/> 

    <xsl:variable name="vAll" select="count(num)"/> 

    <xsl:text>From the existing </xsl:text> 
    <xsl:value-of select="$vAll"/> 
    <xsl:text> &lt;num> elements </xsl:text> 
    <xsl:value-of select="$vProcessed"/> 
    <xsl:text> were processed.</xsl:text> 
</xsl:template> 

<xsl:template match="num"> 
    <nodeProcessed/> 
    <num><xsl:value-of select="2*."/></num> 
</xsl:template> 
</xsl:stylesheet> 

當在下面的XML文檔施加:

<nums> 
    <num>01</num> 
    <num>02</num> 
    <num>03</num> 
    <num>04</num> 
    <num>05</num> 
    <num>06</num> 
    <num>07</num> 
    <num>08</num> 
    <num>09</num> 
    <num>10</num> 
</nums> 

有用結果產生

From the existing 10 <num> elements 10 were processed. 

說明

  1. 特殊僅測試元件(<nodeProcessed/>)已經被添加到每<num>元件的處理。

  2. 我們將輸出捕捉到一個變量中,然後我們計算<nodeProcessed/>元素的數量,並將它們與必須處理的<num>元素的總數進行比較。