我如何测试碧玉报告?

时间:2010-08-04 14:40:52

标签: java unit-testing testing jasper-reports

我想测试我的应用程序的所有jasper报告。我希望能够发现:

  • 编译问题(检查JasperCompileManager.compileReport(some inputStream)是否会抛出JRException是一个不错的选择吗?)
  • 填写问题(检查JasperFillManager.fillReport(someReport, someParameters, someDataSource)不会抛出JRException是一个不错的选择吗?)
  • 渲染问题:检测出现的“null”字符串,在导出的PDF文件中截断文本
  • 还有其他想法吗?

理想情况下,我希望保持测试过程尽可能最通用。问题是每个jasper都有不同的数据源,所以为了检测这个错误,我需要在列表中生成一些数据(对吗?),我需要生成的这些数据对于我的应用程序的每个jasper都是不同的。所以我不知道我能够重用多少测试代码。你会采取什么方法?

谢谢!

6 个答案:

答案 0 :(得分:2)

对于编译问题,一种方法是使用iReport工具,所有报告模板都可以成功编译;假设您正在使用模板,然后将数据填充到其中。

我发现以下链接很有用,

http://flexingcode.blogspot.com/2009/04/junit-for-jasper-reports.html

希望有所帮助,

馒头

答案 1 :(得分:2)

我为测试方面创建了几个单元测试。

  1. 编译问题:我创建了一个类来加载和编译我的所有模板。我的环境是基于网络的。所以我也测试了这条路径。

  2. 填写:我模拟了数据和JRDataSource来填充模板,这对我来说很有用。

  3. 渲染:我没有找到一个好的方法来做到这一点。有人有想法吗?

  4. 而且,我通常使用JavaBean数据源,以便使用传统的Java单元测试方法测试报告。

答案 2 :(得分:1)

对于自动编译,您可以尝试使用Ant脚本编译报告(请参阅1http://jasperreports.sourceforge.net/api/net/sf/jasperreports/ant/package-summary.html

Ant任务适用于自动构建或连续集成系统,如maven或jenkins。

答案 3 :(得分:1)

渲染的一种方法是将报告导出为PDF,然后使用类似PDFBox(Apache)的内容来测试内容。 您也可以导出到Excel文件,然后使用Apache POI或JExcelAPI测试单元格内容。

此致

弗兰

答案 4 :(得分:1)

关于测试PDF文档内容的PDFbox方法:我刚刚发现了jPdfUnit开源项目,它有很大帮助:

在这里查看文档: http://jpdfunit.sourceforge.net/docs/GettingStarted.html

它基于junit 3并且多年来一直没有维护,但它确实有效。 我必须应用的一个调整就是将pdfbox版本设置为1.8.13。如果你正在使用maven,请把它放在你的身上:

<dependencyManagement>
        <dependencies>
            <dependency>
                <groupId>org.apache.pdfbox</groupId>
                <artifactId>pdfbox</artifactId>
                <!-- jpdfunit is not compatible with pdfbox 2 (java5 vs java6) -->
                <version>1.8.13</version>
            </dependency>
        </dependencies>
</dependencyManagement>

答案 5 :(得分:1)

对于编译问题和填充问题:是的,您可以按照描述进行操作,只是尝试编译并填写报告。如果这不会引发异常,那么你没事。

对于检查渲染问题的第三步,我将报告导出为XML:

String xml = JasperExportManager.exportReportToXml(
    JasperFillManager.fillReport(report, params, dataSource)
);

理论上,XML是PDF文件的精确表示,但其格式在测试中易于阅读。例如。如果字段太长而内容被截断,那么它也会在XML中被截断。所有值都已经处于“呈现”格式,因此,如果您是有一个用(DecimalFormat)-pattern格式化的数字,那么数字将在XML中格式化。字段的uuid-identifier也仍然存在于XML中,因此您也可以轻松找到字段。要检查字段,您可以例如做一些事情:

hasXPath("//*[@uuid = '" + field.getUuid() + "']/../*[local-name() = 'textContent']", matcher)