2012-04-19 31 views
1

我們有一項任務是使用純JRXML(不包含定製的Java代碼)來實現多個報告。這主要有兩個原因:報告只能使用SQL查詢生成(不需要定製代碼),並且應該很容易部署JasperReport服務器(不需要Java代碼=不需要安裝自定義數據源和庫)。賈斯珀報告。測試JRXML模板中的SQL查詢

但是,我們仍然需要自動對這些報告進行測試。 我們決定拆分數據檢索(SQL查詢)和報告呈現的測試。

對於測試SQL,我們希望從JRXML模板中提取實際的查詢以實現更好的未來測試維護。

我們可以手動將報告查詢複製到我們的測試中,使用字符串替換功能手動將所有參數替換爲實際值,等等。然而,在這種情況下,我們將被迫在兩個地方手動維護相同的查詢:我們的測試和我們的JRXML模板。我們想避免它。

從JRXML檢索到的SQL查詢的問題是它們仍包含JasperReport特定的佔位符。喜歡的東西:

SELECT name, department FROM employees WHERE employee_id = $P{employeeId} 

到目前爲止,我已經找到了,我們大概可以使用(見this thread)。然而,它仍然涉及JasperReports庫實現的邏輯的部分重複(我們需要複製用於處理JRQueryChunks的邏輯並向查詢添加參數值)。

有沒有更好的方法來做到這一點(我的意思是從JRXML測試SQL)?

謝謝!

回答

0

如果您使用Jasper Server來部署報告,則可以使用Jasper API來提取部署的JRXML,並從中刪除查詢和參數數據類型,用一些測試參數($ P {xxx}和$ P!{xxx})進行測試並準備就緒。

<parameter name="employeeId" class="java.lang.Integer"> 
    <defaultValueExpression><![CDATA[new java.lang.Integer(11)]]></defaultValueExpression> 
</parameter> 
<queryString> 
    <![CDATA[SELECT name, department FROM employees 
       WHERE employee_id = $P{employeeId};]]> 
</queryString> 

如果使用默認值,您的參數,您還可以使用那些在測試中,如果你沒有,你至少有數據類型的默認值,將能夠創建一個測試值基於此。

希望這有助於。

+0

感謝您的建議。如果我正確地理解了你,你提出了從JRXML提取參數和SQL(例如JasperDesign.getMainDataSet()。getQuery())並處理這個SQL替換參數的佔位符,對嗎?我們有完全一樣的想法。我的問題是:如果Jasper已經擁有這個功能,可以避免重新發明輪子(在我們的代碼中解析SQL查詢)? – 2012-04-20 05:53:27