QTP - Estrutura de Projeto
Vamos projetar uma estrutura simples tomando um aplicativo de amostra. Vamos automatizar alguns cenários do aplicativo em teste e escrever funções reutilizáveis.
O aplicativo de amostra em teste é "Calculator", um aplicativo padrão que está disponível como parte do Windows. Vamos agora criar diferentes componentes de uma estrutura. Aqui, desenvolveremos uma estrutura híbrida e usaremos o Repositório de objetos, pois é um aplicativo bastante simples. No entanto, essa estrutura também pode ser dimensionada para oferecer suporte a um aplicativo complexo.
A estrutura de pastas do Framework é mostrada abaixo -
Explicação da estrutura da pasta -
Master Driver Script- O script que conduz toda a execução. Ele executa os pré-requisitos e as configurações iniciais necessárias para a execução.
Library Files - As funções associadas que formam a Biblioteca de funções.
Data Table - Os dados de teste necessários para a execução.
Object Repository - Os objetos e suas propriedades que permitem ao QTP reconhecer os objetos perfeitamente.
Execution Logs - A pasta contém o arquivo de log de execução com funções do usuário e histórico de execução de funções.
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 =====================
Arquivos de biblioteca
As funções da calculadora são gravadas em um arquivo de função separado salvo com a extensão .qfl ou .vbs. Essas funções são reutilizáveis em ações.
' 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 ============================= '
O outro arquivo de biblioteca, que é 'common_utils.qfl', contém as funções, o que nos permite gravar a saída em um arquivo de texto.
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 =====================
Repositório de Objetos
O repositório de objetos tem todos os objetos sobre os quais o usuário estaria agindo. A imagem abaixo mostra a lista de todos os objetos adicionados ao repositório com o nome calc.tsr
Tabela de dados
DataTable contém as palavras-chave, que conduzem os testes e também testa os dados com os quais o QTP atuará nos objetos.
O Registro de Execução
O arquivo de log de execução ou arquivo de saída contém ações do usuário e log de função, o que permitirá aos testadores depurarem em caso de falhas de script.
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: ## # # # # # # # # # # # # # # # # # # # # # # # # #
# # # # # #