本文對 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.anti-gravitydesign.com