Reputation: 1022
I am using the open source version of SoapUI to do some SOAP Web service Load Testing.
I would like each request to differ from the previous requests as much as possible, I do not want a load test with the same properties.
I have a properties file which has several properties, each property value is to call a groovy script to read a random value from a file and assign it to the test case property i.e. in the value field:
${=(DynamicPropertyScript)}
Script:
// Load property from file
def file = new File('path')
// Create empty list for file contents
def list = [];
// Populate list with file contents
addURLstoList = {list.add(it)};
file.eachLine(addURLstoList);
// Pick a random item from list
def randomIndex = (int)Math.random()*list.size;
def randomValue = list.get(randomIndex);
// Assign random value to property
def tc = testRunner.testCase;
tc.setPropertyValue('property', randomValue);
log.info(randomValue)
This script works fine if I call it at the start of a test case, my area of concern is that the property that is generated on start-up will be the same for each subsequent request, this is what I want to avoid.
I have tried several things but ultimately failed (due to my lack of experience with Groovy and SoapUI).
Some things I have tried in the request
<inc:ID>${Properties#property}</inc:ID>
<inc:ID>${=(DynamicPropertyScript)}</inc:ID>
The error I was getting:
<inc:ID>No such property: DynamicPropertyScript for class: Script4</inc:>
Any help would be much appreciated, additionally if there is an alternative way that would also help (I understand sending lots of requests & reading from disk every time is not ideal).
Thanks :)
Upvotes: 0
Views: 3218
Reputation: 435
I'd look to load the data list into memory once to avoid repeated IO, and then pick the random item from the list within the test step that requires it using a Groovy expression. You can use a context variable to hold the data in memory.
The following Groovy script will read the contents of a data file named data1.txt
, located within the Project root directory, and load it into a context variable. The context.data variable holds the data items as a list, and the context.dataCount holds the number of items.
You probably want to add this as a Setup Script (either against the TestSuite or TestCase), rather than within a Groovy test step, so that it only runs the once. Context variables remain in scope of the corresponding Suite/Case runner, so can be referenced in any of the subsequent steps.
def projectDir = context.expand('${projectDir}') + File.separator
def dataFile = "data1.txt"
try
{
File file = new File(projectDir + dataFile)
context.data = file.readLines()
context.dataCount = context.data.size
}
catch (Exception e)
{
testRunner.fail("Failed to load " + dataFile + " from project directory.")
return
}
Then, to get a random data item from the context.data variable, enter the following expression as a parameter value or embedded within the body of a request, as required.
${=context.data.get((int)(Math.random()*context.dataCount))}
Upvotes: 2