Давайте разработаем простую структуру, взяв пример приложения. Мы автоматизируем несколько сценариев тестируемого приложения и напишем многократно используемые функции.
Примером тестируемого приложения является «Калькулятор» , приложение по умолчанию, которое доступно как часть Windows. Давайте теперь создадим различные компоненты каркаса. Здесь мы разработаем гибридную среду и будем использовать репозиторий объектов, поскольку это довольно простое приложение. Тем не менее, эта структура может быть расширена для поддержки сложного приложения.
Структура папок Framework показана ниже:
Объяснение структуры папок —
-
Главный драйвер сценария — сценарий, который управляет всем исполнением. Он выполняет предварительные и начальные настройки, необходимые для выполнения.
-
Файлы библиотеки — связанные функции, которые образуют библиотеку функций.
-
Таблица данных — Тестовые данные, необходимые для выполнения.
-
Репозиторий объектов — Объекты и его свойства, которые позволяют 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.
Таблица данных
DataTable содержит ключевые слова, которые запускают тесты, а также тестируют данные, с которыми QTP будет воздействовать на объекты.
Журнал выполнения
Файл журнала выполнения или выходной файл содержит действия пользователя и журнал функций, которые позволят тестировщикам выполнять отладку при сбоях сценария.