《軟體自動化測試成功之道》節選7 - “白+黑” - 檢查資料庫的資料
《軟體自動化測試成功之道》節選7 - “白+黑” - 檢查資料庫的資料
http://www.china-pub.com/196509
按照手工測試的習慣,我們一般在測試資料庫型別的軟體系統時,除了在介面上執行操作,檢查各種查詢結果之外,還需要登入到後臺資料庫,檢視裡面的資料,看是否如預期般修改了資料。同樣的,我們在用自動化測試的手段實現這些測試用例時,一樣要對後臺資料庫的資料進行檢查。
下面以QTP附帶的Flight程式為例說明這種測試方法:
在Flight程式中,對於它的‘New Order’功能的測試可以採用下面的指令碼:
//.............................................................................
// 目的:新建訂票記錄
// 輸入引數:
// DataOfFlight: 飛行日期 ,例如 '121212'
// FlyFrom: 行起點,例如 'Denver'
// FlyTo: 飛行終點,例如 'Frankfurt'
// SelecteFlight: 航班號,例如 '14697'
// CustomerName: 訂票人名,例如 'cnj'
// Tickets 訂票數量,例如 :'1'
// 返回結果:訂票號
// 注意事項:
// 作者:陳能技
// 日期:2008-4-25
//.............................................................................
Function NewOrder(DataOfFlight,FlyFrom,FlyTo,SelecteFlight,CustomerName,Tickets);
var p1 : OleVariant;
var w1 : OleVariant;
var w2 : OleVariant;
var FlightTable, I ,sFlight ,OrderNo: OleVariant;
begin
p1 := Aliases.Sys.FlightReservationSystem;
w1 := p1.Window('Afx:400000:b*', 'Flight Reservation').Window('#32770');
w1.Window('Button', '', 15).ClickButton;
// 選擇飛行日期
w1.Window('MSMaskWndClass').Keys(DataOfFlight);
// 選擇飛行起點
w1.Window('ComboBox', '', 1).ClickItem(FlyFrom);
// 選擇飛行終點
w1.Window('ComboBox', '', 2).ClickItem(FlyTo);
// 選擇航班
w1.Window('Button', 'FLIGHT').ClickButton;
FlightTable := NameMapping.Sys.FlightReservationSystem.Window('#32770', 'Flights Table', 1);
For I:= 0 to FlightTable.Window('ListBox').wItemCount -1 do
begin
sFlight := VarToStr(FlightTable.Window('ListBox').wItem[I]);
IF Pos(SelecteFlight,sFlight)<>0 then
begin
FlightTable.Window('ListBox').DblClickItem(I);
break;
end;
end;
// 輸入訂票人
w1.Window('Edit', '', 1).Keys(CustomerName);
w2 := w1.Window('Edit', '', 2);
// 輸入訂票數
w2.wText := Tickets;
w1.Window('Button', '&Insert Order').ClickButton;
// 等待插入資料到資料庫完成
Sleep(10000);
// 取得訂票號,作為返回結果
OrderNo:= NameMapping.Sys.FlightReservationSystem.Window('Afx:400000:b:10011:6:120d17', 'Flight Reservation', 1).Window('#32770', '', 1).Window('Edit', '', 9).wText;
Result := VarToStr(OrderNo);
end;
// NewOrder函式的使用例子:
Procedure Test_NewOrder;
Var OrderNo : OleVariant;
begin
OrderNo := VarToStr(NewOrder('121212','Denver','Frankfurt','14697','CNJ','2'));
Log.Message(OrderNo);
end;
但是上面的指令碼僅僅是功能操作,缺乏檢查和驗證,不知道究竟新增操作是否成功。
在介面上的黑盒測試,一般採用觀察或執行查詢功能(‘Open Order’)來驗證。例如,可使用下面的指令碼來實現這種方法:
//.............................................................................
// 目的:查詢指定訂票號對應的顧客名。
// 輸入引數:
// OrderNumber :訂票號。
// 返回結果:
// CustomerName :顧客名
// 注意事項:
// 作者:陳能技
// 日期:2008-4-25
//.............................................................................
Function QueryOrder(OrderNumber);
var OrderQueryForm : OleVariant;
var CustomerName : OleVariant;
begin
OrderQueryForm := NameMapping.Sys.FlightReservationSystem.Window('#32770', 'Open Order', 1);
OrderQueryForm.Window('Button', '&Order No.').ClickButton(cbChecked);
OrderQueryForm.Window('Edit', '', 2).Keys(VarToStr(OrderNumber));
OrderQueryForm.Window('Button', 'OK').ClickButton;
// 如果找不到...
CustomerName := NameMapping.Sys.FlightReservationSystem.Window('Afx:400000:b:10011:6:120d17', 'Flight Reservation', 1).Window('#32770', '', 1).Window('Edit', '', 1).wText;
Result := VarToStr(CustomerName);
end;
// QueryOrder函式的使用例子:
Procedure Test_QueryOrder;
begin
Log.Message(VarToStr(QueryOrder('13')));
end;
利用上面的兩個指令碼函式,可組織成一個完整的測試用例:
uses
GoToModule,
Order,
DBChecker;
Procedure ST_NewOrder;
Var OrderNo ,CustomerName: OleVariant;
begin
OpenVarMenu('File|New Order');
OrderNo := VarToStr(NewOrder('121212','Denver','Frankfurt','14697','CNJ','2'));
OpenVarMenu('File|Open Order...');
CustomerName := QueryOrder(OrderNo);
If VarToStr(CustomerName)= 'CNJ' then
begin
Log.Message('新建訂票記錄成功!');
end
else
begin
Log.Message('訂票號對應的顧客名不對!');
end;
end;
但是,如果專案目前處於開發階段,New Order功能做好了,但是Open Order功能還沒有做好,怎麼測試呢?這種時候,前面的方法就不適用了,但是我們可以採用“白+黑”的測試方法,直接檢查資料庫的資料,看NewOrder功能產生的資料是否正確地插入到後臺資料庫中了。改成如下指令碼:
Procedure ST_NewOrder_AssertDB;
Var OrderNo ,CustomerName,TestResult: OleVariant;
begin
OpenVarMenu('File|New Order');
OrderNo := VarToStr(NewOrder('121212','Denver','Frankfurt','14697','CNJ','2'));
//OpenVarMenu('File|Open Order...');
//CustomerName := QueryOrder(OrderNo);
TestResult := AssertDataValue(
'Provider=Microsoft Jet 4.0 OLE DB Provider;Data Source=C:/Program Files/Mercury Interactive/QuickTest Professional/samples/flight/app/New_flight32.mdb',
'Orders',
'Order_Number',
OrderNo,
'Customer_Name',
'CNJ'
);
If TestResult = True then
begin
Log.Message('訂票記錄插入成功!');
end
else
begin
Log.Message('找不到訂票號對應的訂票記錄');
end;
end;
其中,AssertDataValue函式如下所示,AssertDataValue函式用於檢查資料表的某條記錄中的某欄位值是否等於預期值:
//.............................................................................
// 目的:檢查資料表的某條記錄中的某欄位值是否等於預期值
// 輸入引數:
// ConnectionString : 資料庫連線串,例如:'Provider=Microsoft Jet 4.0 OLE DB Provider;Data Source=C:/Program Files/Mercury Interactive/QuickTest Professional/samples/flight/app/New_flight32.mdb'
// TableName :資料表名,例如: 'Orders'
// SearchField : 查詢欄位(一般是唯一標識記錄行的欄位),例如:'Order_Number'
// SearchValue : 查詢的欄位值,例如:7
// AssertField : 檢查的欄位,例如: 'Customer_Name'
// AssertValue : 期待值,例如:'Jane Doe'
// 返回結果:
// True: 找到指定記錄。
// False:未找到指定記錄。
// 注意事項:
// 作者:陳能技
// 日期:2008-4-25
//.............................................................................
Function AssertDataValue(ConnectionString , TableName , SearchField ,SearchValue , AssertField ,AssertValue);
var
Conn, Rs, Fldr , Data , Found : OleVariant;
begin
Found := False;
// 建立並開啟連線
Conn := Sys.OleObject['ADODB.Connection'];
Conn.ConnectionString := ConnectionString;
Conn.Open();
// 建立並開啟記錄集
Rs := Sys.OleObject['ADODB.Recordset'];
Rs.Open(TableName, Conn, 3 {adOpenStatic},
1 {adLockReadOnly}, 2 {adCmdTable});
// 讀取資料
Rs.MoveFirst();
while not Rs.EOF do
begin
Data := Rs.Fields.Item(SearchField).Value ;
//Log.Message(Data);
If VarToStr(Data) = SearchValue then
begin
Found := True;
If VarToStr(Rs.Fields.Item(AssertField).Value) = AssertValue then
begin
Log.Message('記錄結果與預期值相等。');
end
else
begin
Log.Error('記錄結果與預期值不相等!');
end;
break;
end;
Rs.MoveNext();
end;
// 關閉記錄集和連線
Rs.Close();
Conn.Close();
Result := Found;
end;
// AssertDataValue函式的使用例子:
procedure Test_AssertDataValue;
Var TestResult :OleVariant;
begin
TestResult := AssertDataValue(
'Provider=Microsoft Jet 4.0 OLE DB Provider;Data Source=C:/Program Files/Mercury Interactive/QuickTest Professional/samples/flight/app/New_flight32.mdb',
'Orders',
'Order_Number',
'8',
'Customer_Name',
'Jane Doe'
);
Log.Message(TestResult);
end;
另外,我們還可以封裝一個函式,用於檢查資料庫表的資料行數是否正確:
//.............................................................................
// 目的:檢查資料庫表的資料行數是否正確。
// 輸入引數:
// ConnectionString :資料庫連線串,例如:'Data Source=.;Initial Catalog = Northwind;Persist Security Info = True; User ID =sa;PassWord='
// SqlString :查詢語句,例如'Select * from Orders',
// ExpectedRowCount :期待查詢返回的資料行數,例如 840
// 返回結果:
// True :表資料行數等於預期行數。
// False :表資料行數不等於預期行數。
// 注意事項:
// 作者:陳能技
// 日期:2008-4-25
//.............................................................................
Function AssertDataRowCount(ConnectionString,SqlString,ExpectedRowCount);
var sqlCon,sqlCmd,sqlDataAdapter,ds : OleVariant;
begin
sqlCon := dotNet.System_Data_SqlClient.SqlConnection.zctor(ConnectionString);
sqlCon.Open();
sqlCmd := dotNET.System_Data_SqlClient.SqlCommand.zctor_3(SqlString,sqlCon);
sqlDataAdapter := dotNET.System_Data_SqlClient.SqlDataAdapter.zctor_2(sqlCmd);
ds := dotNET.System_Data.DataSet.zctor;
sqlDataAdapter.Fill(ds);
if ds.Tables.get_Item(0).Rows.Count <> ExpectedRowCount then
begin
Log.Error('實際返回行數:' + VarToStr(ds.Tables.get_Item(0).Rows.Count)+' , 不等於預期行數:' + VarToStr(ExpectedRowCount));
Result := False;
end
else
begin
Result := True;
end;
sqlCon.Close();
end;
// AssertDataRowCount函式的使用例子:
Procedure Test_AssertDataRowCount;
var TestResult : OleVariant;
begin
TestResult := AssertDataRowCount(
'Data Source=.;Initial Catalog = Northwind;Persist Security Info = True; User ID =sa;PassWord=',
'Select * from Orders',
840
);
Log.Message(TestResult);
end;
《軟體自動化測試成功之道》節選7 - “白+黑” - 檢查資料庫的資料
http://www.china-pub.com/196509
相關文章
- 《軟體自動化測試成功之道》節選10 - 資料庫連線配置問題資料庫
- 《軟體自動化測試成功之道》節選12 - 自動化測試指令碼的維護指令碼
- 《軟體自動化測試成功之道》學習資源
- 《軟體自動化測試成功之道》節選1 - 選擇合適的專案實施自動化測試
- 《軟體自動化測試成功之道》節選3 - DOM與IE Developer ToolBarDeveloper
- 《軟體自動化測試成功之道》節選6 - 自定義控制元件的測試方法控制元件
- 《軟體自動化測試成功之道》節選8 - 與每日構建結合
- 《軟體自動化測試成功之道》目錄
- 《軟體自動化測試成功之道》節選9 - 非預期視窗的處理
- 《軟體自動化測試成功之道》節選11 - 常用指令碼函式的封裝指令碼函式封裝
- 新書《軟體自動化測試成功之道》出版新書
- 《軟體自動化測試成功之道》節選5 - 第三方控制元件的測試方法控制元件
- 《軟體自動化測試成功之道》節選2 - 對控制元件的熟悉程度與自動化測試成功實施之間的關係控制元件
- 《軟體自動化測試成功之道》附帶的光碟說明
- 《軟體自動化測試成功之道》節選4 - 標準控制元件的特殊問題的處理方法控制元件
- 《軟體自動化測試成功之道》內容簡介和前言
- 《軟體自動化測試成功之道》隨書附帶原始碼原始碼
- 自動化測試如何管理測試資料
- 軟體測試:自動化測試
- 軟體測試之資料庫系列六資料庫
- 軟體測試之資料庫系列五資料庫
- 軟體測試之資料庫系列四資料庫
- 軟體測試之資料庫系列三資料庫
- 軟體測試之資料庫系列二資料庫
- 軟體測試之資料庫系列一資料庫
- 測試資料庫是否安裝成功資料庫
- 軟體測試自動化
- 深圳軟體測試學習:【資料庫】-【oracle】-連線查詢資料庫Oracle
- 恰當選擇軟體測試自動化方案
- 軟體測試之資料庫測試技術系列七資料庫
- 軟體測試筆記——11.自動化測試和手動測試的選擇筆記
- 軟體測試--資料庫基礎知識資料庫
- 軟體測試自動化框架框架
- 軟體測試--前後端資料互動後端
- 軟體測試框架——自動化測試框架框架
- 測試資料之自動生成
- 請問自動化測試應該測試非法資料嗎
- 軟體開發中的資料庫測試技術資料庫