-1

再次 - Jasperreports...

因此,我们得到了带有类似于此的图表和表格的报告:

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

在这些表下方有多个表,其中包含上表中更详细的数据(以向下钻取的方式)。

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

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

我们想要拥有的:

一个完全自动化的测试,它执行以下操作:

  • 检查每个表的数据完整性(sum列中的数字真的是之前每列的总和)
  • 检查明细表相对于上级表的数据完整性(JAN列总和=上级表JAN列数)
  • 获取每个数字的超链接并将其提供给 XLS 导出,以检查 XLS 中的车辆数量是否等于表中显示的数字

所以测试应该与此类似:

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

我们尝试过的:

目前,PDF 报告被写入 aByteArrayOutputStream以将数据转发到 a PdfReader,后者使用SimpleTextExtractionStrategy. 这样虽然很麻烦,但可以检查表的完整性。此外,无法获取超链接。另一个想法是将报告导出为 HTML 而不是 PDF 以获取超链接。检查表的完整性更加麻烦,因为 JasperReports 不会生成 HTML 表,而是生成一堆 DIV。

补充笔记:

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

我的问题:

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

我们使用哪些版本:

  • Java 1.6
  • 兴趣点 3.8
  • iText 5.1.3
  • 碧玉报告 4.7.1

我希望这个问题不要太乱,你不要口头上把我打死;)

4

1 回答 1

0

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

不过,如果有人遇到类似问题并找到此站点,我将发布我们的解决方案。

获得所需 - 通过 JasperReports 生成 - 输出

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

现在脚本有一个静态的Map<String, Double>,它收集所有的链接和数字。生成报告后,我们可以抓取它Map并分析相应的 XLS 导出。通过这种方式,我们可以比较 PDF 和 XLS 中的车辆数量。

这种方法的缺点是,PDF 报告生成为一个空的OutputStream.

检查表数据的完整性

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

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

于 2013-04-16T09:29:15.597 回答