【问题标题】:How can I test a jasper report?如何测试碧玉报告?
【发布时间】:2011-03-25 07:31:02
【问题描述】:

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

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

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

谢谢!

【问题讨论】:

    标签: java unit-testing testing jasper-reports


    【解决方案1】:

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

    我发现以下链接很有用,

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

    希望对你有帮助,

    馒头

    【讨论】:

    • 链接不再可用
    • 它在archive.org,但图像已损坏。不过,您仍然可以大致了解。
    【解决方案2】:

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

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

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

    3. 对于渲染:我还没有找到一个好的方法来实现它。有人有想法吗?

    另外,我通常使用 JavaBean 数据源,这样我就可以使用传统的 java 单元测试方法来测试报告。

    【讨论】:

      【解决方案3】:

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

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

      【讨论】:

        【解决方案4】:

        呈现的一种方法是将报告导出为 PDF,然后使用 PDFBox (Apache) 之类的工具来测试内容。 您也可以导出到 Excel 文件,然后使用 Apache POI 或 JExcelAPI 对单元格内容进行测试。

        问候

        弗兰

        【讨论】:

          【解决方案5】:

          关于测试 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>
          

          【讨论】:

            【解决方案6】:

            对于编译问题和填充问题:是的,您可以按照说明进行操作,然后尝试编译和填充报告。如果这不会引发异常,那么你就可以了。

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

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

            理论上,XML 是 PDF 文件的准确表示,但格式在测试中易于阅读。例如。如果一个字段太长并且内容被截断,那么它也会在 XML 中被截断。所有值都已经是“渲染”格式,所以如果你例如有一个使用 (DecimalFormat) 模式格式化的数字,那么该数字将在 XML 中格式化。此外,字段的 uuid 标识符仍然存在于 XML 中,因此您也可以轻松找到字段。要检查一个字段,您可以例如做一些类似的事情:

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

            【讨论】: