Rational 中 DataPool 的介绍与实际应用

发表于:2007-04-22来源:作者:点击数: 标签:rational实际nbspdatapool介绍
本文对 datapool 进行简单介绍的同时结合实际 功能测试 和 性能测试 的来讲界使用 datapool 。希望对广大的 软件测试 人员有帮助。由于写作 DataPool 是一种测试数据集,在 测试脚本 回放的时候提供给脚本的变量。 datapool 可以由 rational 产品 robot 或 T

本文对 datapool 进行简单介绍的同时结合实际功能测试性能测试的来讲界使用 datapool 。希望对广大的软件测试人员有帮助。由于写作

DataPool 是一种测试数据集,在测试脚本回放的时候提供给脚本的变量。 datapool 可以由 rational 产品 robot 或 TestManager 创建,下边的表格列举出在 robot 和 testmanager 中可以对 datapool 执行的操作:

操作

Robot

TestManager

在测试脚本中自动建立 datapool

   

创建测试脚本并产生自动数据

修改 vu 脚本中的 datapool 设置

   

修改 datapool 字段定义并修改测试数据

创建并修改数据类型

   

管理 datapool 比如改名或者拷贝

   

倒入到出数据

   

倒入数据

   

备注: rational 中 datapool 有两种文件: txt 和 csv 文件,创建 datapool 成功后会保存在

盘符 :\ 工程文件目录 \TestDatastore\DefaultTestScriptDatastore\TMS_Datapools 文件夹下

测试数据保存在有 csv 扩展名的文本文件中,所有字段信息保存在后缀名为 spc 的文件中,该文件由 testmanager 管理。

datapool 有两种创建方法,一种是在 testmanager 中建立,一种 robot 录制 vu 脚本时自动建立同名 datapool ,只有在 robot 中 tools->session record options, 设置 Generator 页面 general 的 use datapool 选项,才可以生效。下边分别介绍这两种创建和使用方法:

一.

建立 datapool :

1 .启动 Rational TestManager ;

2 . Tools>Manage>Datapool ,点击 New …,输入数据池名称点“确定”;

3 .在打开的 Data Type Specification 中添加字段定义;(字段定义说明见后)

4 .生成数据 Generate Data (产生大量数据,这里默认产生 100 个数据)

5 .修改其中的数据 Edit DataPool data

其中字段定义说明:

1) Name 指的是数据池列标题名它与测试脚本中变量相一致。如果你改变了数据池列名,也必须保证测试脚本中的变量做相应的改变;如果你不是在 Rational 测试环境下建立的数据池然后导入它, TestManager 自动给数据池列分配缺省的名称。也必须保证测试脚本中的变量与其相一致。你可以用 ime 给 datapool 字段起多字节的名字

2) Type 标准的或用户定义的数据类型都按名称向数据池列提供其值。犹如建立数据库,先建立字段名,后改动类型。

制定数据池列的数据类如下操作:

a 、选择标准类型或已存在的用户定义数据类型,点击当前显示的数据类型名称,然后从列表中选择新的数据类型。

b 、可以选择 rational 中的标准的数据类型。

c 、如果想自定义一个类型名称而不是进行选择,在用户定义数据类型前输入星号,如: *MyData;

d 、建立新的用户定义数据类型,输入数据类型名称(不要带 * ),然后点击 Return 。在你点击了 Yes 确定你想要建立用户定义的数据类型,

例如:建立新的 column ,输入列名,输入 DemoType (自定义类型),保存。这时会出现数据类型属性编辑对话框(我向 Description 中输入描述信息,确定按钮不可用,可能是 rational 的 bug ,不知道告诉 ratioanl 有没有奖励),确定,出现另一个数据类型属性编辑界面,输入测试数据,退出。选中该行生成数据, testmanager 会自动创建你输入的数据。

 e 、建立新的用户定义数据类型。

3) Sequence 数据类型的值的顺序被写入数据池列中。只要从中进行选择即可:- Random -随机向数据池列中写入数字和字母的值。- Sequential -顺序写出,如 0 , 1 , 2 , 3 , ... Sequential 仅仅支持数字值(包括日期和时间) 和生成的用户定义的日期类型。当你选择数字类型,必须确定其最大和最小的范围,间隔必须大于 0 ;- Unique 即其中的值是唯一的。也可定义最大最小值。

4) Repeat 即出现在数据池列的时间, Repeat 不能为 0 。要想设置有符号的整数和用户定义的数据类型的唯一性,设置 Reapeat 为 1 。当定义唯一值时,确定生成的数在你定义的范围之内。

5) Length 数据池列中存在的最大的数。这个长度包括小数点和负号。

6) Decimals 定义最大的浮点数的小数位,最大的设置是 6 位。

7) Interval 如果你在数据池列中设置了间隔,那么将按照你设置的顺序,而顺序变化。最小的间隔是 1 ,最大的间隔是 999999 在数字数据类型下选择了 Sequence ,并定义了最大和最小范围,间隔必须大于 0 。这设置仅仅在数字设置时有效。

8) Minimum 确定数字最小值这设置仅仅在数字设置时有效。

9) Maximum 确定数字最大值这设置仅仅在数字设置时有效。

10) Seed 是 Rational Test 为了计算随机值的数。相同的种子数产生相同的随机数,要改变随机顺序,改变种子数。

11) Data File 用户定义的数据类型的路径,这个路径是自动付给你的,不能进行修改。数据类型文件存放在你的项目文件中的 Data Type 目录,不能进行直接修改。

4 、 在设置好字段后,在 No. of records to genarete :中输入要生成的记录数,然后点击 Genarete Data 即可生成数据,或者点击 SAVE 按钮,关闭当前窗口,然后点击 manage datapools>edit>edit datapool data ,直接手工输入数据;

5 、 这样就完成了数据池的创建,还可以执行数据池的编辑、改名、删除、导入、导出等操作;

6 、 数据池有数据生成能力,但是不具备数据的计算能力。这种情况下可以利用其他工具(如 EXCEL )生成数据,并保存为 csv( 逗号分割文件 ) 格式,然后在 manage datapools 中导入;

实际应用:

开发部最近提出对现有软件系统的登陆功能进行测试。测试工程师设计测试用例,在实际工作中发现登陆系统版本基本稳定,而且功能孤立,界面在将来的版本中变化的可能性不大,所以决定测试自动化,减少人工重复劳动,提高测试效率。

测试工程师开始利用黑盒测试方法等价类法,因果分析法,边界值法等方法设计测试用例开发功能测试脚本,用 datapool (数据池中的数据是设计测试用例的时候用到的输入值)保存测试数据。 登陆界面需要输入用户名,密码,在数据池中建立两个字段 username,password 。 Datapool 中的数据和测试用例中输入数据相一致。

第一步:创建名字为 dp 的 datapool, 假如字段 name,password 并自动生成数据,然后把测试用例中各种数据输入 dp 中

第二步:录制功能测试脚本,脚本如下:

    Sub Main

    Dim Result As Integer

    'Initially Recorded: 2004-4-24 10:59:24

    'Script Name: Five

    StartApplication "xxx"

    Window SetContext, "Caption= 登陆 ", ""

    InputKeys "sa"

    EditBox Click, "ObjectIndex=1", "Coords=34,9"

    InputKeys "sa"

    PushButton Click, "Text= 登陆 "

    Window SetContext, "Caption= 登陆 ;Class=#32770", ""

    PushButton Click, "Text= 确定 "

    End Sub

第三步:循环读出 datapool 数据,进行自动化测试,脚本如下

    '$Include "sqautil.sbh"

    Sub Main

    Dim Result As Integer

    Dim dp_id as Long

    Dim dp_Result as Long

    Dim strName as String

    Dim strPassWord as String

    'Initially Recorded: 2004-4-24 10:30:51

    'Script Name: Four

    StartApplication "xxx"

    Window SetContext, "Caption= 登陆 ", ""

    dp_id = SQADatapoolOpen ("dp", FALSE, SQA_DP_SEQUENTIAL, FALSE)

    dp_Result = SQADatapoolFetch (dp_id)

    while dp_Result <> sqaDpEOF

    dp_Result = SQADatapoolValue (dp_id, "name", strName)

    dp_Result = SQADatapoolValue (dp_id, "password", strPassWord)

    dp_Result = SQADatapoolFetch (dp_id)

    InputKeys strName

    EditBox Click, "ObjectIndex=1", "Coords=34,9"

    InputKeys strPassWord

    PushButton Click, "Text= 登陆 "

    Window SetContext, "Caption= 登陆 ;Class=#32770", ""

    PushButton Click, "Text= 确定 "

    wend

    dp_Result = SQADatapoolClose (dp_id)

    End Sub

第四步: 加入执行成功和失败的 result 信息并写入 Result report 中,和必要的除错处理。对脚本进行优化。加入 BASELINE 设置(对于测试基线有两种思路,一种是文件处理,采用文件类型为文本文件或者 EXCEL 或者 WORD ,读取 DATAPOOL 测试数据和文件内容对比,检测测试数据是否在文件中存在,当然这里的测试基线考虑的不够周全,你可以定制规则,逐步完善,一种是直接从数据库中读取数据进行对比 , 用数据库作为 baseline 来避免以后增加测试用例后改动 baseline 文件,当然这么做跟测试理论不合,应该把预期输出保存到特定文件中作为 baseline, 这个留给你自己动手来改进)。

脚本如下:

    '$Include "sqautil.sbh"

    Sub Main

    Dim Result As Integer

    Dim dp_id as Long

    Dim dp_Result as Long

    Dim strMessage as String

    Dim vSText as string

    Dim cnn As object

    Dim Rst As object

    Dim strLink As String

    Dim strSql As String

    Dim strName as String

    Dim strPassWord as String

    'Initially Recorded: 2004-4-24 10:30:51

    'Script Name: Four

    strLink = " 连接字符串 "

    Set cnn = CreateObject("ADODB.Connection")

    Set Rst = CreateObject("ADODB.Recordset")

    cnn.Open strLink

    Rst.CursorLocation = 0

    Rst.LockType = 1

    Rst.CursorType = 2

    On Error Goto Last

    StartApplication "xxx"

    Window SetContext, "Caption= 登陆 ", ""

    dp_id = SQADatapoolOpen ("dp", FALSE, SQA_DP_SEQUENTIAL, FALSE)

    dp_Result = SQADatapoolFetch (dp_id)

    if (dp_Result = 0) then

    while dp_Result <> sqaDpEOF

    dp_Result = SQADatapoolValue (dp_id, "name", strName)

    dp_Result = SQADatapoolValue (dp_id, "password", strPassWord)

    dp_Result = SQADatapoolFetch (dp_id)

    InputKeys strName

    EditBox Click, "ObjectIndex=1", "Coords=34,9"

    InputKeys strPassWord

    PushButton Click, "Text= 登陆 "

    strMessage = " 用户名: " + strName + "; 密码: " + strPassWord

    strSql = "select * from login where name = "" " + strName + " "" and password = """ + strPassWord + """"

    Rst.open strSql, cnn

    Window SetContext, "Caption= 登陆 ;Class=#32770", ""

‘ 这个函数是作为插入验证点,验证点为窗体提示信息,没有用 window image 来作为验证点,是因为无法把该脚本进行模块化,存入 shl 文件中,将来多平台使用。

SQAGetProperty "Label", "Text", vSText

‘ 如果 rst.RecordCount 返回值为 1 ,说明此用户在数据库中存在

‘ 测试用例分为成功,失败的测试用例,失败的测试用例中即使数据

' 错误,但有预期输出就是成功的用例,所以写入 result report 中的信

‘ 息分为三种,成功,失败,预期失败,对于程序中有不是预期的窗

‘ 体,用程序自动关闭掉,继续执行,这里安全的做法做标志然后关

‘ 闭整个软件,重新启动软件,测试脚本从失败处继续执行

    if Rst.RecordCount= 1 then

    if (vSText=" 登陆成功 ") then

    PushButton Click, "Text= 确定 "

    SQALogMessage sqaPass, " 测试数据为 " + strMessage + " 的测试用例执行成功 ", " 项目名称 "

    else

' 出现异常窗体,该用例测试失败

    SQALogMessage sqaFail, " 测试数据为 " + strMessage + " 的测试用例执行失败 ", " 项目名称 "

    SQAGetProperty "Window", "Text", vSText

    SQALogMessage sqaFail, " 出现错误窗体 :"+ vSText, " 项目名称 "

    Window CloseWin, "Caption=" + vSText, ""

    end if

    else

    if (vSText=" 登陆失败 ") then

' 数据错误,用例执行失败,软件功能正常

    PushButton Click, "Text= 确定 "

    SQALogMessage sqaFail, " 测试数据为 " + strMessage + " 的测试用例执行失败但软件功能正常 ", " 项目名称 "

    else

' 出现异常窗体,该用例测试失败

    SQALogMessage sqaFail, " 测试数据为 " + strMessage + " 的测试用例执行失败 ", " 项目名称 "

    SQAGetProperty "Window", "Text", vSText

    SQALogMessage sqaFail, " 出现错误窗体 :"+ vSText, " 项目名称 "

    Window CloseWin, "Caption=" + vSText, ""

    end if

    end if

    wend

    dp_Result = SQADatapoolClose (dp_id)

    else

    SQALogMessage sqaFail, " 数据池打开失败 ", " 项目名称 "

    end if

    Last:

    SQALogMessage sqaFail, " 测试脚本发生异常,测试脚本执行失败 ", " 项目名称 "

    End Sub

总结:

上边脚本是对登陆功能测试自动化初步优化后的代码,后边还要做的是脚本模块化,函数话,功能分切。脚本过大不容易维护,把其中连接数据库,处理 datapool 功能写成函数提供其他工程使用。其实也可以把测试数据存入文本文件 ,word,excel 等文件中,然后读出处理模拟 datapool 功能,但开发脚本工程量大。 datapool 提供自动生成数据功能和能够和工程结合是它的优点,但很困难多个工程共享 datapool 。

二.性能测试脚本自动建立测试 datapool

在 robot 中 tools->session record options, 设置 Generator 页面 general 的 use datapool 选项,才能在产生 datapool.

一般录制性能测试脚本,遵循如下步骤:

第一. 设置录制 Session 选项

第二. 启动录制对话

第三. 启动客户端程序

第四. 产生脚本

第五. 关闭客户端程序

第六. 停止录制

设置选项:

1 .录制方法( method ) : api, network,proxy,custom 四种选项设置

通过分析要测试的软件架构来选择录制的方法,下边的表格提供参考:

Situation

Api

NetWork

Proxy

The client application aclearcase/" target="_blank" >ccess secure data from a Web server

Required

       

The Client Application access data from a web server

Recommended

Fist Alternate

Second alternate

The client application accesses objects on a DCOM Server

Required

       

The client application access an oracle8 database or oracle arrays.

Required

       

The client application access an Oracle database.(For network and proxy recording, supply the name of the oracle database,)

Recommended

First alternate

Second alternate

The client application is not installed on the local computer

   

Recommended

Alternate

The client application is not running on Windows NT4, Windows XP, or Windows 2000

   

Recommended

Alternate

You want to record traffic from multiple client applications that reside on different commputers

   

Recommended

Alternate

You want to record traffic between multiple,specific clent and server computers.

       

Recommended

Neither the client nor the serer computer is on same network segment as the local computer

       

Required

An Ethernet controls network traffic, and neither the client nor the server application is installed on the computer

       

required

The client application accesses a TUXEDO Server

Recommended

Alternate

   

“On-the-wire” recording support is lacking

Recommended

   

Alternate

Api recording is not functioning properly

   

Recommended

Alternate

FDDI,ATM,or other hight-speed networks are used

       

Recommended

备注:上图参考 rational robot user's guide ,

NetWork 录制方式必须安装 Rational 网络驱动才能生效

安装方法:

1. 开始 - 〉设置 - 〉网络和拨号连接

2. 点本地连接

3. 点安装,选择协议,点添加

4. 点选者从磁盘安装

5. 打开安装目录 C:\Program Files\Rational\Rational Test\driverw2k (安装 rational 的目录),选者 inf 文件,确定

6. 选择 ethernet 或者 token ring 都可以

2.Generator Filtering

Filtering

(1) . 设置 autoFiltering 使 robot 生成脚本时自动选择可用协议 , 下边协议选者列表可用

特别说明 DCOM 是一种独占的协议,不能和其他协议共存

如果后台是 SQLSERVER ,选择 SQLSERVER, 如果后台是 ORACLE, 选择 ORACLE 协议。根据软件实现方式,选择不同的协议。

(2). 设置 Manual Protocol Filtering 使 robot 生成脚本时手工选择协议

3.Generator Per Protocol

只能对在 generator Filtering 选择的部分协议( http,iiop,Oracle,Tuxedo, 和 dcom )起作用。

实际应用:

为了说明问题。我用分别用 vb,delphi, DotNET 实现一个简单添加用户的功能,后台用 ACCESS 数据库,例用 ado 通过 odbc 连接。

1. 分析程序实现的结构,是简单的 c/s 结构,利用 odbc 连接。并且客户端,服务器端都配置在一台计算机。 ( 请注意这个是条件,我们第二步选择的基础 )

2. 设置 session Record Options

录制方法选择 api record 录制,协议用 odbc 。(如果我后台换 sqlserver 或则 oracle ,其他实现方式不变,应该选择什么协议,因该添加什么协议)

3. Vb,delphi 编码方式的功能脚本录制成功(创建同名 datapool )。 DotNet 脚本录制成功,却无法产生同名的 datapool (怎么办)。不成功脚本如下:

    /*

    ->-> Session File Information <-<-

    Created: Sun Apr 25 23:24:36 2004

    Name: G:\Program\robot\lead\TestDatastore\DefaultTestScriptDatastore\TMS_Sessions\demo.wch

    Type: Rational Robot - API

    (with ODBC)

    */

    #include <VU.h>

    {

    push Timeout_scale = 200; /* Set timeouts to 200% of maximum response time */

    push Think_def = "LR";

    Min_tmout = 120000; /* Set minimum Timeout_val to 2 minutes */

    push Timeout_val = Min_tmout;

    /* No Datapool Items Remain */

    /* After All Data Analyses. */

    VBNETDemo = sqlconnect("VBNETDemo", "", LOOKUP_PWD,

    "VBNETDemo", "odbc",

    "DRIVER_INFO='DSN=?;;UID=DEFAULT;PWD=DEFAULT;'");

    /*

    { INFO SERVER "UNKNOWN"="0.0.0.0"; } */

    /*

    Unable to determine Server Name/Address */

    set Server_connection = VBNETDemo;

    push Think_avg = 0;

    stmt_2_1_id = sqlopen_cursor ["pre001"] "", "select * from login";

    set Think_avg = 313;

    push CS_blocksize = 1;

    sqlfetch_cursor ["pre002"] stmt_2_1_id, ALL_ROWS;

    set Think_avg = 0;

    sqlclose_cursor ["pre003"] stmt_2_1_id ;

    set Think_avg = 4078;

    stmt_2_2_id = sqlopen_cursor ["pre004"] "", "INSERT INTO `login` (`name`,`password`) VALUES (?,?)",

    "'f\002'<varchar(50):I>",

    "'f\002'<varchar(50):I>";

    set Think_avg = 0;

    sqlfree_cursor( stmt_2_2_id );

    set Think_avg = 2781;

    sqlfree_cursor( stmt_2_1_id );

    sqldisconnect(VBNETDemo);

    pop [Think_def, Think_avg, Timeout_val, Timeout_scale];

    pop CS_blocksize;

    }

点 EDIT->Datapool information 报错没有 datapool config ,那就动手修改脚本

4 .修改脚本后如下

    /*->-> Session File Information <-<-

    Created: Sun Apr 25 23:24:36 2004

    Name: G:\Program\robot\lead\TestDatastore\DefaultTestScriptDatastore\TMS_Sessions\demo.wch

    Type: Rational Robot - API

    (with ODBC)

    */

    #include <VU.h>

    {

    push Timeout_scale = 200; /* Set timeouts to 200% of maximum response time */

    push Think_def = "LR";

    Min_tmout = 120000; /* Set minimum Timeout_val to 2 minutes */

    push Timeout_val = Min_tmout;

    /* No Datapool Items Remain */ 红色字体是无法生成 datapool 的解释

    /* After All Data Analyses. */

    DP1 = datapool_open("lead"); // 添加的脚本

    datapool_fetch(DP1); // 添加的脚本

    VBNETDemo = sqlconnect("VBNETDemo", "", LOOKUP_PWD,

    "VBNETDemo", "odbc",

    "DRIVER_INFO='DSN=?;;UID=DEFAULT;PWD=DEFAULT;'");

    /*

    { INFO SERVER "UNKNOWN"="0.0.0.0"; } */

    /*

    Unable to determine Server Name/Address */

    set Server_connection = VBNETDemo;

    push Think_avg = 0;

    stmt_2_1_id = sqlopen_cursor ["pre001"] "", "select * from login";

    set Think_avg = 313;

    push CS_blocksize = 1;

    sqlfetch_cursor ["pre002"] stmt_2_1_id, ALL_ROWS;

    set Think_avg = 0;

    sqlclose_cursor ["pre003"] stmt_2_1_id ;

    set Think_avg = 4078;

    stmt_2_2_id = sqlopen_cursor ["pre004"] "", "INSERT INTO `login` (`name`,`password`) VALUES (?,?)",

    "'f\002'<varchar(50):I>",

    "'f\002'<varchar(50):I>";

    set Think_avg = 0;

    sqlfree_cursor( stmt_2_2_id );

    set Think_avg = 2781;

    sqlfree_cursor( stmt_2_1_id );

    sqldisconnect(VBNETDemo);

    pop [Think_def, Think_avg, Timeout_val, Timeout_scale];

    pop CS_blocksize;

    }

    // 下边是添加的脚本

    DATAPOOL_CONFIG "lead" OVERRIDE DP_NOWRAP DP_SEQUENTIAL DP_SHARED

    {

    EXCLUDE, "rpcarg", "string", "f";

    EXCLUDE, "rpcarg", "string", "f";

    }

脚本修改完成后,错误解决,可以打开 datapool information.

4. 建立 datapool 。

Exclude 含义是建立 datapool 但不建立 datapool 中字段,运行脚本的时候从实际录制的脚本中读数据。

Include 在 datapool 建立一个同名的字段,运行脚本时从 datapool 中读数据。 Override 在 datapool 中建立同名字段,运行脚本时从实际脚本中读数据。

修改 datapool 的 usage 属性为 include ,建立 datapool 字段,生成数据,修改数据(添加测试用例中的数据)

5. ( 确定脚本运行正常 ) robot 中运行脚本,启动 testmanager ,点 run suit 。或者直接在 testmanager 中启动 suit, 修改 changage, 选择脚本

6. 多用户访问。运行 20 个用户同时访问服务器(修改 suit 中 number of users ),运行 , 修改数字为 20 ,同时运行

7. 我们需要多用户同时访问,但是数据不同。

修改 usage 属性 exclude 为 include 。

修改 DATAPOOL Information 中 playback behavior 中 access 为 radom

use script data 为 obey usage 。运行 testmanage 中 suit 。

第二个实际应用例子比较简单,不过把可能实际应用到的情况进行了简单的阐述,这里中心是介绍 datapool 的使用,基本上把 datapool 影响到的地方介绍给大家了。希望大家在实际工作中应用自如。使我们的测试工作更上一层楼。

备注:以上例子运行在 Rational 2003 版本上。

原文转自:http://www.ltesting.net