I need to leverage Quicktest Pro from our Maven/Jenkins builds. I know, I know QTP is not the best tool out there (I'm amused by the "bag of flaming dog poo" reference), but our QE team is using it and I want to run some of their tests in Jenkins.
1A. Has anyone used this specific combination? An example/maven plugin would be great.
Since I doubt that is likely, lets break it up into pieces.
2A. How do you simply launch a QTP test from the command line? I think I can figure the rest of the launching part of things out using antrun or something like that.
2B. The results format from QTP doesn't appear to be a standard like surefire reports (I don't know either well, so I might be wrong). Can you give me some guidance on getting report results back into maven/Jenkins? I'm thinking that may involve parsing the QTP results file.
An AOM ( Automation Object Model ) vbscript could be written to invoke QTP and run a specific test.
Such a vbscript could be run from command line in Windows.
If you can run/invoke vbscript files from Maven/Jenkins , it is definitely possible to run QTP scripts through command line.
A sample AOM vbscript function to trigger QTP run is below
Public Function RunQTP(byVal strQC_Or_Local, byVal strTestPath, byVal strTestName, byVal strResultsFolder, byVal strTraceFile)', byVal strStore)
' Create the Application object
Dim objQTPApp,objQTPLibraries,objTestResults 'QTP
Dim strTempResultsRootFolder
strTempResultsRootFolder = "C:\TempTest\"
On Error Resume Next
'Loop for a minute or until qtp is successfully opened
StartTime = Now
Do
'Create QTP object
Set objQTPApp = CreateObject("QuickTest.Application")
'Clear any existing error numbers
Err.Clear
'If QTP is already launched, do nothing, else launch it
If objQTPApp.Launched = False Then
objQTPApp.Launch
End If
'Set qtp to visible
objQTPApp.Visible = True
'See if launching QTP has caused an error
intErr = Err.Number
'If it QTP has opened fine, exit the loop
If intErr = 0 Then
objQTPTraceFile.Write Now & " QTP open with no errors" & vbCR
Exit Do
'If there's an error, Close and QTP processes running (if any) and try again
Else
msgbox "Error in opening QTP"
End If
Loop Until DateDiff("s", StartTime, Now) > 180
On Error GoTo 0
objQTPApp.Options.Run.RunMode = "Fast"
If strQC_Or_Local = "QC" Then
'Connect To QC
strQCUsername = "Quality center username"
strQCPassword = "Quality center password"
If objQTPApp.TDConnection.IsConnected Then
'If QTP is already connected, if login details are different, then log out and log in again with given details
If objQTPApp.TDConnection.User <> strQCUsername Or objQTPApp.TDConnection.Domain <> strQCDomain Or _
objQTPApp.TDConnection.Project <> strQCProject Or objQTPApp.TDConnection.Server <> strQCPath Then
msgbox "connected as someone else - disconnecting, and then will reconnect"
objQTPApp.TDConnection.Disconnect
On Error Resume Next
objQTPApp.TDConnection.Connect strQCPath, strQCDomain, strQCProject, strQCUsername, strQCPassword, False
On Error GoTo 0
End If
Else
'If it's not already connected, log in with given details
On Error Resume Next
objQTPApp.TDConnection.Connect strQCPath, strQCDomain, strQCProject, strQCUsername, strQCPassword, False
On Error GoTo 0
End If
'If connected, tests in QC have [QualityCenter] appended before their name
If objQTPApp.TDConnection.IsConnected Then ' If connection is successful
strTestPath = "[QualityCenter] " & strTestPath
Else
MsgBox "Cannot connect to Quality Center" ' If connection is not successful, display an error message.
Exit Function
End If
End If
'Open the test
On Error Resume Next
objQTPApp.Open strTestPath, False
intErr = err.number
strErrDesc = err.description
On Error Goto 0
'If no problems
If intErr = 0 Then
'Configure the QTP settings
'Stop the test when an error occours
objQTPApp.Test.Settings.Run.OnError = "NextIteration"
'Select the Range you wish to run
objQTPApp.Test.Settings.Run.IterationMode = "oneIteration"
'Set sync timeout to be 20 seconds and disable smart identification
'objQTPApp.Test.Settings.Run.ObjectSyncTimeOut = 20000
objQTPApp.Test.Settings.Run.DisableSmartIdentification = True
'Ensure that the recovery mechanism is set to be activated for every step
'qtTestRecovery.SetActivationMode "OnError"
Set objTestResults = CreateObject("QuickTest.RunResultsOptions")
'If results folder path is empty, just save tests results to usual temp place
Dim blnSaveSpecificLocation
If strResultsFolder = "" Then
blnSaveSpecificLocation = False
objTestResults.ResultsLocation = "<TempLocation>"
Else
'Otherwise, save results to a temporary location, and then move the tests results to desired location before closing the test/stopping QTP etc
'Need to save to a temp location and then move, as it looks like that when another test is run, QTP deletes the previous set of results.
blnSaveSpecificLocation = True
'Create the results object
strDate = CStr(Now)
strDate = Replace(strDate, "/", "")
strDate = Replace(strDate, ":", ".")
strTestNameAppendage = strTestName & " " & objQTPApp.Test.Environment.Value("LocalHostName") & " " & strDate
strResults = strResultsFolder & "\" '& strTestNameAppendage
strTempResultsLocation = strTempResultsRootFolder & strTestNameAppendage
objTestResults.ResultsLocation = strTempResultsLocation
End If
objQTPTraceFile.Write Now & " Start Test" & vbCrLf
'If QTP crashes, it will be forced shut by 'KillQTP' after an hour. If this happens, 'objQTPApp.Test.Run objTestResults' will return an error
'so need to turn off error reporting and capture the error given if this is the case
On Error Resume Next
Dim intQTPErr
Err.Clear
'Run the test *************************** This is the line which triggers the QTP run
objQTPApp.Test.Run objTestResults
intQTPErr = Err.Number
On Error GoTo 0
objQTPTraceFile.Write Now & " End Test" & vbCrLf
Else
objQTPTraceFile.Write Now & " " & strTestPath & " could not be opened. Error message = " & strErrDesc & vbCRLf
End if
'Close Qtp
objQTPTraceFile.Write Now & " Just before checking the error number. Error Number was: " & intQTPErr & vbCRLf
On Error Resume Next
'If QTP has crashed, the number captured in intQTPErr will be -2147023170
If intQTPErr = "-2147023170" Then 'if it's crashed (could put <> 0 instead)
objQTPTraceFile.Write Now & " QTP Run Crashed or didn't finish in the time limit. Error Number was: " & intQTPErr & vbCRLf
Else
objQTPTraceFile.Write Now & " QTP Thinks it finished - stopping test: " & Err.Number & vbCRLf
'Close the test
objQTPApp.Test.Stop
objQTPTraceFile.Write Now & " QTP Thinks it stopped fine - closing test: " & Err.Number & vbCRLf
'Move the test from temp location to desired location
If blnSaveSpecificLocation = True Then
Call MoveFolder(strTempResultsLocation, strResults)
'objQTPApp.Test.Close
objQTPTraceFile.Write Now & " QTP Thinks it closed fine - error number is: " & Err.Number & vbCRLf
End If
objQTPTraceFile.Write Now & " QTP Process should have been killed" & vbCRLf
End If
On Error GoTo 0
'Set objects used to nothing
Set objQTPTraceFile = Nothing
Set fso = Nothing
Set qtTestRecovery = Nothing ' Release the Recovery object
Set objTestResults = Nothing
Set objQTPLibraries = Nothing
Set objQTPApp = Nothing
End Function