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

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值