QTP - 设计框架
让我们通过一个示例应用程序来设计一个简单的框架。我们将自动化测试应用程序的几个场景并编写可重用的功能。
测试的示例应用程序是"计算器",它是 Windows 的一部分,是默认应用程序。现在让我们创建框架的不同组件。在这里,我们将开发一个混合框架并使用对象存储库,因为它是一个相当简单的应用程序。但是,这个框架可以扩展以支持复杂的应用程序。
框架的文件夹结构如下所示 −
文件夹结构的说明 −
主驱动程序脚本 −驱动整个执行的脚本。它执行执行所需的先决条件和初始设置。
库文件 − 构成函数库的关联函数。
数据表 − 执行所需的测试数据。
对象存储库 − 使 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 & " oot\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 的所有对象的列表
数据表
数据表包含驱动测试的关键字,还包含 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: ## # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # #