《软件自动化测试成功之道》节选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