开发手册 欢迎您!
软件开发者资料库

QTP - 设计框架

QTP设计框架 - 从简单和简单的步骤开始,从简单和简单的步骤了解QTP(QuickTest Professional)和相关概念,包括记录和回放,对象存储库,操作,数据表,检查点,同步,调试,恢复方案,环境变量,测试结果,对象,虚拟对象,智能识别,访问数据库,使用XML,描述性编程,自动化对象模型和QTP框架。

让我们通过一个示例应用程序设计一个简单的框架.我们将自动化一些被测应用程序的场景并编写可重用的函数.

测试中的示例应用程序是"计算器",一个可用的默认应用程序作为Windows的一部分.现在让我们创建一个框架的不同组件.在这里,我们将开发一个混合框架并使用Object Repository,因为它是一个相当简单的应用程序.但是,这个框架也可以扩展以支持复杂的应用程序.

框架的文件夹结构如下所示 :

QTP框架文件夹结构

文件夹结构说明 :

  • 主驾驶员脚本 : 驱动整个执行的脚本.它执行执行所需的先决条件和初始设置.

  • 库文件 : 构成函数库的关联函数.

  • 数据表 : 执行所需的测试数据.

  • 对象存储库 : 允许QTP无缝识别对象的对象及其属性.

  • 执行日志 : 文件夹包含具有用户功能和功能执行历史的执行日志文件.

主驱动程序脚本

'= = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = ' MASTER DRIVER SCRIPT NAME    : Calculator ' DESCRIPTION                  : Drivers Script to Execute Automated Test for    the Calculator  ' AUTHOR                       : Tutorials Point ' DATE CREATED                 : 30-Dec-2013 ' OBJECT REPOSITORY ASSOCIATED : Calc.tsr ' LIBRARY FILES ASSOCIATED     : calculator.qfl, Common.qfl ' MODIFICATION LOG' ---------------------------------------------------- ' First Version       Tutorials point '= = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = =  Option Explicit  Public ExecDrive  ' Get the Root folder of the Test  so that we can make use of relative paths. Dim x : x = Instr(Environment.Value("TestDir"),"Driver")-2 ExecDrive = mid(Environment.Value("TestDir"),1,x)  ' Get the path of Libraries using relative to the current Drive Dim LibPath : LibPath = ExecDrive+"\Libraries  ' Dynamically Load the Function Libraries LoadFunctionLibrary LibPath + "Calculator.qfl", LibPath + "common_utils.qfl"   ' Capturing the Start Time ' clscommon is the class object created in common.qfl library file clscommon.StartTime = Time()  ' Launching the Application SystemUtil.Run "C:\Windows\System32\Calc.exe" : wait (2)  ' Initialize the Data Table Path  Dim FileName : FileName  = ExecDrive+"\TestData\Calculator.xls" Dim SheetSource : SheetSource  = "Calc_test" Dim SheetDest : SheetDest = "Global"  ' Import the DataTable into the QTP Script DataTable.ImportSheet  FileName , SheetSource , SheetDest   ' Object Repository Path Dim RepPath : RepPath = ExecDrive+"\Object_Repository\Calc.tsr" RepositoriesCollection.RemoveAll()  RepositoriesCollection.Add(RepPath)   ' To Keep a Count on iteration Dim InttestIteration                   Dim InttestRows : InttestRows = datatable.GetRowCount   '  Fetching Date-TimeStamp which will be unique for Naming the Execution Log File clscommon.StrDateFormatted = day(date()) & "_" &  MonthName(Month(date()),true) &   "_" & YEAR(date())& "_"&hour(now)&"_"&minute(now)   ' Name the LogFile  clscommon.StrLogFile = ExecDrive & "\Execution Logs &  clscommon.StrDateFormatted & ".txt"   ' Create the Execution LogFile which captures the result clscommon.Fn_FileCreate(clscommon.StrLogFile)  ' Iniitialize the Parameters and all the relevant Test Details Call Fn_InitializeLogFile()  ' Kill all the previous calculator process  Call fn_Kill_Process("calc.exe")  For InttestIteration = 1 to InttestRows    datatable.SetCurrentRow InttestIteration     Dim StrExecute : StrExecute = Ucase(Trim(datatable.Value("Run","Global")))    If StrExecute = "Y" Then        clscommon.Number1 = Trim(datatable.Value("Number_1","Global"))        clscommon.Number2 = Trim(datatable.Value("Number_2","Global"))        clscommon.Number3 = Trim(datatable.Value("Number_3","Global"))           clscommon.Number4 = Trim(datatable.Value("Number_4","Global"))        clscommon.Number5 = Trim(datatable.Value("Number_5","Global"))        clscommon.Number6 = Trim(datatable.Value("Number_6","Global"))           clscommon.Test_Case_ID  =          Trim(datatable.Value("Test_Case_ID","Global"))'             : clscommon.LogWrite "The Test Case Data is Located at :: " & tcDataPath       clscommon.tcScenario =          Trim(datatable.Value("Scenario","Global"))'             : clscommon.LogWrite "The Test Case Data is Located at :: " & tcDataPath       Dim  Expected_Val :  Expected_Val =          Trim(datatable.Value("Expected_Val","Global"))'                                    :  clscommon.LogWrite "The Test Case Data is Located at :: " & tcDataPath          Select case clscommon.tcScenario           Case "Add"             clscommon.LogWrite "=== Inside the Test Set :: " &                clscommon.tcScenario & " ==="                   Call fnCalculate("+",Expected_Val)              Case "Subtract"               clscommon.LogWrite "=== Inside the Test Set :: " &                clscommon.tcScenario & " ==="                   Call fnCalculate("-",Expected_Val)              Case "Multiply"               clscommon.LogWrite "=== Inside the Test Set :: " &                clscommon.tcScenario & " ==="                   Call fnCalculate("*",Expected_Val)              Case "Divide"               clscommon.LogWrite "=== Inside the Test Set :: " &                clscommon.tcScenario & " ==="                   Call fnCalculate("/",Expected_Val)              Case "Sqrt"               clscommon.LogWrite "=== Inside the Test Set :: " &                clscommon.tcScenario & " ==="                   Call fnCalculate("sqt",Expected_Val)       End Select    End If  Next  ' Calling the End Test to Add the result Footer in exec log file. Call fn_End_test()  '  =====================  End of Master Driver Script =====================


库文件

编写计算器函数在使用扩展名.qfl或.vbs保存的单独函数文件中.这些函数可以跨行动重复使用.

'  Calculator. Qfl File :: Associated Function Library for Calculator Master Driver  '= = = = = = = = = = = = = = = = = = = = = = = = = = = = = = =  ' FUNCTION NAME     : Fn_InitializeLogFile ' DESCRIPTION       : Function to Write the Initial Values in the Log File ' INPUT PARAMETERS  : varExecDrive,StrDB,StrUId,Strpwd,StrNewDB ' OUTPUT PARAMETERS : NIL ' RETURN VALUE      : Pass or Fail message ' DATE CREATED      : 30-Dec-2013 '= = = = = = = = = = = = = = = = = = = = = = = = = = = = = = =  Public Function Fn_InitializeLogFile()    clscommon.LogWrite "********************************************"    clscommon.LogWrite "Calc Automation Started" End Function '= = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = =  ' FUNCTION NAME     : fnCalculate ' DESCRIPTION       : Function to perform Arithmetic Calculations ' INPUT PARAMETERS  : operator,Expected_Val ' OUTPUT PARAMETERS : NIL ' RETURN VALUE      : Pass or Fail message ' DATE CREATED      : 30-Dec-2013 '= = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = =    Function fnCalculate(operator,Expected_Val)    clscommon.LogWrite "Executing the Function 'fnCalculate' "    Window("Calculator").Activate        If Trim(clscommon.Number1) <> ""  Then      Window("Calculator").WinButton(clscommon.Number1).Click    If Trim(clscommon.Number2) <> ""  Then       Window("Calculator").WinButton(clscommon.Number2).Click    If Trim(clscommon.Number3) <> ""  Then       Window("Calculator").WinButton(clscommon.Number3).Click    Window("Calculator").WinButton(operator).Click    If Trim(clscommon.Number4) <> ""  Then       Window("Calculator").WinButton(clscommon.Number4).Click    If Trim(clscommon.Number5) <> ""  Then       Window("Calculator").WinButton(clscommon.Number5).Click    If Trim(clscommon.Number6) <> ""  Then       Window("Calculator").WinButton(clscommon.Number6).Click    Window("Calculator").WinButton("=").Click    Dim ActualVal : ActualVal  =       Window("Calculator").WinEdit("Edit").GetROProperty("text")    clscommon.LogWrite "The Actual Value after the Math Operation is "& ActualVal      If Trim(ActualVal) = Trim(Expected_Val) Then       clscommon.WriteResult "Pass",  clscommon.Test_Case_ID ,          clscommon.tcScenario , " Expected Value matches with Actual Value :: "             & ActualVal        Else       clscommon.WriteResult "Fail",  clscommon.Test_Case_ID ,          clscommon.tcScenario , " Expected Value - " & Expected_Val & " Does NOT matches             with Actual Value :: " & ActualVal    End If        Window("Calculator").WinButton("C").Click        If Err.Number <> 0  Then       clscommon.LogWrite  "Execution Error : The Error Number is ::  " &          Err.Number & " The Error Description is " & Err.Description       Err.Clear    End If        clscommon.LogWrite "Exiting the Function 'fnCalculate' " End Function  '= = = = = = = = = = = = = = = = = = = = = = = = = = = ' FUNCTION NAME     : fn_Kill_Process ' DESCRIPTION       : Function to Kill the process by name ' INPUT PARAMETERS  : Application name to be killed ' OUTPUT PARAMETERS : NIL ' RETURN VALUE      : NIL ' DATE CREATED      : 30-Dec-2013 '= = = = = = = = = = = = = = = = = = = = = = = = = = =  Function fn_Kill_Process(process)    Dim strComputer ,  strProcessToKill , objWMIService , colProcessstrComputer = "."    strProcessToKill = process        Set objWMIService = GetObject("winmgmts:" _&       "{impersonationLevel=impersonate}!\ _& strComputer & "\root\cimv2")        Set colProcess = objWMIService.ExecQuery _("Select * from Win32_Process       Where Name = '" & strProcessToKill & "'")        count = 0    For Each objProcess in colProcess       objProcess.Terminate()       count = count + 1    Next End Function  '= = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = =  ' FUNCTION NAME     : fn_End_test ' DESCRIPTION       : Function to finish the test Execution process ' INPUT PARAMETERS  : Application name to be killed ' OUTPUT PARAMETERS : NIL ' RETURN VALUE      : NIL ' DATE CREATED      : 20/Dec/2013 '= = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = Function fn_End_test()    clscommon.LogWrite "Status Message - Executing the Function 'fn_End_test' "        Window("Calculator").Close    On Error Resume Next        clscommon.StopTime = Time()    clscommon.ElapsedTime = DateDiff("n",clscommon.StartTime,clscommon.StopTime)    Dim Totaltests     Totaltests = clscommon.gintPassCount+ clscommon.gintFailCount   clscommon.LogWrite "## # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # #    clscommon.LogWrite "##  The Execution Start Time  ::  " & clscommon.StartTime    clscommon.LogWrite "##  The Execution End Time   ::  " & clscommon.StopTime    clscommon.LogWrite "##  The Time Elapsed ::   " & clscommon.ElapsedTime & " Minutes "    clscommon.LogWrite "##  The OS ::  " & Environment.Value("OS")    clscommon.LogWrite "##  The Total No of Test Cases Executed  ::  " & Totaltests    clscommon.LogWrite "##  The No. of Test Case Passed ::  " & clscommon.gintPassCount    clscommon.LogWrite "##  The No. of Test Case Failed ::  " & clscommon.gintFailCount    clscommon.LogWrite "## # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # #    SystemUtil.CloseDescendentProcesses End Function  '  ===============   End of Calculator. Qfl   ============================= '


另一个库文件,包含函数的'common_utils.qfl',它使我们能够将输出写入文本文件.

Set clscommon = New OS_clsUtils  'Creating a class file to handle global variables. Class OS_clsUtils    Dim StrLogFile    Dim StrDateFormatted    Dim Result        Dim  Number1, Number2 , Number3     Dim  Number4, Number5 , Number6     Dim Test_Case_ID , tcScenario    Dim StartTime, StopTime, ElapsedTime       Dim gintPassCount , gintFailCount , gintWarningCount ,  gintdoneCount,        gintinfoCount        Function Fn_FileCreate(strFileName)       Dim objFSO:  Set objFSO = CreateObject("Scripting.FileSystemObject")       On Error Resume Next             Dim objTextFile : Set objTextFile = objFSO.CreateTextFile(strFileName)       objTextFile.Close              Set objTextFile = Nothing       Set objFSO = Nothing    End Function        Function LogWrite(sMsg)       Const ForAppending = 8              Dim objFSO : Set objFSO = CreateObject("scripting.FileSystemObject")             Dim objTextFile : Set objTextFile = objFSO.OpenTextFile          (clscommon.StrLogFile, ForAppending, True)              objTextFile.WriteLine day(date()) & "/" &  MonthName(Month(date()),true)          &  "/" & YEAR(date()) & " " & time & ": " & sMsg       objTextFile.Close              Set objTextFile = Nothing       Set objFSO = Nothing    End Function        Function WriteResult(strStatus,functionName,functionDescription,Result)       Const ForAppending = 8       Dim objFSO : Set objFSO = CreateObject("scripting.FileSystemObject")       Dim objTextFile : Set objTextFile = objFSO.OpenTextFile          (clscommon.StrLogFile, ForAppending, True)              objTextFile.WriteLine day(date()) & "/" &  MonthName(Month(date()),true)          &  "/" & YEAR(date()) & " " & time & ": " & "              * * * * * * Test Case Exec Details  * * * * * "             objTextFile.WriteLine day(date()) & "/" &  MonthName(Month(date()),true)          &  "/" & YEAR(date()) & " " & time & ": " & " Test staus :: " & strStatus       objTextFile.WriteLine day(date()) & "/" &  MonthName(Month(date()),true)          &  "/" & YEAR(date()) & " " & time & ": " & " Tese ID ::  " & functionName       objTextFile.WriteLine day(date()) & "/" &  MonthName(Month(date()),true)          &  "/" & YEAR(date()) & " " & time & ": " & " Test Description :: "             & functionDescription       objTextFile.WriteLine day(date()) & "/" &  MonthName(Month(date()),true)          &  "/" & YEAR(date()) & " " & time & ": " & " Test Result Details :: " & Result       objTextFile.WriteLine day(date()) & "/" &  MonthName(Month(date()),true)          &  "/" & YEAR(date()) & " " & time & ": " & "              * * * * * * * * * * * * * * * * * * * * * * * *  * * * * * * * * * * * "       objTextFile.Close              Set objTextFile = Nothing        Set objFSO = Nothing              Select Case Lcase(strStatus)          Case "pass"             gintPassCount = gintPassCount + 1                    Case "fail"             gintFailCount = gintFailCount+1       End Select    End Function End Class '   =====================   End of common_Utils.qfl =====================


对象存储库

对象存储库已获得用户将要操作的所有对象.下面给出的图像显示了添加到存储库中的所有对象的列表,名称为calc.tsr

OR of AUT

数据表

DataTable包含关键字,它们驱动测试并测试QTP将作用于对象的数据.

框架中使用的数据表

执行日志

执行日志文件或输出文件包含用户操作和功能日志,这将使测试人员能够在脚本失败时进行调试.

框架中使用的数据表


8/Jan/2014 5:09:16 PM: ************************************************* 8/Jan/2014 5:09:16 PM: Calc Automation Started 8/Jan/2014 5:09:16 PM: === Inside the Test Set  ::   Add  === 8/Jan/2014 5:09:16 PM: Executing the Function 'fnCalculate'  8/Jan/2014 5:09:17 PM: The Actual Value after the Math Operation is 949.  8/Jan/2014 5:09:17 PM:  * * * * * * Test Case Exec Details  * * * * *  8/Jan/2014 5:09:17 PM: Test staus :: Pass 8/Jan/2014 5:09:17 PM: Tese ID ::  TC_001 8/Jan/2014 5:09:17 PM: Test Description :: Add 8/Jan/2014 5:09:17 PM: Test Result Details ::  Expected Value matches with Actual    Value :: 949.  8/Jan/2014 5:09:17 PM: * * * * * * * * * * * * * * * * * * * * * * * *  * * * * * * * * * * *   8/Jan/2014 5:09:17 PM: Exiting the Function 'fnCalculate'  8/Jan/2014 5:09:17 PM: === Inside the Test Set  ::   Subtract  === 8/Jan/2014 5:09:17 PM: Executing the Function 'fnCalculate'  8/Jan/2014 5:09:17 PM: The Actual Value after the Math Operation is 415.  8/Jan/2014 5:09:17 PM: * * * * * * Test Case Exec Details  * * * * *  8/Jan/2014 5:09:17 PM: Test staus :: Pass 8/Jan/2014 5:09:17 PM: Tese ID ::  TC_002 8/Jan/2014 5:09:17 PM: Test Description :: Subtract 8/Jan/2014 5:09:17 PM: Test Result Details ::  Expected Value matches with Actual    Value :: 415.  8/Jan/2014 5:09:17 PM: * * * * * * * * * * * * * * * * * * * * * * * *  * * * * * * * * * * *8/Jan/2014 5:09:17 PM: Exiting the Function 'fnCalculate'  8/Jan/2014 5:09:17 PM: === Inside the Test Set  ::   Multiply  === 8/Jan/2014 5:09:17 PM: Executing the Function 'fnCalculate'  8/Jan/2014 5:09:18 PM: The Actual Value after the Math Operation is 278883.  8/Jan/2014 5:09:18 PM: * * * * * * Test Case Exec Details  * * * * *  8/Jan/2014 5:09:18 PM: Test staus :: Pass 8/Jan/2014 5:09:18 PM: Tese ID ::  TC_003 8/Jan/2014 5:09:18 PM: Test Description :: Multiply 8/Jan/2014 5:09:18 PM:  Test Result Details ::  Expected Value matches with    Actual Value :: 278883.  8/Jan/2014 5:09:18 PM: * * * * * * * * * * * * * * * * * * * * * * * *  * * * * * * * * * * *   8/Jan/2014 5:09:18 PM: Exiting the Function 'fnCalculate'  8/Jan/2014 5:09:18 PM: === Inside the Test Set  ::   Divide  === 8/Jan/2014 5:09:18 PM: Executing the Function 'fnCalculate'  8/Jan/2014 5:09:19 PM: The Actual Value after the Math Operation is 3.  8/Jan/2014 5:09:19 PM: * * * * * * Test Case Exec Details  * * * * *  8/Jan/2014 5:09:19 PM: Test staus :: Pass 8/Jan/2014 5:09:19 PM: Tese ID ::  TC_004 8/Jan/2014 5:09:19 PM: Test Description :: Divide 8/Jan/2014 5:09:19 PM: Test Result Details ::  Expected Value matches with Actual    Value :: 3.  8/Jan/2014 5:09:19 PM: * * * * * * * * * * * * * * * * * * * * * * * *  * * * * * * * * * * *   8/Jan/2014 5:09:19 PM: Exiting the Function 'fnCalculate'  8/Jan/2014 5:09:19 PM: === Inside the Test Set  ::   Sqrt  === 8/Jan/2014 5:09:19 PM: Executing the Function 'fnCalculate'  8/Jan/2014 5:09:20 PM: The Actual Value after the Math Operation is 10.  8/Jan/2014 5:09:20 PM: * * * * * * Test Case Exec Details  * * * * *  8/Jan/2014 5:09:20 PM: Test staus :: Pass 8/Jan/2014 5:09:20 PM: Tese ID ::  TC_005 8/Jan/2014 5:09:20 PM: Test Description :: Sqrt 8/Jan/2014 5:09:20 PM: Test Result Details ::  Expected Value matches with Actual    Value :: 10.  8/Jan/2014 5:09:20 PM: * * * * * * * * * * * * * * * * * * * * * * * *  * * * * * * * * * * * 8/Jan/2014 5:09:20 PM: Exiting the Function 'fnCalculate'  8/Jan/2014 5:09:20 PM: Status Message - Executing the Function 'fn_Finish_test'  8/Jan/2014 5:09:20 PM: ## # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # #  8/Jan/2014 5:09:20 PM: ##  The Execution Start Time  ::  5:09:14 PM 8/Jan/2014 5:09:20 PM: ##  The Execution End Time   ::  5:09:20 PM 8/Jan/2014 5:09:20 PM: ##  The Time Elapsed ::   0 Minutes  8/Jan/2014 5:09:20 PM: ##  The OS ::  Microsoft Windows Vista Server 8/Jan/2014 5:09:20 PM: ##  The Total No of Test Cases Executed  ::  25 8/Jan/2014 5:09:20 PM: ##  The No. of Test Case Passed ::  25 8/Jan/2014 5:09:20 PM: ##  The No. of Test Case Failed ::   8/Jan/2014 5:09:20 PM: ## # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # #