Thunder
Thunder

Reputation: 39

How to run SoapUI teststeps in parrallel with Groovy

SoapUI has options to run your test-suites and test-cases in parallel but no such thing for doing it with test-steps.

How can I achieve such a thing with a Groovy teststep inside my testcase?

This is my current code:

    import com.eviware.soapui.impl.wsdl.testcase.WsdlTestCaseRunner

//Get all Soap type test steps within the testCases
for ( testStep in testRunner.testCase.getTestStepsOfType(com.eviware.soapui.impl.wsdl.teststeps.WsdlTestRequestStep.class)){
    //Print out the name for the testStep
    tsname = testStep.getName();
    log.info tsname;

    //thread = new Thread("$tsname")
    def th = new Thread("$tsname") {
                    @Override
            public void run(){
            //Set the TestRunner to the respective TestCase
            TestRunner = new com.eviware.soapui.impl.wsdl.testcase.WsdlTestCaseRunner(testRunner.testCase, null);
            //Run them all and then rejoin the threads
            log.info("thread: " + tsname)
            TestRunner.runTestStepByName(tsname);
            def soapResponse = TestRunner.getTestCase().getTestStepByName(tsname).getProperty("Response");
            log.info "soapResponse: " + soapResponse;
            th.join();
            }
    }
    th.start();
    th.join();
}

Upvotes: 0

Views: 1271

Answers (1)

Thunder
Thunder

Reputation: 39

Managed to fix it myself and posted the answer here for all who stumble into the same problem:

import com.eviware.soapui.impl.wsdl.teststeps.WsdlTestRequestStep

List<String> steps = testRunner.testCase.getTestStepsOfType(com.eviware.soapui.impl.wsdl.teststeps.WsdlTestRequestStep.class)
def map = [:]

//define the threads list, this will hold all threads
def threads = []

def kickEm = steps.each{ step ->

    def th = new Thread({

        stepName = step.getName();
        log.info "Thread in start: " + step.getName();
        //Set the TestRunner to the respective TestCase
        TestRunner = new com.eviware.soapui.impl.wsdl.testcase.WsdlTestCaseRunner(testRunner.testCase, null);
        //Run the corresponding teststep
        TestRunner.runTestStepByName(step.getName());
        //Get the response of the current step
        def soapResponse = context.expand(TestRunner.getTestCase().getTestStepByName(step.getName()).getPropertyValue('Response')) as String;
        log.info "In thread "+step.getName()+" soapResponse: " + soapResponse
        //Put this into a map, the key is the stepname and the value is its response, so we can retrieve it all outside the each loop
        map.put(step.getName(), soapResponse);
    })

   log.info "Putting new Thread({..}) th back into the threads list";
   threads << th;
}

threads.each { it.start(); }

threads.each { it.join(); }

log.info "Map: "

map.each { step, response ->
    log.info "Step: ${step} has the response ${response}"
    };

log.info "Done!"

Upvotes: 2

Related Questions