Maksym Zadirishhenko
Maksym Zadirishhenko

Reputation: 21

soapui shared datasource in groovy script

I have prepared a test case in SoapUI Open Source which loops over values in csv file and sends request for each set of values (taken care of by groovy script). I want to modify it so each thread for each new iteration uses value from next row of csv file.

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

 def testDataSet = []
 def fileName = "C:\\sSHhrTqA5OH55qy.csv"

 new File(fileName).eachLine { line -> testDataSet.add( line.split(",") ) }

 def myProps = new java.util.Properties();
 myProps = testRunner.testCase.getTestStepByName("Properties");

 def groovyUtils = new com.eviware.soapui.support.GroovyUtils( context );
 def testCase = testRunner.testCase;

 def testStep = testCase.getTestStepByName("TestRequest");

 testRunner = new com.eviware.soapui.impl.wsdl.testcase.WsdlTestCaseRunner(testCase, null);
 testStepContext = new com.eviware.soapui.impl.wsdl.testcase.WsdlTestRunContext(testStep);

 while (true) {
   for ( i in testDataSet ) {

     myProps.setPropertyValue("parameter0",i[0]);
     myProps.setPropertyValue("username",i[1]);
     myProps.setPropertyValue("parameter1",i[2]);
     myProps.setPropertyValue("password",i[3]);

     testStep.getTestRequest().setUsername(myProps.getPropertyValue("username"))
     testStep.getTestRequest().setPassword(myProps.getPropertyValue("password"))

     testStep.run(testRunner, testStepContext);     
   }
 }

I want to modify this script so each thread from the pool gets unique (next) unused value from data source

I tried to use newFixedThreadPool from java.util.concurrent as suggested here (Concurrency with Groovy), however I can't get it to work - either requests are duplicated or SoapUI crashes (I am new to concurrency).

Can you please help me to get it right?

Upvotes: 2

Views: 3255

Answers (2)

jezuito
jezuito

Reputation: 251

I don't see your point. SoapUi already gives you a datasource test step that accepts a csv file as input.

So once you have all these values you can transfer the properties and run the test.

Upvotes: 0

nwill001
nwill001

Reputation: 745

I think this would work for you:

 while (true) {
 for ( i in testDataSet ) {

 def th = Thread.start(){
 myProps.setPropertyValue("parameter0",i[0]);
 myProps.setPropertyValue("username",i[1]);
 myProps.setPropertyValue("parameter1",i[2]);
 myProps.setPropertyValue("password",i[3]);

 testStep.getTestRequest().setUsername(myProps.getPropertyValue("username"))
 testStep.getTestRequest().setPassword(myProps.getPropertyValue("password"))

 testStep.run(testRunner, testStepContext);
 }

th.join()     
}

So, new threads would be created on each loop.

If you wanted to test out if its working you could place loginfo(s) in the code...

 log.info("Thread Id: " + Thread.currentThread().getId() as String)

Upvotes: 1

Related Questions