1

我们的任务是使用纯 JRXML(不涉及自定义 Java 代码)实现多个报告。有两个主要原因:报告可以仅使用 SQL 查询生成(不需要自定义代码),并且它们应该易于部署 JasperReport 服务器(没有 Java 代码 = 不需要安装自定义数据源和库)。

但是,我们仍然需要对这些报告进行自动化测试。我们决定将数据检索(SQL 查询)和报告呈现的测试分开。

为了测试 SQL,我们希望从 JRXML 模板中提取实际查询,以便更好地进行未来的测试维护。

我们可以手动将报告查询复制到我们的测试中,使用字符串替换函数将所有参数手动替换为实际值,等等。然而在这种情况下,我们将被迫在两个地方手动维护相同的查询:我们的测试和我们的 JRXML 模板。我们想避免它。

从 JRXML 检索的 SQL 查询的问题在于它们仍然包含特定于 JasperReport 的占位符。就像是:

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

到目前为止,我已经找到了一些我们可能会使用的东西(参见这个线程)。然而,它仍然涉及 JasperReports 库实现的部分逻辑重复(我们需要重复处理 JRQueryChunks 和向查询添加参数值的逻辑)。

有没有更好的方法(我的意思是从 JRXML 测试 SQL)?

谢谢!

4

1 回答 1

0

如果您使用 Jasper 服务器来部署您的报告,您可以使用 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>

如果您为参数使用默认值,您也可以在测试中使用这些值,如果您没有默认值,您至少具有数据类型,并且能够基于该数据类型创建测试值。

希望这会有所帮助。

于 2012-04-19T17:18:31.757 回答