分析JasperReports的输出输出

时间:2013-04-05 10:36:52

标签: java unit-testing pdf jasper-reports

再次 - Jasperreports ......

因此,我们已经获得了与图表类似的图表和表格的报告:

JAN | FEB | MAR | ... | DEC | SUM
----+-----+-----+-----+-----+----
 5  |  1  |  9  | 120 | 20  | 155
(Numbers represent amounts of vehicles)

在这些表格下方有多个表格,这些表格包含上表中的数据,详细介绍(以深入的方式)。

我们将这些报告导出为PDF并在Web应用程序中作为可下载文档提供。所需数据在专门的Java工厂中计算。根据报告,有一个工厂提供带有哑数据对象的列表。这些对象包含显示在图表和表格中的聚合数字。

此外,这些数字是超链接。他们转发到一个servlet,它提供XLS导出,其中包含有关每辆车的详细数据。当然,每个超链接都有一堆servlet参数。

我们想要的是什么:

完整的自动化测试,执行以下操作:

  • 检查每个表的数据完整性(总和列中的数字实际上是每列的总和)
  • 检查关于上级表的详细表的数据完整性(JAN列的总和=上级表的JAN列中的数字)
  • 获取每个号码的超链接并输入XLS导出,以检查XLS中的车辆数量是否等于表格中显示的数量

所以测试应该与此类似:

Test -> generate PDF report -> check table integrity -> parse links -> check XLS -> assertEverythingLooksFine()

我们尝试了什么:

目前,PDF报告已写入ByteArrayOutputStream,以将数据转发至PdfReader,并使用SimpleTextExtractionStrategy对其进行解析。通过这种方式,可以检查桌子的完整性,尽管它非常麻烦。此外,无法获取超链接。另一个想法是将报告导出为HTML而不是PDF以获取超链接。检查表的完整性更加麻烦,因为JasperReports不会生成HTML表,而是生成一堆DIV。

附加说明:

  • 是的,还可以根据工厂的输出检查工作台的完整性 - 在写这个问题时我想到了这个想法。但是真正重要的测试点是XLS导出,并且导出的参数在JasperReports中生成
    • 是的,生成导出参数也可以在工厂完成,但我不认为它属于那里(层架构等)
  • 我知道,在单元测试中分析二进制格式输出是一个坏主意,但JasperReports是一个非常黑的盒子,我们在jrxml-stuff中做了很多工作
  • 我还想到了某种格式化程序/定制程序,它可以在生成
  • 时访问这些元素
  • 我已阅读http://whathaveyoutried.com并尽力而为;)

我的问题:

  • 您如何看待这种方法?合理吗?
  • 我错过了一些可以做得更好的观点吗?
  • JasperReports是否有某种API或接口可以访问以更轻松地访问生成的输出?也许格式化程序/定制程序方法?
  • 是否有更好的API来阅读PDF?
  • 我忘记了合理的问题吗? ;)

我们使用的是哪个版本:

  • Java 1.6
  • POI 3.8
  • iText 5.1.3
  • JasperReports 4.7.1

我希望这个问题不会太乱,而且你不能口头上打死我;)

1 个答案:

答案 0 :(得分:0)

正如@Vash所说,这不是可以回答/讨论此类主题的地方。

然而,如果有人遇到类似问题并找到此网站,我会发布我们的解决方案。

获取所需 - 由JasperReports生成 - 输出

既不生成HTML而不生成PDF,也不使用某种API解析最终的PDF文档,这是一个非常令人满意的解决方案。我们所做的是编写一个我们链接到报告的scriptlet。在报告中,在显示车辆数量的地方调用scriplet。车辆数量和生成的链接作为参数传递给scriplet,方法再次返回数字。

现在,scriplet有一个静态Map<String, Double>,它收集所有链接和数字。生成报告后,我们可以获取此Map并分析相应的XLS导出。这样我们就可以比较PDF和XLS中的车辆数量。

此方法的缺点是,PDF报告生成为空OutputStream

检查表格数据的完整性

幸运的是,显示的数据是在java工厂中生成的。因此,我们所要做的就是实例化它并检查在特殊数据类和集合中提供的输出。这样我们就可以隐式验证报告中的数据是否正确。

使用包含三个报告和大约240个XLS文档的设置运行完整的单元测试大约需要五分钟。作为副产品,我们有一大堆XLS表(也写成空OutputStreams),这不是很好,但另一方面,它只是一个不必高效的单元测试。