张 捷 (zhjie@cn.ibm.com), 测试工程师, IBM
2008 年 4 月 30 日 由于 Rational Robot 的 Datapool 本身没有提供迁移工具,本文讲述了一种可编程的,合并不同 Robot 项目中 Datapool 定义和数据的方法。根据该方法编写的工具极大的提高了合并 Rational Robot 项目的效率。
前言
这篇文章讲述了如何合并不同 Rational Robot 项目中的 Datapool 数据。
在团队中,我们需要在一个统一的框架下各成员分别编写一个 Rational Robot 项目中的不同部分。于是我们每个人都创建一个 Robot 项目,在大家都编写结束后,我们需要把这些项目合并到一起,成为一个 Robot 项目。在合并项目中效率最低的一点就是合并 Datapool 中的定义和数据。
Datapool 分为两部分,一部分是定义,一部分是数据。数据部分合并比较简单,它们默认保存在项目的 %ProjectRootFolder%\TestDatastore\DefaultTestScriptDatastore\TMS_Datapools 目录下。只要保证文件没有重名,把所有的数据文件拷贝到合并后的项目的同一目录下即可。但这一步要在定义部分合并后才可以做。
人工进行定义部分的合并比较繁琐,我们需要用 Rational TestManager 打开合并后的项目,然后选择菜单 Tools->Manage->Datapool 打开 Datapool 管理窗口。完全依照合并前项目的 Datapool 定义重新建立 Datapool 定义。手工进行此项操作浪费大量时间,而且容易产生人为错误。
本文提供了一种方法可以使用程序进行不同 Robot 项目中 Datapool 的定义合并。使用本人实现了这个方法的工具,使得我们的团队在合并不同 Robot 项目时节省了大量的时间,并避免了人为的错误。
什么是 Datapool
Datapool 用于存储测试数据,在脚本中插入 Datapool 命令并增加相关的控制命令后,在脚本回放时就可以自动从数据池中取出数据,完成测试。
我们可用如下方法建立 Datapool。启动 Rational TestManager;Tools>Manage>Datapool,点击 New…,输入数据池名称点“确定”;在打开的 Data Type Specification 中添加字段定义。添加完毕后就可以编辑该 Datapool,输入测试数据。
每一个 Datapool 就如同数据库中的一张表,可以定义列的名称和数据类型。数据就如同数据库表中的数据,保存在 Datapool 中。
图 1. Datapool 简单示例
DatapoolExample.png
在上图示例中,Datapool 的名字为 TestPool,它有 2 个 fields:ID 和 FileName。这个 Datapool 中包含 2 条数据。
在 GUI 脚本中使用 Datapool
Datapool 提供了一种简单而有效的维护测试数据的方法。在 GUI 脚本中取得 Datapool 中存储的数据也非常简单。
例如我们要取得图 1 示例中的测试数据,代码如下:
清单 1 获取 Datapool 中的测试数据
Dim sID(2) As String
Dim sFileName(2) As String
dim x as integer
Dim dpID As Long
dpID = SQADatapoolOpen("TestPool") ‘打开 Datapool
for x=1 to 2
Call SQADatapoolFetch(dpID)
Call DM_DpValue(dpId, "ID", sID(x))
Call DM_DpValue(dpId, "FileName", sFileName(x))
next
Call SQADatapoolClose(dpID) ‘关闭 Datapool
|
使用以上代码就是从 TestPool 中取得其中存储的 2 行数据的示例。
Robot 如何保存 Datapools 的定义和数据
在 Robot 项目中,默认有一个目录保存了所有 Datapools 的数据。这个目录是:
%ProjectRootFolder%\TestDatastore\DefaultTestScriptDatastore\TMS_Datapool
每一个 Datapools 定义都将有 3 或 4 个相同文件名不同扩展名的文件保存在这个目录下。例如项目中有一个 Datapools 定义叫做 TestPool。对应的数据文件为:
TestPool.Datapool.rtxml(metadata)
TestPool.off(这个文件不是每一个 Datapools 定义都有)
TestPool.spc(列名)
TestPool.csv(数据)
|
合并 Datapools 不需要修改这些数据文件。但如果只是把这些文件拷贝到合并后项目的 %ProjectRootFolder%\TestDatastore\DefaultTestScriptDatastore\TMS_Datapool 目录中,从 TestManager 的 Datapools 管理窗口中看不到这些新拷贝的 Datapools 定义。
这是因为 Robot 的 Datapools 定义是保存在一个 Microsoft Access 数据库中的。这个数据库的位置是:
%ProjectRootFolder%\TestDatastore\DefaultTestScriptDatastore\tds.mdb
其中有一个表叫做 Datapool,该表存储了所有该项目的 Datapools 定义。该表的结构是:
表 1. Datapool Table 结构|
Column
|
Type
| |
UID
|
Character
| |
Name
|
Character
| |
Description
|
Character
| |
CreationDate
|
Date/Time
| |
ModificationDate
|
Date/Time
| |
LastModifyBy
|
Character
| |
CreatedBy
|
Character
|
各列的含义很容易从名字知道。UID 是主键。
表 2. Datapool Table 记录示例|
Column
|
Data
| |
UID
|
179ede64-833b-4ee4-a086cd66eb8f3ed5
| |
Name
|
TestDatapool
| |
Description
| | |
CreationDate
|
1/8/2007 16:20:01
| |
ModificationDate
|
1/8/2007 16:20:01
| |
LastModifyBy
|
admin
| |
CreatedBy
|
admin
|
还有一个表存储了项目中各个数据部分的关系,这个表叫做 TMS_UIDMAP。它的表结构如下:
表 3. TMS_UIDMAP Table 结构|
Column
|
Type
| |
UID
|
Character
| |
ParentUID
|
Character
| |
Name
|
Character
| |
ArtifactType
|
Character
| |
ArtifactPath
|
Character
|
这个表存储的关系不仅仅限于 Datapools,但我们只要关心 Datapools 的存储就好。下面是一个 Datapools 的根记录示例,这个示例为表中所有 Datapools 的根记录:
表 4. Root Record Example|
Column
|
Data
| |
UID
|
ad6b7046-a689-4286-98a11a6d1305172
| |
ParentUID
| | |
Name
|
Datapool
| |
ArtifactType
|
RootFolder
| |
ArtifactPath
|
Datapool.RootFolder.rtxml
|
我们注意到这条记录没有 ParentUID,它的 ArtifactType 为 RootFolder,而所有其他 ArtifactType 为 Datapool 的记录的 ParentUID 都等于它的 UID。ArtifactType 为 RootFolder,而 Name 为 Datapool 的记录在表中有且仅有这一条。
表 5 是一个普通 Datapool 的记录示例:
表 5. Normal Datapool Record Example|
Column
|
Data
| |
UID
|
179ede64-833b-4ee4-a086cd66eb8f3ed5
| |
ParentUID
|
ad6b7046-a689-4286-98a11a6d1305172
| |
Name
|
TestDatapool
| |
ArtifactType
|
Datapool
| |
ArtifactPath
|
TMS_Datapools\TestDatapool.Datapool.rtxml
|
我们看到这条记录的 ParentUID 正是 Datapool 根记录的 UID,而它的 ArtifactPath 记录了该 Datapool 的数据文件位置,这个位置的格式为 TMS_Datapools\%DatapoolName%.Datapool.rtxml。
而该记录的 UID,是名为 TestDatapool 的 Datapool 在 Datapool 表中的那条记录的 UID。请参看上面的 Datapool 表中的记录示例。
下面是 Datapool 表和 TMS_UIDMAP 表的关系图。
图 2. Datapool 和 TMS_UIDMAP 表关系图
当我们用 TestManager 的图形界面添加一个新的 Datapool 时,系统会向 Datapool 表中插一条记录记录 Datapool 的信息,并且向 TMS_UIDMAP 表中插一条记录,该记录的 ParentUID 是 TMS_UIDMAP 表中 ArtifactType 为 RootFolder 且 Name 为 Datapool 的记录的 UID。
如何合并 Datapools 定义和数据
根据以上分析,我们很容易得知如何把一个 Robot 项目中的 Datapools 定义和数据合并到另一个 Robot 项目中去。以下是详细步骤:
-
保证源项目中需要合并的 Datapools 的名字不存在于目标项目中。
-
从源项目的
%ProjectRootFolder%\TestDatastore\DefaultTestScriptDatastore\tds.mdb 数据库中得到所有需要合并的 Datapools 的记录。
-
把这些记录插入目标项目的相应数据库的
Datapools 表中,为每一条记录依照原格式重新生成一个唯一的 UID。(生成的方法有很多,这里就不赘述了)
-
从目标项目的相应数据库的
TMS_UIDMAP 表中找到 ArtifactType 为 RootFolder 且 Name 为 Datapool 的记录,并得到它的 UID。
-
依照合并到目标项目的
Datapools 表中的新纪录和从 TMS_UIDMAP 表中得到的根记录的 UID,把所有合并的 Datapools 每一个都插一条新记录到 TMS_UIDMAP 表中。
-
把源项目的
%ProjectRootFolder%\TestDatastore\DefaultTestScriptDatastore\TMS_Datapools 目录下需要合并的 Datapools 对应的数据文件拷贝到目标项目的对应目录下。
-
用 Rational TestManager 打开目标项目,选择菜单 Tools->Manage->Datapools 打开 Datapools 管理窗口,确认需要合并的 Datapools 都出现在列表里。尝试编辑它们的定义和数据,确认它们都和源项目中的一致。
-
合并完成。
依据这个方法我编写了一个工具来帮助我们的团队合并项目中的 Datapool。这使得合并 Datapool 变的非常简单,很大的提高了我们的效率。
本方法在 Rational Robot 2003 和最新的 Rational Robot V7 中测试通过。Robot 项目的存储数据库结构在这两个版本中没有变化。
结论
本文展示了如何合并两个 Rational Robot 项目中的 Datapool 的定义和数据,并给出了详细的解释和步骤。希望本文能够帮助有同样需求的团队提高他们的工作效率。
参考资料 学习
获得产品和技术
讨论
关于作者  | 
|  | 张捷,现为 IBM CDL 负责 DB2 Document Manager 功能测试的工程师。2002 年毕业于清华大学计算机系,获得硕士学位,有四年 Java 开发经验。现致力于建立稳定高效测试自动化流程的工作。 |
对本文的评价
|