IBM®
跳转到主要内容
    中国 [选择]    使用条款
 
 
Select a scope:Search for:    
    首页    产品    服务与解决方案     支持与下载    个性化服务    
跳转到主要内容

developerWorks 中国  >  Rational  >

如何合并不同Robot项目中的Datapool定义和数据

developerWorks
文档选项

未显示需要 JavaScript 的文档选项


张 捷 (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 简单示例
Datapool 简单示例

DatapoolExample.png

在上图示例中,Datapool 的名字为 TestPool,它有 2 个 fields:IDFileName。这个 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,它的 ArtifactTypeRootFolder,而所有其他 ArtifactType 为 Datapool 的记录的 ParentUID 都等于它的 UIDArtifactTypeRootFolder,而 NameDatapool 的记录在表中有且仅有这一条。

表 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. DatapoolTMS_UIDMAP 表关系图
Datapool 和 TMS_UIDMAP 表关系图

当我们用 TestManager 的图形界面添加一个新的 Datapool 时,系统会向 Datapool 表中插一条记录记录 Datapool 的信息,并且向 TMS_UIDMAP 表中插一条记录,该记录的 ParentUIDTMS_UIDMAP 表中 ArtifactTypeRootFolderNameDatapool 的记录的 UID





回页首


如何合并 Datapools 定义和数据

根据以上分析,我们很容易得知如何把一个 Robot 项目中的 Datapools 定义和数据合并到另一个 Robot 项目中去。以下是详细步骤:

  1. 保证源项目中需要合并的 Datapools 的名字不存在于目标项目中。
  2. 从源项目的 %ProjectRootFolder%\TestDatastore\DefaultTestScriptDatastore\tds.mdb 数据库中得到所有需要合并的 Datapools 的记录。
  3. 把这些记录插入目标项目的相应数据库的 Datapools 表中,为每一条记录依照原格式重新生成一个唯一的 UID。(生成的方法有很多,这里就不赘述了)
  4. 从目标项目的相应数据库的 TMS_UIDMAP 表中找到 ArtifactTypeRootFolderNameDatapool 的记录,并得到它的 UID
  5. 依照合并到目标项目的 Datapools 表中的新纪录和从 TMS_UIDMAP 表中得到的根记录的 UID,把所有合并的 Datapools 每一个都插一条新记录到 TMS_UIDMAP 表中。
  6. 把源项目的 %ProjectRootFolder%\TestDatastore\DefaultTestScriptDatastore\TMS_Datapools 目录下需要合并的 Datapools 对应的数据文件拷贝到目标项目的对应目录下。
  7. 用 Rational TestManager 打开目标项目,选择菜单 Tools->Manage->Datapools 打开 Datapools 管理窗口,确认需要合并的 Datapools 都出现在列表里。尝试编辑它们的定义和数据,确认它们都和源项目中的一致。
  8. 合并完成。

依据这个方法我编写了一个工具来帮助我们的团队合并项目中的 Datapool。这使得合并 Datapool 变的非常简单,很大的提高了我们的效率。

本方法在 Rational Robot 2003 和最新的 Rational Robot V7 中测试通过。Robot 项目的存储数据库结构在这两个版本中没有变化。





回页首


结论

本文展示了如何合并两个 Rational Robot 项目中的 Datapool 的定义和数据,并给出了详细的解释和步骤。希望本文能够帮助有同样需求的团队提高他们的工作效率。



参考资料

学习

获得产品和技术

讨论


关于作者

作者

张捷,现为 IBM CDL 负责 DB2 Document Manager 功能测试的工程师。2002 年毕业于清华大学计算机系,获得硕士学位,有四年 Java 开发经验。现致力于建立稳定高效测试自动化流程的工作。




对本文的评价

太差! (1)
需提高 (2)
一般;尚可 (3)
好文章 (4)
真棒!(5)

建议?







回页首


IBM 公司保留在 developerWorks 网站上发表的内容的著作权。未经IBM公司或原始作者的书面明确许可,请勿转载。如果您希望转载,请通过 提交转载请求表单 联系我们的编辑团队。
    关于 IBM 隐私条约 联系 IBM 使用条款