《软件自动化测试成功之道》节选7 - “白+黑” - 检查数据库的数据

本文介绍了一种结合黑盒测试与白盒测试的方法,通过直接检查数据库数据确保自动化测试的有效性。以QTP附带的Flight程序为例,详细展示了如何通过编写脚本实现对数据库的操作与验证。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值