《軟體自動化測試成功之道》節選7 - “白+黑” - 檢查資料庫的資料

TIB發表於2010-05-07

《軟體自動化測試成功之道》節選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

 

相關文章