Skip to content

Instantly share code, notes, and snippets.

Embed
What would you like to do?
soapUI project to load test SSL performance. Specifically meant for the ABAP HTTP handler at https://gist.github.com/sufw/5746443, but can be adapted to any other HTTP resource
<?xml version="1.0" encoding="UTF-8"?>
<con:soapui-project activeEnvironment="Default" name="SSL Performance Test" resourceRoot="" defaultScriptLanguage="Groovy" soapui-version="4.5.1" abortOnError="false" runType="SEQUENTIAL" xmlns:con="http://eviware.com/soapui/config"><con:settings/><con:interface xsi:type="con:RestService" wadlVersion="http://wadl.dev.java.net/2009/02" name="Fibonacci Generator" type="rest" basePath="" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"><con:settings/><con:definitionCache type="TEXT" rootPart=""/><con:endpoints><con:endpoint>https://server.local:443</con:endpoint><con:endpoint>http://server.local:80</con:endpoint></con:endpoints><con:resource name="fibonacci" path="/mmg/fibonacci"><con:settings/><con:parameters/><con:method name="GET" method="GET"><con:settings/><con:parameters><con:parameter><con:name>count</con:name><con:value>149</con:value><con:style>QUERY</con:style><con:default>149</con:default></con:parameter><con:parameter><con:name>cache</con:name><con:value>true</con:value><con:style>QUERY</con:style><con:default>true</con:default></con:parameter></con:parameters><con:representation type="RESPONSE"><con:mediaType xsi:nil="true"/><con:status>0</con:status><con:params/><con:element>data</con:element></con:representation><con:representation type="RESPONSE"><con:mediaType xsi:nil="true"/><con:status>0</con:status><con:params/><con:element>data</con:element></con:representation><con:representation type="FAULT"><con:mediaType>text/html; charset=utf-8</con:mediaType><con:status>401</con:status><con:params/><con:element>html</con:element></con:representation><con:representation type="RESPONSE"><con:mediaType>text/plain; charset=utf-8</con:mediaType><con:status>200</con:status><con:params/><con:element>data</con:element></con:representation><con:representation type="FAULT"><con:mediaType>text/html</con:mediaType><con:status>500</con:status><con:params/><con:element>html</con:element></con:representation><con:representation type="RESPONSE"><con:mediaType xsi:nil="true"/><con:status>0</con:status><con:params/><con:element>data</con:element></con:representation><con:request name="SSL" mediaType="application/xml" sslKeystore=""><con:settings><con:setting id="com.eviware.soapui.impl.wsdl.WsdlRequest@request-headers">&lt;xml-fragment/></con:setting></con:settings><con:endpoint>https://server.local:443</con:endpoint><con:request/><con:credentials><con:authType>Global HTTP Settings</con:authType></con:credentials><con:jmsConfig JMSDeliveryMode="PERSISTENT"/><con:jmsPropertyConfig/><con:parameters/></con:request><con:request name="Plaintext" mediaType="application/xml" sslKeystore=""><con:settings><con:setting id="com.eviware.soapui.impl.wsdl.WsdlRequest@request-headers">&lt;xml-fragment/></con:setting></con:settings><con:endpoint>http://server.local:80</con:endpoint><con:request/><con:credentials><con:username></con:username><con:password></con:password><con:authType>Global HTTP Settings</con:authType></con:credentials><con:jmsConfig JMSDeliveryMode="PERSISTENT"/><con:jmsPropertyConfig/><con:parameters/></con:request><con:request name="SSL via Web Dispatcher" mediaType="application/xml" sslKeystore=""><con:settings><con:setting id="com.eviware.soapui.impl.wsdl.WsdlRequest@request-headers">&lt;xml-fragment/></con:setting></con:settings><con:endpoint>https://server.local:1443</con:endpoint><con:request/><con:credentials><con:authType>Global HTTP Settings</con:authType></con:credentials><con:jmsConfig JMSDeliveryMode="PERSISTENT"/><con:jmsPropertyConfig/><con:parameters/></con:request></con:method></con:resource></con:interface><con:testSuite name="Fibonacci Generator TestSuite"><con:description>TestSuite generated for REST Service [Fibonacci Generator]</con:description><con:settings/><con:runType>SEQUENTIAL</con:runType><con:testCase failOnError="true" failTestCaseOnErrors="true" keepSession="false" maxResults="0" name="Default Test Case" searchProperties="true" id="ec38c625-d727-4724-90fe-29e22e1c2987" timeout="0" wsrmEnabled="false" wsrmVersion="1.0" wsrmAckTo="" amfAuthorisation="false" amfEndpoint="" amfLogin="" amfPassword=""><con:settings/><con:testStep type="delay" name="Delay" disabled="true"><con:settings/><con:config><delay>${=(int)(Math.random()*200)}</delay></con:config></con:testStep><con:testStep type="restrequest" name="fibonacci_plaintext" disabled="true"><con:settings/><con:config service="Fibonacci Generator" resourcePath="/mmg/fibonacci" methodName="GET" xsi:type="con:RestRequestStep" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"><con:restRequest name="fibonacci_plaintext" mediaType="application/xml" sslKeystore=""><con:settings><con:setting id="com.eviware.soapui.impl.wsdl.WsdlRequest@request-headers">&lt;xml-fragment/></con:setting></con:settings><con:endpoint>https://server.local:443</con:endpoint><con:request/><con:assertion type="GroovyScriptAssertion" name="Script Assertion"><con:configuration><scriptText>// check whether this is running from a Load Test; if so, save the response time for later.
if (context.LoadTestContext != null){
if (context.runCounter == 0){
// this is the initial run. Save its response time separately from subsequent runs.
context.LoadTestContext.responseTimes.plain.initial.push((int)(messageExchange.getTimeTaken()));
} else {
// save the response times for subsequent runs in a different list
context.LoadTestContext.responseTimes.plain.subseq.push((int)(messageExchange.getTimeTaken()));
}
}
//log.info( context.LoadTestContext.responseTimes);</scriptText></con:configuration></con:assertion><con:assertion type="Valid HTTP Status Codes" name="Valid HTTP Status Codes"><con:configuration><codes>200</codes></con:configuration></con:assertion><con:credentials><con:username></con:username><con:password></con:password><con:authType>Preemptive</con:authType></con:credentials><con:jmsConfig JMSDeliveryMode="PERSISTENT"/><con:jmsPropertyConfig/><con:parameters>
<con:entry key="cache" value="${#TestCase#cache}"/>
<con:entry key="count" value="${#TestCase#count}"/>
</con:parameters></con:restRequest></con:config></con:testStep><con:testStep type="restrequest" name="fibonacci_ssl"><con:settings/><con:config service="Fibonacci Generator" resourcePath="/mmg/fibonacci" methodName="GET" xsi:type="con:RestRequestStep" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"><con:restRequest name="fibonacci_ssl" mediaType="application/xml" sslKeystore=""><con:settings><con:setting id="com.eviware.soapui.impl.wsdl.WsdlRequest@request-headers">&lt;xml-fragment/></con:setting></con:settings><con:endpoint>https://server.local:443</con:endpoint><con:request/><con:assertion type="GroovyScriptAssertion" name="Script Assertion"><con:configuration><scriptText>// check whether this is running from a Load Test; if so, save the response time for later.
if (context.LoadTestContext != null){
if (context.runCounter == 0){
// this is the initial run. Save its response time separately from subsequent runs.
context.LoadTestContext.responseTimes.ssl.initial.push((int)(messageExchange.getTimeTaken()));
} else {
// save the response times for subsequent runs in a different list
context.LoadTestContext.responseTimes.ssl.subseq.push((int)(messageExchange.getTimeTaken()));
}
}
//log.info( context.LoadTestContext.responseTimes);</scriptText></con:configuration></con:assertion><con:assertion type="Valid HTTP Status Codes" name="Valid HTTP Status Codes"><con:configuration><codes>200</codes></con:configuration></con:assertion><con:credentials><con:username></con:username><con:password></con:password><con:authType>Preemptive</con:authType></con:credentials><con:jmsConfig JMSDeliveryMode="PERSISTENT"/><con:jmsPropertyConfig/><con:parameters>
<con:entry key="cache" value="${#TestCase#cache}"/>
<con:entry key="count" value="${#TestCase#count}"/>
</con:parameters></con:restRequest></con:config></con:testStep><con:testStep type="groovy" name="Loop Controller"><con:settings/><con:config><script>if (context.runCounter != null){
context.runCounter += 1;
}
if (context.runCounter &lt; testRunner.testCase.getPropertyValue("loopsInTestCase").toInteger()){
testRunner.gotoStepByName("Delay");
}
</script></con:config></con:testStep><con:loadTest name="LoadTest 1"><con:settings><con:setting id="HttpSettings@close-connections">false</con:setting><con:setting id="HttpSettings@include_request_in_time_taken">false</con:setting><con:setting id="HttpSettings@include_response_in_time_taken">false</con:setting></con:settings><con:threadCount>50</con:threadCount><con:startDelay>500</con:startDelay><con:sampleInterval>250</con:sampleInterval><con:calculateTPSOnTimePassed>true</con:calculateTPSOnTimePassed><con:resetStatisticsOnThreadCountChange>true</con:resetStatisticsOnThreadCountChange><con:historyLimit>-1</con:historyLimit><con:testLimit>20</con:testLimit><con:limitType>COUNT_PER_THREAD</con:limitType><con:loadStrategy><con:type>Simple</con:type><con:config><testDelay>0</testDelay><randomFactor>0.0</randomFactor></con:config></con:loadStrategy><con:assertion type="Step Status" name="Step Status"/><con:maxAssertionErrors>9999</con:maxAssertionErrors><con:statisticsLogFolder/><con:statisticsLogInterval>0</con:statisticsLogInterval><con:logStatisticsOnThreadChange>false</con:logStatisticsOnThreadChange><con:cancelOnReachedLimit>false</con:cancelOnReachedLimit><con:cancelExcessiveThreads>true</con:cancelExcessiveThreads><con:strategyInterval>500</con:strategyInterval><con:setupScript>context.responseTimes = [
plain:[
initial:[],
subseq:[]
],
ssl:[
initial:[],
subseq:[]
]
];
</con:setupScript><con:tearDownScript>for (type in ["plain", "ssl"]){
for (subtype in ["initial", "subseq"]){
values = [];
// Ugly big try/catch block here to handle some steps being disabled in the Test Suite
try {
values = context.responseTimes[type][subtype].sort();
} catch (e) {
// do nothing
}
if (values.size() > 0){
//printStats(type, subtype, values);
log.info(subtype + " " + type + ": " + values);
} else {
log.info("No stats captured for " + subtype + " " + type);
}
}
}
</con:tearDownScript><con:updateStatisticsPerTestStep>false</con:updateStatisticsPerTestStep></con:loadTest><con:setupScript>context.runCounter = 0;</con:setupScript><con:tearDownScript/><con:properties><con:property><con:name>count</con:name><con:value>149</con:value></con:property><con:property><con:name>cache</con:name><con:value>true</con:value></con:property><con:property><con:name>loopsInTestCase</con:name><con:value>10</con:value></con:property></con:properties></con:testCase><con:properties/></con:testSuite><con:properties/><con:wssContainer/></con:soapui-project>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment