清单 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 报表内容预览
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 代表该数据集的字符串表示,是预期的正确结果。