I’m using soapUI 3.6.1 and I want to test a SOAP-interface with a test structure like this:
MyWorkspace
MyProject
TestSuite
TestCase Single
TestStep 1
TestCase Loop
Properties #1
Groovy #1
Run TestCase Single
Properties #2
Groovy #2
Run TestCase Single
TestCase Single contains a bunch of requests that should be performed with the same account-id. TestCase Loop is supposed to call TestCase Single using different account-ids. The Properties * are supposed to change the account-id.
MyProject has a property accountId set up with value 1234. This should work as the default value for single testing of the test cases, i.e. TestCase Single.
Properties #1 and Properties #2 have accountId specified with different values.
The intention is to allow TestStep 1 to be executed alone or as part of TestCase Loop.
TestStep 1 has a common SOAP-body where the following is a parameter sent to the web-service:
<accId>${='${#accountId}' != '' ? '${#accountId}' : ${#Project#accountId}}</accId>
Groovy #1 and Groovy #2 look like this:
log.info('Using account ' + (context.expand('${#accountId}') != '' ? context.expand('${#accountId}') : context.expand('${#Project#accountId}')));
My problem now is that the Groovy-script writes the correct value of accountId (i.e., the one inside the loop), but the TestStep 1 always uses the value from the project. I want TestStep 1 to use the value of the loop.
For debugging purposes I also put the following into TestStep 1:
<!--
{#Project#accountId}: ${#Project#accountId}
{#TestSuite#accountId}: ${#TestSuite#accountId}
{#TestRunContext#accountId}: ${#TestRunContext#accountId}
{#TestRun#accountId}: ${#TestRun#accountId}
{#TestCase#accountId}: ${#TestCase#accountId}
{#TestStep#accountId}: ${#TestStep#accountId}
{#MockService#accountId}: ${#MockService#accountId}
{#Global#accountId}: ${#Global#accountId}
{#System#accountId}: ${#System#accountId}
{#Env#accountId}: ${#Env#accountId}
{#accountId}: ${#accountId}
context.accountId: ${=context.accountId}
modelItem.accountId: ${=modelItem.accountId}
request.accountId: ${=request.accountId}
context.expand(): ${=context.expand('${#accountId}')}
-->
I traced the network traffic with Wireshark and noticed that only ${#Project#accountId} returned a value.
What am I doing wrong here? How do I need to code the <accId>-element to send the correct value to the remote host?
Now I revisited this issue and I think I found the best possible solution, even though I don’t understand why my initial attempt didn’t work.
I changed the structure to this:
In other words I got rid of the
Propertiesand moved the logic into theGroovies:and the appropriate line in
TestStep 1: