BIRT 报表的自动化测试

2024-09-08 13:18
文章标签 测试 自动化 报表 birt

本文主要是介绍BIRT 报表的自动化测试,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

来源:http://www.ibm.com/developerworks/cn/opensource/os-cn-ecl-birttest/如何为 BIRT 报表编写自动化测试用例

BIRT 是一项很受欢迎的报表制作工具,但目前对其的测试还是以人工测试为主。本文介绍了如何对 BIRT 报表进行自动化测试,以及在实际项目中的一些测试实践,从而提高了测试的效率和准确性

----------------------------------------------------

报表测试自动化的重要性

报表在当今企业中是非常重要的一项工具,很多信息系统都要实现报表的功能来满足业务的需求。开源工具 BIRT 是一项很好的报表制作工具,使用简便,功能也较丰富,很多人都选择 BIRT 来制作自己的报表。

要做好一个软件系统离不开测试,报表也不例外。要通过全面测试来保证报表中数据的正确性。常用的测试方法是运行生成报表,然后人工来检查看数据是否正确。然而,这种方法比较繁琐,每次测试都要花费测试人员一定的时间,测试过程难以重用。现在敏捷开发已逐渐成为主流开发方式,系统的代码会不断变化来适应新的需求,这时全面的回归测试就显得更为重要。人工测试的代价太大,难以满足测试的质量要求,而自动化测试一经开发完成后就可以不断重用,非常方便,几乎不再需要人力去干预,是回归测试的首选,能更好的保证测试的质量。

然而,要对报表进行自动化测试并不像制作一张报表那样容易,本文将介绍如何对 BIRT 制作的报表进行自动化测试。

测试的基本思想

自动化测试的基本思想就是生成报表后,由电脑读出报表的内容,然后与预先计算好的结果进行比较,从而判断报表的结果是否正确。因此,自动化测试用例的重点就是如何编程访问 BIRT 报表的数据。

BIRT 制作的报表,其设计文件是 .rptdesign 格式,该文件定义了报表的元数据,即如何得到报表的内容以及内容的表示方式。BIRT 引擎就是根据这个文件生成报表的。在具体的生成过程中,BIRT 引擎分为两步,先是根据 .rptdesign 文件中的定义生成数据,再把这些数据以某种格式显示出来。一般情况下,这两步是一起完成的。然而在测试中,我们主要关注的是报表逻辑,即数据是否正确。显示样式的验证则比较简单。因此,我们可以在编码的时候通过调用 BIRT API 来把这两步分开,使 BIRT 在计算出报表所包含的数据后,并不对其进行渲染显示,而是以 .rptdocument 文件格式保存下来,该文件中存放了报表内包含的所有数据。然后,可以通过编程访问该文件,读取其中数据,通过和预计算的结果比较,验证其正确性。

自动化测试项目工程结构

在大型项目中,产品的代码与测试的代码是分开的。通常自动化测试会在产品项目工程之外另外建立一个工程。对于 BIRT 报表自动化测试来说,一个典型的项目工程结构如图 1 所示(以 Eclipse 为例)

图 1. BIRT 自动化测试工程结构图
BIRT 自动化测试工程结构图

除了工程常规的 src 和 lib 目录外,BIRT 要能够运行,还需要 ReportEngine,该目录的内容可以在 BIRT runtime 的下载包里找到,直接拷贝过来即可。Rptdesign 目录存放 .rptdesign 报表设计文件,这些也就是我们要测试的报表文件,可以通过编写脚本把产品工程项目中的报表文件同步过来,也可以手动复制。最后就是 rptdocument 目录,该目录用于存放生成的 .rptdocument 文件,便于测试用例从中读取数据进行验证。

通过 rptdesign 文件来生成 rptdocument

通过 API 来使用 BIRT 之前,先要得到 BIRT 的 engine,代码如下,其中 ENGINEHOME 就是 ReportEngine 所在的目录路径。

清单 1. 获得 BIRT 的工作引擎
 EngineConfig config = new EngineConfig(); config.setEngineHome(ENGINEHOME); try { Platform.startup(config); } catch (Exception e) { e.printStackTrace(); //handle the exception here } IReportEngineFactory factory = (IReportEngineFactory) Platform .createFactoryObject(IReportEngineFactory.EXTENSION_REPORT_ENGINE_FACTORY); IReportEngine engine = factory.createReportEngine(config);

在得到 engine 之后,就可以运行报表了。BIRT API 提供了一个 RunTask 类来负责从报表设计文件中计算出报表的数据。代码如下所示。其中 designFile 是 .rptdesign 文件名。DocumentFile 是生成的 .rptdocument 文件名。

清单 2. 生成 .rptdocument 文件
 IReportRunnable runnable = engine.openReportDesign(designFile); IRunTask task = engine.createRunTask(runnable); task.run(documentFile);

这样,我们就能够得到包含报表数据的 .rptdocument 文件了。然后就可以编写测试用例进行验证。

读取 rptdocument 文件数据进行验证

rptdocument 文件内容根据 rptdesign 的不同而有所区别,测试用例的写法也不一样。以下以 BIRT help 教程中的 Tutorial3 Inventory 报表为例讲述如何读取其数据进行自动化测试。该报表使用预览视图时内容如图 2 所示。

图 2. Inventory 报表内容预览
Inventory 报表内容预览

BIRT API 中提供了 DataExtractionTask 来从 rptdocument 中提取数据。

清单 3. 建立数据读取任务
 IReportDocument reportDocument = engine.openReportDocument(documentFile); IDataExtractionTask dataExtractionTask = engine.createDataExtractionTask(reportDocument);

而在这过程中,BIRT 是按照不同的 DataSet 来分别提取数据的,在本例中,该报表最后的结果只有一个 Dataset。让 DataExtractionTask 来选中这个 Dataset

清单 4. 选择数据集
 List<?> list = dataExtractionTask.getResultSetList(); IResultSetItem resultSetItem = (IResultSetItem) list.get(0); String resultSetName = resultSetItem.getResultSetName(); dataExtractionTask.selectResultSet(resultSetName);

每一个 Dataset 是由多个数据列组成的。DataExtractionTask 可以从中选取部分数据列来提取数据,在这个例子中,我们选取提取所有数据列中的数据。

清单 5. 选择数据列
 IResultMetaData resultMetaData = resultSetItem.getResultMetaData(); int columnCount = resultMetaData.getColumnCount(); String[] columnNames = new String[columnCount]; for (int i = 0; i < columnCount; i++){ columnNames[i] = resultMetaData.getColumnName(i); } dataExtractionTask.selectColumns(columnNames);

这样,我们就可以开始提取数据了,BIRT 会返回一个迭代器,每次迭代都会取到一行数据,然后通过 getValue(index) 方法得到这行数据中的某一个值。下面的代码把整个数据集全部取出来,与预先算得的结果进行比较。在实际使用中,数据集可能很大,因此可以根据情况只比较中间的一部分。

清单 6. 获取报表中的数据
 IExtractionResults extractionResults = dataExtractionTask.extract(); IDataIterator dataIterator = extractionResults.nextResultIterator(); StringBuffer stringBuffer = new StringBuffer(); while (dataIterator.next()){ for (int j = 0; j < columnNames.length; j++){ Object object = dataIterator.getValue(j); if (object != null){ stringBuffer.append(object.toString()); if (j < columnNames.length - 1){ stringBuffer.append("|"); } } } stringBuffer.append("\n"); } assertEquals(stringBuffer.toString(), actualResult);

其中 actualResult 代表该数据集的字符串表示,是预期的正确结果。

给报表设置参数

报表的内容通常会随着用户输入参数的不同而变化,这也是报表的一个重要特性。测试的时候我们也需要给报表输入不同的参数,尽量覆盖各种可能的情况,看报表的数据是否正确。

使用 BIRT API 给报表设置参数非常简单,调用其 task 对象的 setParameterValue 方法即可。在本例 Inventory 报表中,有一个 RP_quantityinstock 的参数,它表示找到库存中数量少于这个参数值的物品,并把它们显示在报表上。以下代码表示设置这个参数值为 500。

清单 7. 设置报表参数
 IRunTask task = engine.createRunTask(runnable); task.setParameterValue("RP_quantityinstock", 500); task.run(documentFile);

改变报表的数据源

在实际工程应用中,我们制做的报表一般不会把数据源给写死,而是使用 JNDI 等技术统一管理配置数据源。这样可以增加报表的灵活性,使其方便的连接到不同的数据源上。而在测试的时候,我们需要让报表连到某个特定的测试数据库,这样我们就可以预先知道报表的运行结果来进行对比测试。因此,在编写自动化测试用例时,我们需要改变报表数据源的配置,让其指向我们准备好的测试数据库。

设置数据源的代码相对复杂一些,首先要通过 ReportRunnable 对象得到其 ReportDesignHandle 对象,该对象管理报表设计中的各项元素。然后通过该对象找到数据源对象 OdaDataSourceHandle,其中参数“Data Source”表示数据源的名字。最后我们就可以对数据源对象进行配置了,下面的代码显示如何把数据源改变为 BIRT 自带的示例数据库。

清单 8. 给报表设置数据源
 IReportRunnable runnable = engine.openReportDesign(designFile); ReportDesignHandle design = (ReportDesignHandle) runnable.getDesignHandle().getModuleHandle(); OdaDataSourceHandle dsh = (OdaDataSourceHandle)design.findDataSource("Data Source"); dsh.setProperty("odaURL", "jdbc:classicmodels:sampledb"); dsh.setProperty("odaUser", "ClassicModels"); dsh.setProperty("odaDriverClass", "org.eclipse.birt.report.data.oda.sampledb.Driver");

小结

本文介绍了对 BIRT 报表进行自动化测试的方法和最佳实践。编写自动化测试用例在一开始会比较困难,但是一经完成可以大大提高测试效率和质量,降低成本,一劳永逸。特别是在大型项目中,报表的自动化测试显得更为重要。


这篇关于BIRT 报表的自动化测试的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1148216

相关文章

性能测试介绍

性能测试是一种测试方法,旨在评估系统、应用程序或组件在现实场景中的性能表现和可靠性。它通常用于衡量系统在不同负载条件下的响应时间、吞吐量、资源利用率、稳定性和可扩展性等关键指标。 为什么要进行性能测试 通过性能测试,可以确定系统是否能够满足预期的性能要求,找出性能瓶颈和潜在的问题,并进行优化和调整。 发现性能瓶颈:性能测试可以帮助发现系统的性能瓶颈,即系统在高负载或高并发情况下可能出现的问题

字节面试 | 如何测试RocketMQ、RocketMQ?

字节面试:RocketMQ是怎么测试的呢? 答: 首先保证消息的消费正确、设计逆向用例,在验证消息内容为空等情况时的消费正确性; 推送大批量MQ,通过Admin控制台查看MQ消费的情况,是否出现消费假死、TPS是否正常等等问题。(上述都是临场发挥,但是RocketMQ真正的测试点,还真的需要探讨) 01 先了解RocketMQ 作为测试也是要简单了解RocketMQ。简单来说,就是一个分

【测试】输入正确用户名和密码,点击登录没有响应的可能性原因

目录 一、前端问题 1. 界面交互问题 2. 输入数据校验问题 二、网络问题 1. 网络连接中断 2. 代理设置问题 三、后端问题 1. 服务器故障 2. 数据库问题 3. 权限问题: 四、其他问题 1. 缓存问题 2. 第三方服务问题 3. 配置问题 一、前端问题 1. 界面交互问题 登录按钮的点击事件未正确绑定,导致点击后无法触发登录操作。 页面可能存在

业务中14个需要进行A/B测试的时刻[信息图]

在本指南中,我们将全面了解有关 A/B测试 的所有内容。 我们将介绍不同类型的A/B测试,如何有效地规划和启动测试,如何评估测试是否成功,您应该关注哪些指标,多年来我们发现的常见错误等等。 什么是A/B测试? A/B测试(有时称为“分割测试”)是一种实验类型,其中您创建两种或多种内容变体——如登录页面、电子邮件或广告——并将它们显示给不同的受众群体,以查看哪一种效果最好。 本质上,A/B测

【Linux 从基础到进阶】Ansible自动化运维工具使用

Ansible自动化运维工具使用 Ansible 是一款开源的自动化运维工具,采用无代理架构(agentless),基于 SSH 连接进行管理,具有简单易用、灵活强大、可扩展性高等特点。它广泛用于服务器管理、应用部署、配置管理等任务。本文将介绍 Ansible 的安装、基本使用方法及一些实际运维场景中的应用,旨在帮助运维人员快速上手并熟练运用 Ansible。 1. Ansible的核心概念

如何使用Ansible实现CI/CD流水线的自动化

如何使用Ansible实现CI/CD流水线的自动化 持续集成(CI)和持续交付(CD)是现代软件开发过程中的核心实践,它们帮助团队更快地交付高质量的软件。Ansible,作为一个强大的自动化工具,可以在CI/CD流水线中发挥关键作用。本文将详细介绍如何使用Ansible实现CI/CD流水线的自动化,包括设计流水线的结构、配置管理、自动化测试、部署、以及集成Ansible与CI/CD工具(如Jen

多线程解析报表

假如有这样一个需求,当我们需要解析一个Excel里多个sheet的数据时,可以考虑使用多线程,每个线程解析一个sheet里的数据,等到所有的sheet都解析完之后,程序需要提示解析完成。 Way1 join import java.time.LocalTime;public class Main {public static void main(String[] args) thro

Verybot之OpenCV应用一:安装与图像采集测试

在Verybot上安装OpenCV是很简单的,只需要执行:         sudo apt-get update         sudo apt-get install libopencv-dev         sudo apt-get install python-opencv         下面就对安装好的OpenCV进行一下测试,编写一个通过USB摄像头采

BIRT报表script

1.隔行高亮显示 1. 在布局(Layout)中,选择Table-Detail的行。如下图:   2. 然后选择Script,打开脚本窗口顶部的方法列表并选择onPrepare,如图所示。 var count=0;   3. 最后打开脚本窗口顶部的方法列表并选择 onCreate,如图所示: count++; if (count % 2 != 0) {   style.se

Birt报表开发实战

我就截图描述得了,没什么含金量,看图基本明白的。 1.开始 a.创建报表文件 b.数据源配置 c.配置数据集 2.网格报表 拖拉式操作,很方便 3.预览效果 其他报表的操作也基本不难,就不扯了! 2.级联参数 官方视频教程:http://demo.actuate.com/demos/cascade/cascade.html