QTP - Designing Framework

Advertisements


Designing a Framework:

The sample application under test is "Calculator", a default application that is available as part of Windows. Let us now create different components of a framework. Here, we will develop a hybrid framework and use Object Repository as it is fairly a simple application. However, this framework can be scaled to support a complex application as well.

The Folder Structure of the Framework is as follows. The Explanation of the folder structure is explained below:

QTP Framework Folder Structure
  1. Master Driver Script - The Script that drives the entire execution. It performs prerequisite and initial settings that are required for the execution.

  2. Library Files - The Associated Functions that forms the Function Library

  3. Data Table - The Test Data that is required for the Execution.

  4. Object Repository - The Objects and its properties that enable QTP to recognize the objects seamlessly.

  5. Execution Logs - The Folder contains the execution log file with user functions and function execution history.

Master Driver Script

'= = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = =
' 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 ===================== 

Library Files

The Calculator Functions are written in a separate function file saved with the extension .qfl or .vbs. These functions are reusuable across actions.

'  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 , colProcess
	strComputer = "."
	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   ============================= ' 

The other library file which is 'common_utils.qfl' that contains the functions which enables us to write the output to a text file.

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 =====================

Object Repository:

Object Repository has got all the objects that the user would be acting upon. The below image shows the list of all objects added into the repository with the name calc.tsr

OR of the AUT

Data Table

Data Table contains the keywords which drive the tests and also Test data with which QTP will act on the objects.

Data Table used in the Framework

The Execution Log:

The Execution log file or output file contains user actions and function logs which will enable the testers to debug upon script failures.

Data Table used in the Framework
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: ## # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # #


Advertisements
Advertisements