true
true
false
true
true
Multiple Pages
C:\dev\htmlreports
soapUI Report
http://www.soapui.org/samplehttp://127.0.0.1:8088/mockSampleServiceSoapBinding UTF-8 http://Ole-PC:8088/mockSampleServiceSoapBinding<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:sam="http://www.example.org/sample/"> <soapenv:Header/> <soapenv:Body> <sam:login> <username>Login</username> <password>Login123</password> </sam:login> </soapenv:Body> </soapenv:Envelope>UTF-8 http://127.0.0.1:8088/mockSampleServiceSoapBinding<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:sam="http://www.example.org/sample/"> <soapenv:Header/> <soapenv:Body> <sam:logout> <sessionid>21974891784000294</sessionid> </sam:logout> </soapenv:Body> </soapenv:Envelope><xml-fragment/>UTF-8 http://Ole-PC:8088/mockSampleServiceSoapBinding<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:sam="http://www.example.org/sample/"> <soapenv:Header/> <soapenv:Body> <sam:search> <sessionid>15350144624459006</sessionid> <searchstring>?</searchstring> </sam:search> </soapenv:Body> </soapenv:Envelope>UTF-8 http://www.soapui.org/sample<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:sam="http://www.example.org/sample/"> <soapenv:Header/> <soapenv:Body> <sam:buy> <sessionid>?</sessionid> <buystring>?</buystring> </sam:buy> </soapenv:Body> </soapenv:Envelope>
file:C:\eviware\Projects\WSDL\sample.wsdl

http://schemas.xmlsoap.org/wsdl/
This is a sample TestSuite.

It contains a number of TestCases Illustrating a number of principles with soapUI.

Try each test and read the descriptions.
C:\dev\testreport
true
Frames
C:\dev\testreport
Multiple Pages
true
true
false
true
true
Default Title
SEQUENTIAL
TestCase: Simple Login and Logout

This one is easy...

The test will first login and then it will logout. :-)

We are using a Property Transfer Step to move password and user name from a Properties Step to the Request and a second Property Transfer Step to move the sessionID we got in the login response to the logout request..
Default Titlkjle
Username Loginn${=String.valueOf(Math.random()).substring( 0, 5 )} Password Loginn123
TransferUser
Username
Properties: Username and Password
Request
Test Request: login
declare namespace sam='http://www.example.org/sample/'; //sam:login/username
TransferPass
Password
Properties: Username and Password
Request
Test Request: login
declare namespace sam='http://www.example.org/sample/'; //sam:login/password
SampleServiceSoapBinding login <xml-fragment/>UTF-8 http://127.0.0.1:8088/mockSampleServiceSoapBinding<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:sam="http://www.example.org/sample/"> <soapenv:Header/> <soapenv:Body> <sam:login> <username>Loginn${=String.valueOf(Math.random()).substring( 0, 5 )}</username> <password>Loginn123</password> </sam:login> </soapenv:Body> </soapenv:Envelope>
MoveSessionId
Response
Test Request: login
declare namespace sam='http://www.example.org/sample/'; //sam:loginResponse/sessionid
Request
Test Request: logout
declare namespace sam='http://www.example.org/sample/'; //sam:logout/sessionid
SampleServiceSoapBinding logout UTF-8 http://127.0.0.1:8088/mockSampleServiceSoapBinding<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:sam="http://www.example.org/sample/"> <soapenv:Header/> <soapenv:Body> <sam:logout> <sessionid>6653469643556499</sessionid> </sam:logout> </soapenv:Body> </soapenv:Envelope>
Default Title
5
0
250
false
true
-1
60
TIME
Simple
100
0
false
false
true
500
false
ReportTitle${=testCase.name}
TestCase: Simple Login and Logout

This one is easy and a little tighter than "Simple Login and Logout w. Properties Steps"

The test will first login and then it will logout. :-)

We are using a Property Transfer Step to move password and user name from a Properties Step to the Request and a second Property Transfer Step to move the sessionID we got in the login response to the logout request..
Username Loginn${=String.valueOf(Math.random()).substring( 0, 5 )} Password Loginu123
SampleServiceSoapBinding login UTF-8 http://127.0.0.1:8088/mockSampleServiceSoapBinding<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:sam="http://www.example.org/sample/"> <soapenv:Header/> <soapenv:Body> <sam:login> <username>${Properties: Username and Password#Username}</username> <password>${Properties: Username and Password#Password}</password> </sam:login> </soapenv:Body> </soapenv:Envelope>
SampleServiceSoapBinding logout UTF-8 http://127.0.0.1:8088/mockSampleServiceSoapBinding<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:sam="http://www.example.org/sample/"> <soapenv:Header/> <soapenv:Body> <sam:logout> <sessionid>${Test Request: login#Response#//sam:loginResponse/sessionid}</sessionid> </sam:logout> </soapenv:Body> </soapenv:Envelope>
TestCase: Simple Login and Logout

This one is a bit wonky, but has its reasons. What we are testing is that we are able to login again after a logout.

The test will: 1) login 2) logout 3) login again 4) logout again

The last step is there in order for us to be able to run the test continuously.
Username Loginn${=String.valueOf(Math.random()).substring( 0, 5 )} Password Loginu123
SampleServiceSoapBinding login UTF-8 http://127.0.0.1:8088/mockSampleServiceSoapBinding<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:sam="http://www.example.org/sample/"> <soapenv:Header/> <soapenv:Body> <sam:login> <username>${Properties: Username and Password#Username}</username> <password>${Properties: Username and Password#Password}</password> </sam:login> </soapenv:Body> </soapenv:Envelope>
SampleServiceSoapBinding logout UTF-8 http://127.0.0.1:8088/mockSampleServiceSoapBinding<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:sam="http://www.example.org/sample/"> <soapenv:Header/> <soapenv:Body> <sam:logout> <sessionid>${Test Request: login#Response#//sam:loginResponse/sessionid}</sessionid> </sam:logout> </soapenv:Body> </soapenv:Envelope>
SampleServiceSoapBinding login UTF-8 http://127.0.0.1:8088/mockSampleServiceSoapBinding<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:sam="http://www.example.org/sample/"> <soapenv:Header/> <soapenv:Body> <sam:login> <username>${Properties: Username and Password#Username}</username> <password>${Properties: Username and Password#Password}</password> </sam:login> </soapenv:Body> </soapenv:Envelope>
SampleServiceSoapBinding logout UTF-8 http://127.0.0.1:8088/mockSampleServiceSoapBinding<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:sam="http://www.example.org/sample/"> <soapenv:Header/> <soapenv:Body> <sam:logout> <sessionid>${Test Request: login again#Response#//sam:loginResponse/sessionid}</sessionid> </sam:logout> </soapenv:Body> </soapenv:Envelope>
TestCase: Simple Search TestCase

The test extends the previous TastCases by doing a simple search between login and logout.

We are using a Property Transfer Step to move password and user name from a Properties Step to the Request and a second Property Transfer Step to move the sessionID we got in the login response to the logout request..
Username Logini${=String.valueOf(Math.random()).substring( 0, 5 )} Password Logini123 SearchPhrase Item 1
TransferUser
Username
Properties: Username and Password
Request
Test Request: login
declare namespace sam='http://www.example.org/sample/'; //sam:login/username
TransferPass
Password
Properties: Username and Password
Request
Test Request: login
declare namespace sam='http://www.example.org/sample/'; //sam:login/password
SampleServiceSoapBinding login <xml-fragment/>UTF-8 http://127.0.0.1:8088/mockSampleServiceSoapBinding<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:sam="http://www.example.org/sample/"> <soapenv:Header/> <soapenv:Body> <sam:login> <username>Logini${=String.valueOf(Math.random()).substring( 0, 5 )}</username> <password>Logini123</password> </sam:login> </soapenv:Body> </soapenv:Envelope>
MoveSessionId
Response
Test Request: login
declare namespace sam='http://www.example.org/sample/'; //sam:loginResponse/sessionid
Request
Test Request: logout
declare namespace sam='http://www.example.org/sample/'; //sam:logout/sessionid
moveSessionID Search
Response
Test Request: login
declare namespace sam='http://www.example.org/sample/'; //sam:loginResponse/sessionid
Request
Test Request: search
declare namespace sam='http://www.example.org/sample/'; //sam:search/sessionid
MoveSearchstring
SearchPhrase
Properties: Username and Password
Request
Test Request: search
declare namespace sam='http://www.example.org/sample/'; //sam:search/searchstring
SampleServiceSoapBinding search <xml-fragment/>UTF-8 http://127.0.0.1:8088/mockSampleServiceSoapBinding<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:sam="http://www.example.org/sample/"> <soapenv:Header/> <soapenv:Body> <sam:search> <sessionid>3893759046191424</sessionid> <searchstring>Item 1</searchstring> </sam:search> </soapenv:Body> </soapenv:Envelope>
SampleServiceSoapBinding logout UTF-8 http://127.0.0.1:8088/mockSampleServiceSoapBinding<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:sam="http://www.example.org/sample/"> <soapenv:Header/> <soapenv:Body> <sam:logout> <sessionid>3893759046191424</sessionid> </sam:logout> </soapenv:Body> </soapenv:Envelope>
import soapui.demo.subreport.SystemPropertiesSubReport

if( !report.hasSubReport( "SystemProperties" )) { report.addSubReport( new SystemPropertiesSubReport( testSuite )) }
This is a complementary TestSuite that illustrates something important.

Do not only test that your Web Service works under the right conditions, also test that it work under the wrong ones.

One of the strengths of soapUI is the ability do quickly create a number of destructive tests, that confirms that the your Web Service handles input errors, abuse, input faults etc. correctly.
SEQUENTIAL
Now, what's this? TestCases that we want to fail?

Yes, sometimes it's a great idea to test that the Web Service fail when it should and fail correctly. Therefore the TestCase will pass if we get fails for every test in the Case.

These tests are for login alone.
SampleServiceSoapBinding login UTF-8 http://127.0.0.1:8088/mockSampleServiceSoapBinding<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:sam="http://www.example.org/sample/"> <soapenv:Header/> <soapenv:Body> <sam:login> <username>Logi</username> <password>Loginn123</password> </sam:login> </soapenv:Body> </soapenv:Envelope>declare namespace sam='http://www.example.org/sample/'; //detail/sam:loginFault The login credentials are invalid false
SampleServiceSoapBinding login UTF-8 http://127.0.0.1:8088/mockSampleServiceSoapBinding<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:sam="http://www.example.org/sample/"> <soapenv:Header/> <soapenv:Body> <sam:login> <username>Loginn</username> <password>Loginn</password> </sam:login> </soapenv:Body> </soapenv:Envelope>declare namespace sam='http://www.example.org/sample/'; //detail/sam:loginFault The login credentials are invalid false
SampleServiceSoapBinding login UTF-8 http://127.0.0.1:8088/mockSampleServiceSoapBinding<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:sam="http://www.example.org/sample/"> <soapenv:Header/> <soapenv:Body> <sam:login> <username>Loginnnnnnsdfgdfgf</username> <password>Loginnnnnn123</password> </sam:login> </soapenv:Body> </soapenv:Envelope>declare namespace sam='http://www.example.org/sample/'; //detail/sam:loginFault The login credentials are invalid false
SampleServiceSoapBinding login UTF-8 http://127.0.0.1:8088/mockSampleServiceSoapBinding<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:sam="http://www.example.org/sample/"> <soapenv:Header/> <soapenv:Body> <sam:login> <username>Log</username> <password>Log123</password> </sam:login> </soapenv:Body> </soapenv:Envelope>declare namespace sam='http://www.example.org/sample/'; //detail/sam:loginFault The login credentials are invalid false
SampleServiceSoapBinding login UTF-8 http://127.0.0.1:8088/mockSampleServiceSoapBinding<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:sam="http://www.example.org/sample/"> <soapenv:Header/> <soapenv:Body> <sam:login> <username>Login</username> <password>Login123</password> </sam:login> </soapenv:Body> </soapenv:Envelope>
SampleServiceSoapBinding login UTF-8 http://127.0.0.1:8088/mockSampleServiceSoapBinding<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:sam="http://www.example.org/sample/"> <soapenv:Header/> <soapenv:Body> <sam:login> <username>Login</username> <password>Login123</password> </sam:login> </soapenv:Body> </soapenv:Envelope>//faultstring Already Login false
SampleServiceSoapBinding logout UTF-8 http://127.0.0.1:8088/mockSampleServiceSoapBinding<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:sam="http://www.example.org/sample/"> <soapenv:Header/> <soapenv:Body> <sam:logout> <sessionid>${Test Request: Double Login step 1 (SUCCESS)#Response#//sam:loginResponse/sessionid}</sessionid> </sam:logout> </soapenv:Body> </soapenv:Envelope>declare namespace sam='http://www.example.org/sample/'; //sam:logoutResponse/sessioninfo OK false
Another batch of TestCases that we want to fail?

These tests expands on what we did with "TestCase: Invalid Login" and shows some important test that you always should have.

1) If you have a Web Service that depends on logging in, always make sure that nothing can be done wothout logging in. Don't make one test, make several. 2) If you have a Web Service that depends on logging in, create a number of test with the user logged in. 3) Create SQL injections test. Sure this should not never ever happend, but it does... And when it does it is bad. It is easy to create with soapUI and will make you sleep easier at night. 4) Always test what happends when you try to make a call quickly after logging out.
Session 29711622719335506
SampleServiceSoapBinding search <xml-fragment/>UTF-8 http://127.0.0.1:8088/mockSampleServiceSoapBinding<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:sam="http://www.example.org/sample/"> <soapenv:Header/> <soapenv:Body> <sam:search> <sessionid>${Correct Session Property#Session}</sessionid> <searchstring>Item 4</searchstring> </sam:search> </soapenv:Body> </soapenv:Envelope>//faultstring Invalid Session Id false
SampleServiceSoapBinding search <xml-fragment/>UTF-8 http://127.0.0.1:8088/mockSampleServiceSoapBinding<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:sam="http://www.example.org/sample/"> <soapenv:Header/> <soapenv:Body> <sam:search> <sessionid>${Correct Session Property#Session}</sessionid> <searchstring>Item 7</searchstring> </sam:search> </soapenv:Body> </soapenv:Envelope>//faultstring Invalid Session Id false
SampleServiceSoapBinding search <xml-fragment/>UTF-8 http://127.0.0.1:8088/mockSampleServiceSoapBinding<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:sam="http://www.example.org/sample/"> <soapenv:Header/> <soapenv:Body> <sam:search> <sessionid>${Correct Session Property#Session}</sessionid> <searchstring/> </sam:search> </soapenv:Body> </soapenv:Envelope>//faultstring Invalid Session Id false
SampleServiceSoapBinding search <xml-fragment/>UTF-8 http://127.0.0.1:8088/mockSampleServiceSoapBinding<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:sam="http://www.example.org/sample/"> <soapenv:Header/> <soapenv:Body> <sam:search> <sessionid>6767676767676</sessionid> <searchstring>Item 1</searchstring> </sam:search> </soapenv:Body> </soapenv:Envelope>//faultstring Invalid Session Id false
SampleServiceSoapBinding search <xml-fragment/>UTF-8 http://127.0.0.1:8088/mockSampleServiceSoapBinding<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:sam="http://www.example.org/sample/"> <soapenv:Header/> <soapenv:Body> <sam:search> <sessionid>${Correct Session Property#Session}</sessionid> <searchstring>Select * from Customers</searchstring> </sam:search> </soapenv:Body> </soapenv:Envelope>//faultstring Invalid Session Id false
SampleServiceSoapBinding search <xml-fragment/>UTF-8 http://127.0.0.1:8088/mockSampleServiceSoapBinding<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:sam="http://www.example.org/sample/"> <soapenv:Header/> <soapenv:Body> <sam:search> <sessionid>Select * from Customers</sessionid> <searchstring>Item 2</searchstring> </sam:search> </soapenv:Body> </soapenv:Envelope>//faultstring Invalid Session Id false
SampleServiceSoapBinding search <xml-fragment/>UTF-8 http://127.0.0.1:8088/mockSampleServiceSoapBinding<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:sam="http://www.example.org/sample/"> <soapenv:Header/> <soapenv:Body> <sam:search> <sessionid>${Correct Session Property#Session}</sessionid> <sessionid>${Correct Session Property#Session}</sessionid> <searchstring>Item 2</searchstring> </sam:search> </soapenv:Body> </soapenv:Envelope>//faultstring Missing operation for soapAction [http://www.example.org/sample/search] and body element [{http://www.example.org/sample/}search] with SOAP Version [SOAP 1.1]false false
SampleServiceSoapBinding login UTF-8 http://127.0.0.1:8088/mockSampleServiceSoapBinding<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:sam="http://www.example.org/sample/"> <soapenv:Header/> <soapenv:Body> <sam:login> <username>Login</username> <password>Login123</password> </sam:login> </soapenv:Body> </soapenv:Envelope>
SampleServiceSoapBinding search <xml-fragment/>UTF-8 http://127.0.0.1:8088/mockSampleServiceSoapBinding<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:sam="http://www.example.org/sample/"> <soapenv:Header/> <soapenv:Body> <sam:search> <sessionid>${Test Request: Login#Response#//sam:loginResponse/sessionid}</sessionid> <searchstring>Item 7</searchstring> </sam:search> </soapenv:Body> </soapenv:Envelope>Unknown Search false
SampleServiceSoapBinding search <xml-fragment/>UTF-8 http://127.0.0.1:8088/mockSampleServiceSoapBinding<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:sam="http://www.example.org/sample/"> <soapenv:Header/> <soapenv:Body> <sam:search> <sessionid>${Test Request: Login#Response#//sam:loginResponse/sessionid}</sessionid> <searchstring/> </sam:search> </soapenv:Body> </soapenv:Envelope>//faultstring Unknown Search String false
SampleServiceSoapBinding search <xml-fragment/>UTF-8 http://127.0.0.1:8088/mockSampleServiceSoapBinding<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:sam="http://www.example.org/sample/"> <soapenv:Header/> <soapenv:Body> <sam:search> <sessionid>6767676767676</sessionid> <searchstring>Item 1</searchstring> </sam:search> </soapenv:Body> </soapenv:Envelope>//faultstring Invalid Session Id false
SampleServiceSoapBinding search <xml-fragment/>UTF-8 http://127.0.0.1:8088/mockSampleServiceSoapBinding<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:sam="http://www.example.org/sample/"> <soapenv:Header/> <soapenv:Body> <sam:search> <sessionid>${Test Request: Login#Response#//sam:loginResponse/sessionid}</sessionid> <searchstring>Select * from Customers</searchstring> </sam:search> </soapenv:Body> </soapenv:Envelope>//faultstring Unknown Search String false
SampleServiceSoapBinding search <xml-fragment/>UTF-8 http://127.0.0.1:8088/mockSampleServiceSoapBinding<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:sam="http://www.example.org/sample/"> <soapenv:Header/> <soapenv:Body> <sam:search> <sessionid>Select * from Customers</sessionid> <searchstring>Item 2</searchstring> </sam:search> </soapenv:Body> </soapenv:Envelope>//faultstring Invalid Session Id false
SampleServiceSoapBinding search <xml-fragment/>UTF-8 http://127.0.0.1:8088/mockSampleServiceSoapBinding<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:sam="http://www.example.org/sample/"> <soapenv:Header/> <soapenv:Body> <sam:search> <sessionid>${Test Request: Login#Response#//sam:loginResponse/sessionid}</sessionid> <sessionid>${Test Request: Login#Response#//sam:loginResponse/sessionid}</sessionid> <searchstring>Item 2</searchstring> </sam:search> </soapenv:Body> </soapenv:Envelope>//faultstring Missing operation for soapAction [http://www.example.org/sample/search] and body element [{http://www.example.org/sample/}search] with SOAP Version [SOAP 1.1]false false
SampleServiceSoapBinding logout UTF-8 http://127.0.0.1:8088/mockSampleServiceSoapBinding<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:sam="http://www.example.org/sample/"> <soapenv:Header/> <soapenv:Body> <sam:logout> <sessionid>${Test Request: Login#Response#//sam:loginResponse/sessionid}</sessionid> </sam:logout> </soapenv:Body> </soapenv:Envelope>declare namespace sam='http://www.example.org/sample/'; //sam:logoutResponse/sessioninfo OK false
SampleServiceSoapBinding search <xml-fragment/>UTF-8 http://127.0.0.1:8088/mockSampleServiceSoapBinding<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:sam="http://www.example.org/sample/"> <soapenv:Header/> <soapenv:Body> <sam:search> <sessionid>${Correct Session Property#Session}</sessionid> <searchstring>Item 4</searchstring> </sam:search> </soapenv:Body> </soapenv:Envelope>//faultstring Invalid Session Id false
Here is an interesting TestCase.

The actual TestCase itself is not that interesting, but we've used it in order to test how the Web Service handles load.

AND...

The second LoadTest "LoadTest with Multiple Tests (will fail)" DOES fail. Why does it fail and not the first? This is because in the first test we have just one simple thread and in the second we have a whopping ten.

What have we achieved? Our Web Service is not thread safe! Bug Found!
SampleServiceSoapBinding login UTF-8 http://127.0.0.1:8088/mockSampleServiceSoapBinding<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:sam="http://www.example.org/sample/"> <soapenv:Header/> <soapenv:Body> <sam:login> <username>Login${=String.valueOf(Math.random()).substring( 0, 5 )}</username> <password>Login123</password> </sam:login> </soapenv:Body> </soapenv:Envelope>
SampleServiceSoapBinding logout UTF-8 http://127.0.0.1:8088/mockSampleServiceSoapBinding<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:sam="http://www.example.org/sample/"> <soapenv:Header/> <soapenv:Body> <sam:logout> <sessionid>${Test Request: Login#Response#//sam:loginResponse/sessionid}</sessionid> </sam:logout> </soapenv:Body> </soapenv:Envelope>declare namespace sam='http://www.example.org/sample/'; //sam:logoutResponse/sessioninfo OK false
SampleServiceSoapBinding search <xml-fragment/>UTF-8 http://127.0.0.1:8088/mockSampleServiceSoapBinding<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:sam="http://www.example.org/sample/"> <soapenv:Header/> <soapenv:Body> <sam:search> <sessionid>${Test Request: Login#Response#//sam:loginResponse/sessionid}</sessionid> <searchstring>Item 4</searchstring> </sam:search> </soapenv:Body> </soapenv:Envelope>//faultstring Invalid Session Id false
1
0
250
false
true
-1
60
TIME
Simple
100
true
500
10
0
250
false
true
-1
60
TIME
Simple
After 30 errors, stop
30
0.0
- Any -
100
true
500
SEQUENTIAL
TestCase: Search and Buy TestCase

This test is the first expanded TestCase. It basically tests our entire MockService by doing the following.

1) Logging in 2) Searching for all items in stock 3) Choosing the first items and Buying it 4) Logging out

We also have added LoadTests of all "Strategies"

1) Simple 2) Variance 3) Burst 4) Thread

The thread strategy will produce errors. We will go into that further in the TestCase "TestCase: Searching after Logging out LoadTests" in the TestSuite "Sample TestSuite fails if we don't get faults"
Username Logini${=String.valueOf(Math.random()).substring( 0, 5 )} Password Logini123 SearchPhrase Item 1
SampleServiceSoapBinding login UTF-8 http://127.0.0.1:8088/mockSampleServiceSoapBinding<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:sam="http://www.example.org/sample/"> <soapenv:Header/> <soapenv:Body> <sam:login> <username>${Properties: Username and Password#Username}</username> <password>${Properties: Username and Password#Password}</password> </sam:login> </soapenv:Body> </soapenv:Envelope>
SampleServiceSoapBinding search <xml-fragment/>UTF-8 http://127.0.0.1:8088/mockSampleServiceSoapBinding<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:sam="http://www.example.org/sample/"> <soapenv:Header/> <soapenv:Body> <sam:search> <sessionid>${Test Request: login#Response#//sam:loginResponse/sessionid}</sessionid> <searchstring>all</searchstring> </sam:search> </soapenv:Body> </soapenv:Envelope>declare namespace sam='http://www.example.org/sample/'; //sam:searchResponse[1]/sam:searchResponse/item[3]/description One towel. Massively useful thing. Impress the strags with this amazing cloth!false
SampleServiceSoapBinding buy UTF-8 http://127.0.0.1:8088/mockSampleServiceSoapBinding<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:sam="http://www.example.org/sample/"> <soapenv:Header/> <soapenv:Body> <sam:buy> <sessionid>${Test Request: login#Response#//sam:loginResponse/sessionid}</sessionid> <buystring>${Test Request: search#Response#//sam:searchResponse/sam:searchResponse/item[id="Item 5"]/id}</buystring> </sam:buy> </soapenv:Body> </soapenv:Envelope>declare namespace sam='http://www.example.org/sample/'; //sam:buyResponse/purchasestatus/expectedDelivery You should already have it.false
SampleServiceSoapBinding logout UTF-8 http://127.0.0.1:8088/mockSampleServiceSoapBinding<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:sam="http://www.example.org/sample/"> <soapenv:Header/> <soapenv:Body> <sam:logout> <sessionid>${Test Request: login#Response#//sam:loginResponse/sessionid}</sessionid> </sam:logout> </soapenv:Body> </soapenv:Envelope>
1
0
250
false
true
-1
30
TIME
Simple
100
true
500
1
0
250
false
true
-1
30
TIME
Variance 5000 0.5
100
true
500
1
0
250
false
true
-1
30
TIME
Burst 5000 5000
100
true
500
2
0
250
false
true
-1
30
TIME
Thread 1 2
100
true
500
This TestCase shows some interesting assertions. Check out the search TestStep, there are two assertions "XPath retrieve sibling value" and "XPath Match More Than Less Than" that shows some interesting ways of using XPath.
Username Logini${=String.valueOf(Math.random()).substring( 0, 5 )} Password Logini123 SearchPhrase Item 1
Item Item 3 Wanted At Least 2.50 Wanted at most 3.50 Sibling 2.99
SampleServiceSoapBinding login UTF-8 http://127.0.0.1:8088/mockSampleServiceSoapBinding<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:sam="http://www.example.org/sample/"> <soapenv:Header/> <soapenv:Body> <sam:login> <username>${Properties: Username and Password#Username}</username> <password>${Properties: Username and Password#Password}</password> </sam:login> </soapenv:Body> </soapenv:Envelope>
SampleServiceSoapBinding search <xml-fragment/>UTF-8 http://127.0.0.1:8088/mockSampleServiceSoapBinding<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:sam="http://www.example.org/sample/"> <soapenv:Header/> <soapenv:Body> <sam:search> <sessionid>${Test Request: login#Response#//sam:loginResponse/sessionid}</sessionid> <searchstring>all</searchstring> </sam:search> </soapenv:Body> </soapenv:Envelope>declare namespace sam='http://www.example.org/sample/'; //sam:searchResponse[1]/sam:searchResponse/item[3]/description One towel. Massively useful thing. Impress the strags with this amazing cloth!falsedeclare namespace sam='http://www.example.org/sample/'; //sam:searchResponse[1]/sam:searchResponse/item[id="${Properties: Wanted Response#Item}"]/price >= ("${Properties: Wanted Response#Wanted At Least}") and //sam:searchResponse[1]/sam:searchResponse/item[id="${Properties: Wanted Response#Item}"]/price <= ("${Properties: Wanted Response#Wanted At Most}" )true falsedeclare namespace sam='http://www.example.org/sample/'; //sam:searchResponse[1]/sam:searchResponse/item[price="${Properties: Wanted Response#Sibling}"]/id${Properties: Wanted Response#Item}false
SampleServiceSoapBinding logout UTF-8 http://127.0.0.1:8088/mockSampleServiceSoapBinding<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:sam="http://www.example.org/sample/"> <soapenv:Header/> <soapenv:Body> <sam:logout> <sessionid>${Test Request: login#Response#//sam:loginResponse/sessionid}</sessionid> </sam:logout> </soapenv:Body> </soapenv:Envelope>
false
def groovyUtils = new com.eviware.soapui.support.GroovyUtils( context ) def holder = groovyUtils.getXmlHolder( mockRequest.requestContent )

def username = holder.getNodeValue( "//username" ) def password = holder.getNodeValue( "//password" ) def sum = username + password

// validate if( sum.length() > 25 || sum.length() < 10 || !username.startsWith("Login") || !password.endsWith( "123" )) return "Invalid Login Fault"

if( context.hasProperty( sum )) return "Already Logged In Fault"

// seems ok def sessionid = String.valueOf( Math.random() ).substring( 2 )

context.setProperty( sum, sessionid ) context.setProperty( sessionid, sum )

requestContext.sessionid = sessionid return "Ok Response"
SCRIPT
Ok Response
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:sam="http://www.example.org/sample/"> <soapenv:Header/> <soapenv:Body> <sam:loginResponse> <sessionid>${sessionid}</sessionid> </sam:loginResponse> </soapenv:Body> </soapenv:Envelope>
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:sam="http://www.example.org/sample/"> <soapenv:Body> <soapenv:Fault> <faultcode>Client</faultcode> <faultstring>Invalid Login</faultstring> <detail> <sam:loginFault>The login credentials are invalid</sam:loginFault> </detail> </soapenv:Fault> </soapenv:Body> </soapenv:Envelope>
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:sam="http://www.example.org/sample/"> <soapenv:Body> <soapenv:Fault> <faultcode>Client</faultcode> <faultstring>Already Login</faultstring> <detail> <sam:loginFault>The specified credentials are already logged in</sam:loginFault> </detail> </soapenv:Fault> </soapenv:Body> </soapenv:Envelope>
def groovyUtils = new com.eviware.soapui.support.GroovyUtils( context ) def holder = groovyUtils.getXmlHolder( mockRequest.requestContent )

def sessionid = holder.getNodeValue( "//sessionid" )

// check if( !context.hasProperty( sessionid )) return "Invalid Session Id Fault"

// logout context.removeProperty( context.getProperty( sessionid )) context.removeProperty( sessionid ) requestContext.sessioninfo = "OK"

return "Ok Response"
SCRIPT
Response 1
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:sam="http://www.example.org/sample/"> <soapenv:Header/> <soapenv:Body> <sam:logoutResponse> <sessioninfo>${sessioninfo}</sessioninfo> </sam:logoutResponse> </soapenv:Body> </soapenv:Envelope>
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/"> <soapenv:Body> <soapenv:Fault> <faultcode>Client</faultcode> <faultstring>Invalid Session Id</faultstring> </soapenv:Fault> </soapenv:Body> </soapenv:Envelope>
def groovyUtils = new com.eviware.soapui.support.GroovyUtils( context ) def holder = groovyUtils.getXmlHolder( mockRequest.requestContent )

def sessionid = holder.getNodeValue( "//sessionid" )

// check if( !context.hasProperty( sessionid )) return "Invalid Session Id Fault"

def searchstring = holder.getNodeValue( "//searchstring" )

if (searchstring == "all") return "WildCard Response" else if (searchstring == "Item 1") return "Item 1 Response" else if (searchstring == "Item 2") return "Item 2 Response" else if (searchstring == "Item 3") return "Item 3 Response" else if (searchstring == "Item 4") return "Item 3 Response" else if (searchstring == "Item 5") return "Item 5 Response" else return "Unknown Response"

return "Search Response"
SCRIPT
Response 1
context.item4description = Math.random() > 0.9 ? "garbage" : "Item nr 4"
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:sam="http://www.example.org/sample/"> <soapenv:Header/> <soapenv:Body> <sam:searchResponse> <sam:searchResponse> <item> <id>1</id> <description>One handy protocol droid.</description> <price>1</price> </item> <item> <id>2</id> <description>Item nr 2</description> <price>2</price> </item> <item> <id>3</id> <description>Item nr 3</description> <price>3</price> </item> <item> <id>4</id> <description>${item4description}</description> <price>4</price> </item> <item> <id>5</id> <description>Item nr 5</description> <price>5</price> </item> </sam:searchResponse> </sam:searchResponse> </soapenv:Body> </soapenv:Envelope>
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/"> <soapenv:Body> <soapenv:Fault> <faultcode>Client</faultcode> <faultstring>Invalid Session Id</faultstring> </soapenv:Fault> </soapenv:Body> </soapenv:Envelope>
context.item4description = Math.random() > 0.9 ? "garbage" : "Item nr 4"
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:sam="http://www.example.org/sample/"> <soapenv:Header/> <soapenv:Body> <sam:searchResponse> <sam:searchResponse> <item> <id>Item 1</id> <description>One handy protocol droid. This droid is fluent in over six million forms of communication and has a lovely golden color. Built by an enthusiast. Mindwiped only once. Can be carried on your back.</description> <price>1</price> </item> </sam:searchResponse>

</sam:searchResponse> </soapenv:Body> </soapenv:Envelope>
context.item4description = Math.random() > 0.9 ? "garbage" : "Item nr 4"
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:sam="http://www.example.org/sample/"> <soapenv:Header/> <soapenv:Body> <sam:searchResponse> <sam:searchResponse> <item> <id>Item 2</id> <description>Box of chocolate with several popular items. Covered in Glucose. Recommended safety distance when eating Spring Surprise, 10 feet.</description> <price>1.99</price> </item> </sam:searchResponse> </sam:searchResponse> </soapenv:Body> </soapenv:Envelope>
context.item4description = Math.random() > 0.9 ? "garbage" : "Item nr 4"
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:sam="http://www.example.org/sample/"> <soapenv:Header/> <soapenv:Body> <sam:searchResponse> <sam:searchResponse> <item> <id>Item 3</id> <description>One towel. Massively useful thing. Impress the strags with this amazing cloth!</description> <price>2.99</price> </item> <sam:searchResponse> </sam:searchResponse> </soapenv:Body> </soapenv:Envelope>
context.item4description = Math.random() > 0.9 ? "garbage" : "Item nr 4"
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:sam="http://www.example.org/sample/"> <soapenv:Header/> <soapenv:Body> <sam:searchResponse> <sam:searchResponse> <item> <id>item 4</id> <description>Ono-Sendai 7. The newest cowboy tech from Hosaka. Break the ICE with this conversation piece.</description> <price>4.99</price> </item> <sam:searchResponse> </sam:searchResponse> </soapenv:Body> </soapenv:Envelope>
context.item4description = Math.random() > 0.9 ? "garbage" : "Item nr 4"
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:sam="http://www.example.org/sample/"> <soapenv:Header/> <soapenv:Body> <sam:searchResponse> <sam:searchResponse> <item> <id>item 5</id> <description>soapui Pro 1.7.5. Necessary when testing Web Services.</description> <price>349</price> </item> <sam:searchResponse> </sam:searchResponse> </soapenv:Body> </soapenv:Envelope>
context.item4description = Math.random() > 0.9 ? "garbage" : "Item nr 4"
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:sam="http://www.example.org/sample/"> <soapenv:Header/> <soapenv:Body> <soapenv:Fault> <faultcode>Server</faultcode> <faultstring>No Result</faultstring> <detail> <sam:loginFault>The search returned no items</sam:loginFault> </detail> </soapenv:Fault> </soapenv:Body> </soapenv:Envelope>
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/"> <soapenv:Body> <soapenv:Fault> <faultcode>Client</faultcode> <faultstring>Unknown Search String</faultstring> </soapenv:Fault> </soapenv:Body> </soapenv:Envelope>
context.item4description = Math.random() > 0.9 ? "garbage" : "Item nr 4"
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:sam="http://www.example.org/sample/"> <soapenv:Header/> <soapenv:Body> <sam:searchResponse> <sam:searchResponse> <item> <id>Item 1</id> <description>One handy protocol droid. This droid is fluent in over six million forms of communication and has a lovely golden color. Built by an enthusiast. Mindwiped only once. Can be carried on your back.</description> <price>1</price> </item> <item> <id>Item 2</id> <description>Box of chocolate with several popular items. Covered in Glucose. Recommended safety distance when eating Spring Surprise, 10 feet.</description> <price>1.99</price> </item> <item> <id>Item 3</id> <description>One towel. Massively useful thing. Impress the strags with this amazing cloth!</description> <price>2.99</price> </item> <item> <id>Item 4</id> <description>Ono-Sendai 7. The newest cowboy tech from Hosaka. Break the ICE with this conversation piece.</description> <price>4.99</price> </item> <item> <id>Item 5</id> <description>soapui Pro 1.7.5. Necessary when testing Web Services.</description> <price>349</price> </item> </sam:searchResponse> </sam:searchResponse> </soapenv:Body> </soapenv:Envelope>
def groovyUtils = new com.eviware.soapui.support.GroovyUtils( context ) def holder = groovyUtils.getXmlHolder( mockRequest.requestContent )

def sessionid = holder.getNodeValue( "//sessionid" )

// check if( !context.hasProperty( sessionid )) return "Invalid Session Id Fault"

def buystring = holder.getNodeValue( "//buystring" )

if (buystring == "all") return "WildCard Response" else if (buystring == "Item 1") return "Item 1 Response" else if (buystring == "Item 2") return "Item 2 Response" else if (buystring == "Item 3") return "Item 3 Response" else if (buystring == "Item 4") return "Item 3 Response" else if (buystring == "Item 5") return "Item 5 Response" else return "Unknown Response"

return "Search Response"
SCRIPT
Buy Response
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:sam="http://www.example.org/sample/"> <soapenv:Header/> <soapenv:Body> <sam:buyResponse> <purchasestatus> <id>?</id> <stockStatus>?</stockStatus> <expectedDelivery>?</expectedDelivery> </purchasestatus> </sam:buyResponse> </soapenv:Body> </soapenv:Envelope>
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:sam="http://www.example.org/sample/"> <soapenv:Header/> <soapenv:Body> <sam:buyResponse> <purchasestatus> <id>Item 1</id> <stockStatus>1 unit</stockStatus> <expectedDelivery>2000 years from now</expectedDelivery> </purchasestatus> </sam:buyResponse> </soapenv:Body> </soapenv:Envelope>
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:sam="http://www.example.org/sample/"> <soapenv:Header/> <soapenv:Body> <sam:buyResponse> <purchasestatus> <id>Item 2</id> <stockStatus>10 000 boxes</stockStatus> <expectedDelivery>1 week</expectedDelivery> </purchasestatus> </sam:buyResponse> </soapenv:Body> </soapenv:Envelope>
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:sam="http://www.example.org/sample/"> <soapenv:Header/> <soapenv:Body> <sam:buyResponse> <purchasestatus> <id>Item 3</id> <stockStatus>4 towels</stockStatus> <expectedDelivery>Any day now...</expectedDelivery> </purchasestatus> </sam:buyResponse> </soapenv:Body> </soapenv:Envelope>
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:sam="http://www.example.org/sample/"> <soapenv:Header/> <soapenv:Body> <sam:buyResponse> <purchasestatus> <id>Item 4</id> <stockStatus>1 unit</stockStatus> <expectedDelivery>In the near future.</expectedDelivery> </purchasestatus> </sam:buyResponse> </soapenv:Body> </soapenv:Envelope>
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:sam="http://www.example.org/sample/"> <soapenv:Header/> <soapenv:Body> <sam:buyResponse> <purchasestatus> <id>Item 5</id> <stockStatus>1 license</stockStatus> <expectedDelivery>You should already have it.</expectedDelivery> </purchasestatus> </sam:buyResponse> </soapenv:Body> </soapenv:Envelope>
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/"> <soapenv:Body> <soapenv:Fault> <faultcode>Client</faultcode> <faultstring>Invalid Session Id</faultstring> </soapenv:Fault> </soapenv:Body> </soapenv:Envelope>
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:sam="http://www.example.org/sample/"> <soapenv:Header/> <soapenv:Body> <sam:buyResponse> <purchasestatus> <id>?</id> <stockStatus>?</stockStatus> <expectedDelivery>?</expectedDelivery> </purchasestatus> </sam:buyResponse> </soapenv:Body> </soapenv:Envelope>
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:sam="http://www.example.org/sample/"> <soapenv:Header/> <soapenv:Body> <sam:buyResponse> <purchasestatus> <id>Item 1</id> <stockStatus>1 unit</stockStatus> <expectedDelivery>2000 years from now</expectedDelivery> </purchasestatus> <purchasestatus> <id>Item 2</id> <stockStatus>10 000 boxes</stockStatus> <expectedDelivery>1 week</expectedDelivery> </purchasestatus> <purchasestatus> <id>Item 3</id> <stockStatus>4 towels</stockStatus> <expectedDelivery>Any day now...</expectedDelivery> </purchasestatus> <purchasestatus> <id>Item 4</id> <stockStatus>1 unit</stockStatus> <expectedDelivery>In the near future.</expectedDelivery> </purchasestatus>' <purchasestatus> <id>Item 5</id> <stockStatus>1 license</stockStatus> <expectedDelivery>You should already have it.</expectedDelivery> </purchasestatus>¨ </sam:buyResponse> </soapenv:Body> </soapenv:Envelope>
Some Property with a value
SystemPropertiesReport
/home/robert/soapui/bin/reports/subreports/loadtest/LoadTestLog.jrxml
COMMON
SUBREPORT
LoadTestLog
<jasperReport xsi:schemaLocation="http://jasperreports.sourceforge.net/jasperreports http://jasperreports.sourceforge.net/xsd/jasperreport.xsd" name="report name" language="groovy" pageWidth="535" pageHeight="842" columnWidth="535" leftMargin="0" rightMargin="0" topMargin="0" bottomMargin="0" xmlns="http://jasperreports.sourceforge.net/jasperreports" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> <template>"../../styles.jrtx"</template> <field name="name" class="java.lang.String"/> <field name="value" class="java.lang.String"/> <columnHeader> <band height="59"> <staticText> <reportElement style="ColumnHeader" x="0" y="35" width="122" height="20"/> <textElement textAlignment="Left" verticalAlignment="Middle"/> <text>Name</text> </staticText> <staticText> <reportElement style="ColumnHeader" x="133" y="35" width="40" height="20"/> <textElement textAlignment="Left" verticalAlignment="Middle"/> <text>Value</text> </staticText> <staticText> <reportElement style="SmallHeader" x="0" y="0" width="535" height="34"/> <textElement textAlignment="Left" verticalAlignment="Middle"/> <text>System Properties</text> </staticText> </band> </columnHeader> <detail> <band height="21"> <textField> <reportElement x="0" y="1" width="122" height="20"/> <textElement textAlignment="Left" verticalAlignment="Top"/> <textFieldExpression class="java.lang.String">$F{name}</textFieldExpression> </textField> <textField> <reportElement x="133" y="1" width="350" height="20"/> <textElement textAlignment="Left" verticalAlignment="Top"/> <textFieldExpression class="java.lang.String">$F{value}</textFieldExpression> </textField> </band> </detail> </jasperReport>
NO DESC
PROJECT