【问题标题】:How to use SoapUI/Groovy to add Test Results to Quality Center Test Run如何使用 SoapUI/Groovy 将测试结果添加到 Quality Center 测试运行
【发布时间】:2013-08-29 03:42:43
【问题描述】:

我有一个场景,我需要将 SoapUI 测试用例中的测试结果添加到 HP 质量中心的相关测试用例中。我怎么能用 Groovy 来做这件事。

【问题讨论】:

  • 那么你的问题是什么?如果您设法解决了其他人可能感兴趣的特定问题,您可以发布问题并自己回答。

标签: groovy soapui hp-quality-center


【解决方案1】:

Quality Center 提供了一个 OTA API 来与之交互;但是,它被编写为使用 Java/Groovy 无法使用的 Microsoft COM 结构。幸运的是,有一个 Groovy 库 Scriptom,它允许 Groovy 使用 COM 接口。

完成所有设置后,这是我想出的示例代码:

import org.codehaus.groovy.scriptom.*

def tstCaseName = "NAME_OF_TESTCASE"
tstCaseName = tstCaseName.replaceAll(/[ ]/) {  match ->
    "*"
}

Scriptom.inApartment
{
    //  Create an entry point for QC
    def tdc = new ActiveXObject ('TDApiOle80.TDConnection')

    //  Connect to QC, Login with Credentials, connect to Project
    tdc.InitConnectionEx('http://qc.example.com/qcbin')
    tdc.Login('USER_NAME', 'PASSWORD')
    tdc.Connect('DOMAIN_NAME','PROJECT_NAME')

    //  Find the set of tests in the Test Plan
    tsFolder = tdc.TestSetTreeManager.NodeByPath('Root\\PATH\\TO\\TEST\\CALENDAR\\Spaces are allowed')
    tsList = tsFolder.FindTestSets('NAME_OF_TEST_CALENDAR')
    tsObject = tsList.Item(1)

    //  Get the list of TestCases in the Test Plan and filter it down to the one Test Case we are interested in
    TSTestFact = tsObject.TSTestFactory 
    tstSetFilter = TSTestFact.Filter
    tstSetFilter.Filter["TS_NAME"] = '*' + tstCaseName
    TestSetTestsList = TSTestFact.NewList(tstSetFilter.Text)
    tsInstance = TestSetTestsList.Item(1) 

    //  Create a new Test Run
    newRun= tsInstance.RunFactory.AddItem('Run_Auto')
    newRun.Status = 'Not Completed' 
    newRun.Post() 
    newRun.CopyDesignSteps()
    newRun.Post() 

    //  Populate Auto Run Test step Data
    def tsStepData = new Object[3]
    tsStepData[0]='Auto Data'
    tsStepData[1]='Not Completed'
    tsStepData[2]='Results from Automated Test'
    //  Create new Test Step in the run with our Auto Run Data
    tsSteps = newRun.StepFactory.AddItem(tsStepData)
    tsSteps.Field['ST_ACTUAL'] = 'These are the actual results from my test!!'
    tsSteps.post()
} 

【讨论】:

    【解决方案2】:

    我在使用 scriptom 时遇到了问题,并且是 Groovy 的新手,但在使用 Quality Center 时,我为我的 SoapUI 测试编写了一个拆解脚本,该脚本将我的结果写入一个平面文件,然后我使用 VBScript 将数据拉入。

    这些脚本使用硬编码值,但希望能帮助您入门:

    VAPI-XP 脚本 - http://ryanoglesby.net/2013/08/23/executing-soapui-from-quality-center-part-1/

    '*******************************************************************
    'Debug, CurrentTestSet, CurrentTest, CurrentRun
    'Debug, CurrentTestSet, CurrentTSTest, CurrentRun
    '**************************************************************************
    Sub Test_Main(Debug, CurrentTestSet, CurrentTest, CurrentRun )
    ' *** VBScript Limitation ! ***
    ' "On Error Resume Next" statement suppresses run-time script errors.
    ' To handle run-time error in a right way, you need to put "If Err.Number <> 0 Then"
    ' after each line of code that can cause such a run-time error.
    
    On Error Resume Next
    'Clear output window
    TDOutput.Clear
    
    '**************************************************************************
    ' Define the path for SOAPUI executable bat file and Project xml
    ' Project xml contains the test case(s) that need to be executed
    '**************************************************************************
    Dim trPath 'Path to test runner bat file
    Dim soapResults 'Result file generated by SoapUI Groovy Script
    Dim projFP 'SoapUI Project File Path
    Dim spath 'Result File - Currently not using
    Dim tf 'Test Factory Object
    Dim ts 'Test ID
    Dim TSuite 'SoapUI Test Suite Name
    Dim Tcase 'SoapUI Test Case Name
    Dim resultsP 'SoapUI output Report Location - Currently Not using
    
    projFP = "C:\SOME\FILE\PATH\soapui-project.xml"
    spath = "C:\File.txt"
    trPath = "C:\program files\SmartBear\SoapUI-Pro-4.5.2\bin\testrunner.bat"
    soapResults = "C:\Groovy_Report\test1.txt"
    
    'Strings for SoapUI Execution
    TSuite="SOAPUI_TESTSUITE_NAME"
    Tcase="SOAPUI_TESTCASE_NAME"
    resultsP="C:\SoapResults\" & Tcase
    
    Set tf = TDConnection.TestFactory
    
    Set ts = tf.Item(Field("TS_TEST_ID"))
    
    '**************************************************************************
    ' Invoke SOAPUI and execute the selected project
    '**************************************************************************
    
    invokeSOAPUIClient trPath, projFP, TSuite, Tcase, resultsP, CurrentTest, CurrentRun
    
    '**************************************************************************
    ' Get the Results from the text file in to Run Steps of the test case
    '**************************************************************************
    
    'wait 1 second to allow for larger files to complete writing
    TDOutput.Print "Start Wait 10"
    XTools.Sleep 1000
    TDOutput.Print "END Wait 10"
    
    'Get Result file and write to run steps
    getResultsToQC CurrentRun, soapResults
    
    '**************************************************************************
    ' handle run-time errors
    '**************************************************************************
    If Not Debug Then
    If Err.Number <> 0 Then
    TDOutput.Print "Run-time error - Execute SOAPUI:Enter SuB - [" & Err.Number & "] : " & Err.Description
    CurrentRun.Status = "Failed"
    CurrentTest.Status = "Failed"
    Else
    CurrentRun.Status = "Passed" 'Need Function here to determine if all steps passed
    CurrentTest.Status = "Passed" 'Need Function here to determine if all steps passed
    End If
    End If
    End Sub
    
    '**************************************************************************
    ' Sub for executing SOAPUI with the selected project
    '**************************************************************************
    ' soapuiTestrunnerPath: TestRunner .bat file
    ' projectLocation: Project file location
    '**************************************************************************
    
    Sub invokeSOAPUIClient(soapuiTestrunnerPath, projectLocation, TSuite, Tcase, resultsP, CurrentTest, CurrentRun)
    '**************************************************************************
    ' Execute SOAPUI from the command line
    ' Output Test Values for reference - Not Required
    '**************************************************************************
    TDOutput.Print "TSuite: " & TSuite
    TDOutput.Print "Tcase: " & Tcase
    TDOutput.Print "resultsP: " & resultsP
    
    set fileSystem = CreateObject("Scripting.FileSystemObject")
    
    '**************************************************************************
    ' Raise error if SOAPUI is not installed in the host where program is
    ' runned or if the path of executable bat file provided is not correct
    '**************************************************************************
    
    If ( not fileSystem.FileExists(soapuiTestrunnerPath)) then
    Err.Raise 8
    Err.Description = "soapUI testrunner not found: " + soapuiTestrunnerPath
    End if
    
    '**************************************************************************
    'args will be the options that you wish to pass to the TestRunner
    'for a full list of options call the test runner from the command prompt with
    'no options
    '**************************************************************************
    Dim args
    'args = "-s" & chr(34) & TSuite & chr(34) & " -c" & chr(34) & TCase & chr(34) & " -Drpath=" & resultsP & " -r -a -I "& chr(34) & projectLocation & chr(34) &""
    args = "-s" & TSuite & " -c" & TCase & " -M -j -F XML -R test.xml -f " & resultsP & " -r -g -A -I "& chr(34) & projectLocation & chr(34) &""
    XTools.run soapuiTestrunnerPath, args, -1, true
    End Sub
    
    '**************************************************************************
    ' Sub for Adding Results to QC - Parent to addRunData() function
    ' function will parse the result file generated by SoapUI Groovy Script &
    ' add the run details for the Soap UI test to the QC run
    '**************************************************************************
    ' sFile: File path to Groovy Script Results "C:\Groovy_Report\test1.txt"
    ' Currently this value is HARD CODED
    '**************************************************************************
    sub getResultsToQC(CurrentRun, sFile)
    Set objFS = CreateObject("Scripting.FileSystemObject")
    'Create object for result file
    Set objFile = objFS.GetFile(sFile)
    'OPen Stream to read in file
    Set ts = objFile.OpenAsTextStream(1,-2)
    'Loop through file line by line
    Do Until ts.AtEndOfStream
    'Create string value for current line
    strLine = ts.ReadLine
    'TDOutput.Print strLine
    
    'Split values based on delimiter (Set in groovy Script)
    ArrSplit=Split(strLine, "|")
    size = Ubound(ArrSplit)
    
    'Determine action for array values
    'Size = 6 is a report value that will have pass/fail
    'Size <> 6 is a info value and will have status = N/A
    if(size=6) Then
    'StepName
    sStepName = ArrSplit(1) & "-" & ArrSplit(2)
    
    'Clean Step Status and determine pass/fail
    sSplit = Split(ArrSplit(4),":")
    sValue = Trim(sSplit(1))
    if(sValue="VALID")Then
    sStatus = "Passed"
    Elseif (sValue="FAILED") then
    sStatus = "Failed"
    Else
    sStatus = "N\A"
    End If
    
    'Step Description
    sDescription = ArrSplit(5)
    
    'Step Expected
    sExpected = ArrSplit(3)
    
    'Step Actual
    sActual = Trim(ArrSplit(6))
    
    'Add run result to current execution run
    addRunData CurrentRun, sStepName, sStatus, sDescription, sExpected, sActual
    else
    'Added in case other options arise in the future
    if(Trim(ArrSplit(0)) = "INFO") Then
    sStepName = "INFO - " & ArrSplit(1)
    sStatus = "N/A"
    sDescription = ArrSplit(1)
    sExpected = "N/A"
    sActual = ArrSplit(2)
    addRunData CurrentRun, sStepName, sStatus, sDescription, sExpected, sActual
    End If
    End if
    
    Loop
    ts.Close
    end sub
    
    '**************************************************************************
    ' Sub for adding Test Steps to the current run
    ' function will add the run details for the Soap UI test to the QC run
    '**************************************************************************
    ' sStepName: Passed from getResultsToQC - String to display the step name
    ' sStatus: Passed from getResultsToQC - String to determine step status
    ' sDescription: Passed from getResultsToQC - String to describe step
    ' sExpected: Passed from getResultsToQC - String to show expected value
    ' sActual: Passed from getResultsToQC - String to show actual value
    '**************************************************************************
    
    Sub addRunData(CurrentRun, sStepName, sStatus, sDescription, sExpected, sActual )
    
    Dim objRun
    Set objRun = CurrentRun
    'Create Step object and add values to Object array
    Set objStep = objRun.StepFactory.AddItem(null)
    objStep.Field("ST_STEP_NAME")= sStepName
    objStep.Field("ST_STATUS") = sStatus
    objStep.Field("ST_DESCRIPTION") = sDescription
    objStep.Field("ST_EXPECTED") = sExpected
    objStep.Field("ST_ACTUAL") = sActual
    objStep.Post
    Set objStep = Nothing
    
    end sub
    

    Groovy SoapUI 拆解脚本 - http://ryanoglesby.net/2013/08/28/executing-soapui-from-quality-center-part-2-groovy-teardown-script/

    import jxl.*
    import jxl.write.*
    import java.lang.*
    import com.eviware.soapui.support.XmlHolder
    //*********************************************************************
    //Define Array to hold reporting data
    //*********************************************************************
    def reportInfo = []
    //*********************************************************************
    //Define test name
    //*********************************************************************
    def testName= testRunner.testCase.name.toString()
    def fpath = context.expand( '${projectDir}' )
    def tcase = testRunner.testCase
    //*********************************************************************
    //Get number of Test steps
    //*********************************************************************
    def size = testRunner.testCase.getTestStepCount();
    //*********************************************************************
    //loop through test steps
    //*********************************************************************
    for(int i = 0; i<size; i++){
    //*********************************************************************
    //get Step Name
    //*********************************************************************
    name = tcase.getTestStepAt(i).getName()
    
    //*********************************************************************
    //create test step object
    //*********************************************************************
    testStep = testRunner.getTestCase().getTestStepByName(“$name”)
    //*********************************************************************
    //Get test step type
    //*********************************************************************
    def stepType = testStep.config.type
    //*********************************************************************
    //Determine course of action for each step type
    //*********************************************************************
    if(stepType==”datasink”){
    //*********************************************************************
    //Info Step as we won’t be running assertions on this step type
    //Data will be added to reportInfo Array
    //*********************************************************************
    def info = “INFO | Data Sink Step | “+name
    reportInfo << info
    }else if(stepType==”groovy”){
    //*********************************************************************
    //Info Step as we won’t be running assertions on this step type
    //Data will be added to reportInfo Array
    //*********************************************************************
    def info = “INFO | Groovy Script Step | “+name
    reportInfo << info
    }else if(stepType==”request”){
    //*********************************************************************
    //Report Step as we WILL be running assertions on this step type
    //Data will be added to reportInfo Array
    //*********************************************************************
    //Create List of Assertion names, Counter == alist Size, and
    //Assertion status
    //*********************************************************************
    def assertionNameList = testStep.getAssertionList().name
    def counter = assertionNameList.size()
    def assertionStatus = testStep.getAssertionList()
    //*********************************************************************
    //Loop through assertionList
    //*********************************************************************
    for(j=0;j<counter;j++)
    {
    def iAssertionName = assertionNameList[j]
    def iAssertionStatus = testStep.getAssertionAt(j).getStatus().toString()
    def tstep = testStep.getName()
    if(iAssertionName==”SOAP Response”){
    //*********************************************************************
    //If Assertion type is SOAP Response Capture Step Status and XML
    //*********************************************************************
    def response = context.expand( ‘${‘+tstep+’#Response}’ )
    response = response.replace(“\n”, “”)
    response = response.replace(“\r”, “”)
    def type = testStep.getAssertionAt(j).config.type
    def reportString = “Report | ” + tstep + ” | ” + iAssertionName + ” | Expected Success Response |” + “Status: ” + iAssertionStatus + ” | ” + type + ” | ” + response
    log.info reportString
    reportInfo << reportString
    }else{
    //*********************************************************************
    //If Assertion type is NOT SOAP Response Capture:
    // Step Status
    // Expected Value
    // Assertion Type
    // Actual (If Error=Error Message Else = Expected)
    //*********************************************************************
    def expect = testStep.getAssertionAt(j).expectedContent
    def expectedValue = context.expand(expect)
    def gStatus = testStep.getAssertionAt(j).status
    gStatus = gStatus.toString()
    def gAssert = testStep.getAssertionAt(j)
    def gType = testStep.getAssertionAt(j).config.type
    if(gStatus!=’FAILED’){
    def reportString = “Report | ” + tstep + ” | ” + iAssertionName + ” | Expected: ” + expectedValue + “|” + ” Status: ” + gStatus + “|” + ” Type: ” + gType + “|” + expectedValue
    log.info reportString
    reportInfo << reportString
    }else{
    for( e in testStep.getAssertionAt(j).errors ){
    def reportString = “Report | ” + tstep + ” | ” + iAssertionName + ” | Expected: ” + expectedValue + “|” + ” Status: ” + gStatus + “|” + ” Type: ” + gType + “|” + ” Error [" + e.message + "]”
    log.info reportString
    reportInfo << reportString
    }
    }
    
    }
    }
    }else{
    //*********************************************************************
    //We will want to log a message for this step
    //for currently unhandled step types
    //*********************************************************************
    }
    }
    //*********************************************************************
    //capture execution time
    //*********************************************************************
    def gTimeInfo = “INFO | TIME | “+testRunner.getTimeTaken()
    reportInfo << gTimeInfo
    log.info gTimeInfo
    //*********************************************************************
    //create report for test
    //*********************************************************************
    //Folder within directory to save results to. If folder does not exist
    //we will create it
    //*********************************************************************
    def folder = “Groovy_Report”
    //*********************************************************************
    //Directory to place create folder in or location of Folder
    //*********************************************************************
    def dir = “c:/”
    //*********************************************************************
    //Define and execute folder creation method
    //*********************************************************************
    def c
    c = createFolder(dir,folder)
    //*********************************************************************
    //Define test file name and create report file
    //*********************************************************************
    def fName = “test1″
    createfile(c,”fName”,”.txt”,reportInfo)
    //*********************************************************************
    //Create File Method
    //*********************************************************************
    //Input:
    // dir: root folder directory
    // filenm: name of file to be created minus the extension
    // ext: file extension to be used
    // info: array of strings containing your file data
    //*********************************************************************
    public void createfile(def dir, def filenm, def ext, def info){
    new File(“$dir/$filenm$ext”).withWriter { out ->
    info.each {
    out.println it
    }
    }
    }
    //*********************************************************************
    //Create File Method
    //*********************************************************************
    //Input:
    // dir: root folder directory
    // folder: folder to add to directory
    //Output:
    // String: directory root for file creation
    //*********************************************************************
    public String createFolder(def dir,def folder){
    File f = new File(“$dir/$folder”);
    f.mkdirs();
    return “$dir/$folder”
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-12-30
      • 1970-01-01
      • 1970-01-01
      • 2016-10-16
      • 1970-01-01
      相关资源
      最近更新 更多