如何测试碧玉报告?

2022-09-02 22:23:50

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

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

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

谢谢!


答案 1

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

对于检查呈现问题的第三步,我将报表导出为 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)

答案 2

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

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

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

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

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


推荐