Attaching file in SoapUI with groovy

2019-03-20 18:33发布

I'm creating some tests in SoapUI. SOAP request, that i want to test has attachment. When I'm setting it manualy, everything is ok: Designer view part of raw request

But in my case, i need to set attachment dynamically. I'm trying to made it by properties to hold file path, and groovy script to set attachment. but it's not work at all:

// get request
def request = testRunner.testCase.getTestStepByName( "UploadRoutingCodes" ).testRequest

// clear existing attachments
for( a in request.attachments ) {
   request.removeAttachment( a )
}

// get file to attach
//def fileName = context.expand( '${Source of data#PathToXRC File data name }' )
def fileName = context.expand( '${#TestCase#XRC_file_name}' )
def filePath = context.expand( '${#Project#XRC_files_path}' )

log.info "file: " + filePath + fileName
def file = new File(filePath + fileName  )
if ( file == null) {
   log.error "bad filename"
}
else 
{
   // attach and set properties
   def attachment = request.attachFile( file, true )
   attachment.contentType = "application/octet-stream"
   def list = fileName.tokenize("\\");
   attachment.setPart(list.last())
}

After run this script, request look like this: Designer view part of raw request

Documentation to SoapUI is not helpful at all. So, my question is: what i'm doing wrong?

2条回答
放我归山
2楼-- · 2019-03-20 19:00

I found the answer:

def holder2 = groovyUtils.getXmlHolder( "UploadRoutingCodes#Request" ) // Get Request body
def startDate2 = holder2.setNodeValue( "//blac:FileByteStream","cid:"+list.last()); //Set "link" to attachment in request body
holder2.updateProperty() //and update

attachment.setPart(list.last()); //set attachment
查看更多
Luminary・发光体
3楼-- · 2019-03-20 19:09

Thaven, thank you for your answer. It helped. I will attach my full groovy script as I spent some time to fully assembled your parts, but anyhow all tributes goes to you.

Please note that:

    //FileNamePath
    def fileNamePath = testCase.getTestStepAt(testRunner.testCase.getTestStepIndexByName("FileNameProperties")).getProperty("FileNamePath")
    //FileName
    def fileName = testCase.getTestStepAt(testRunner.testCase.getTestStepIndexByName("FileNameProperties")).getProperty("FileName")

are the test step properties defined inside the test case. Filename: my_sample_filename.xml and FileNamePath: C:\samples\my_sample_filename.xml accordingly.

import groovy.xml.MarkupBuilder
import org.custommonkey.xmlunit.*
import java.util.Random  
import java.security.MessageDigest
import java.nio.file.*


    def groovyUtils = new com.eviware.soapui.support.GroovyUtils(context)
    def projectPath = groovyUtils.projectPath
    log.info projectPath

    def project = testRunner.testCase.testSuite.project
        log.info "Project: " + project.name
        def myTestSuite = testRunner.testCase.testSuite;
        log.info "TestSuite: " + myTestSuite.name

    def testCase = testRunner.testCase
    log.info "TestCase: " + testCase.name

    def testStepUploadDataAfterCheck = testCase.getTestStepByName("UploadDataAfterCheck")
    def request= testStepUploadDataAfterCheck.testRequest
    log.info "TestStep: " + testStepUploadDataAfterCheck.name


    // clear existing attachments
    for( a in request.attachments ) {
        request.removeAttachment( a )
    }

    //FileNamePath
    def fileNamePath = testCase.getTestStepAt(testRunner.testCase.getTestStepIndexByName("FileNameProperties")).getProperty("FileNamePath")
    //FileName
    def fileName = testCase.getTestStepAt(testRunner.testCase.getTestStepIndexByName("FileNameProperties")).getProperty("FileName")

    // get file to attach
    log.info "file to attach: " + fileNamePath.getValue()
    def file = new File(fileNamePath.getValue() )
    if ( file == null) {
        log.error "bad filename"
    }   
    else 
    {
        // attach and set properties
        def attachment = request.attachFile( file, true )
        attachment.contentType = "application/octet-stream"
        attachment.setPart(fileName.getValue())

        def holder2 = groovyUtils.getXmlHolder( "UploadDataAfterCheck#Request" ) // Get Request body
        holder2.setNodeValue( "//upl:UploadDataAfterCheckRequest/uploadedData","cid:"+fileName.getValue()); //Set "link" to attachment in request body
        holder2.updateProperty() //and update
        log.info "file attached succesfully"
    }

And here is my soap request:

<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:upl="http://www.acer.europa.eu/aris/upload">
   <soapenv:Header/>
   <soapenv:Body>
      <upl:UploadDataAfterCheckRequest>
         <uploadedData>cid:my_sample_filename.xml</uploadedData>
      </upl:UploadDataAfterCheckRequest>
   </soapenv:Body>
</soapenv:Envelope>
查看更多
登录 后发表回答