Skip to content

Commit 1e52cf7

Browse files
author
Holger Balow-Schott
committed
add Open Connection TestStep
1 parent 35a9b52 commit 1e52cf7

76 files changed

Lines changed: 311 additions & 40 deletions

File tree

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

README.md

Lines changed: 24 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -3,10 +3,11 @@
33

44
## Ready! API Websocket Plugin
55

6-
This plugin adds three TestSteps to the functional testing in Ready! API
6+
This plugin adds four TestSteps to the functional testing in Ready! API
77
* one for publishing messages to an websocket server
88
* one for receiving (and asserting) messages
9-
* and one for dropping connections
9+
* one for dropping connections
10+
* and one for only opening connections
1011

1112
It integrates fully with all other Ready! API features like property expansion, property transfers, data-driven testing, etc.
1213

@@ -17,9 +18,9 @@ Thanks to the original authors.
1718

1819
This plugin is compatible and works with:
1920
* SoapUI 5.2.x
20-
* Ready! API 1.4.x
21+
* Ready! API 1.4.x and 1.5.x
2122

22-
If you like to run an unsigned version in SoapUI OS >= 5.2.1 you have to install [SoapUI PluginLoader Jailbreak](https://github.com/hschott/soapui-pluginloader-jailbreak).
23+
If you like to run an unsigned plugin in SoapUI OS equal to or higher than 5.2.1 you have to install [SoapUI PluginLoader Jailbreak](https://github.com/hschott/soapui-pluginloader-jailbreak).
2324

2425

2526
### Install in SoapUI
@@ -33,11 +34,12 @@ Install the plugin via the Plugin Manager inside Ready! API. Please read [Ready!
3334

3435
## Websocket Test Steps
3536

36-
This plugin allows publish messages to websocket servers and receive messages from them. It adds 3 new test steps:
37+
This plugin allows publish messages to websocket servers and receive messages from them. It adds 4 different test steps:
3738

3839
* Publish using Websockets – to publish a message
3940
* Receive Websockets Message – to receive a message
4041
* Drop Websocket connection – to close or terminate a connection with websocket server
42+
* Open Websocket connection – to only open a connection with websocket server
4143

4244
### Lifetime of Websocket connections
4345

@@ -103,7 +105,7 @@ This dialog allows you to manage all connections used for the current project.
103105

104106
### Publish using Websockets
105107

106-
This test step publishes a message on the selected server.
108+
This test step publishes a message on the selected server.
107109

108110
<img width="573" alt="publish message" src="https://cloud.githubusercontent.com/assets/4548589/10111462/813c2c42-63d4-11e5-8b11-104800eb8274.png">
109111

@@ -211,4 +213,20 @@ You can choose one of these methods:
211213
* 'Send Protocol Error message' - Send status code `1002` and status reason `drop connection test step` message to the websocket server
212214

213215

216+
### Open Websocket Connection
217+
218+
This test step only connects to the websocket server which is useful if you are testing scenarios in which connections should be created before any other none websocket test step.
219+
220+
**Connection**
221+
222+
Choose the websocket server or select `<New Connection…>` to create a new connection for this test step.
223+
224+
**Configure**
225+
226+
Click this button if you wish to customize the connection selected for this test step. The 'Configure Connection' dialog will appear.
227+
228+
**Timeout**
229+
230+
The test step will fail if a connection could not be established within a specified period.
231+
214232

artwork/html5-connectivity.xcf

75.1 KB
Binary file not shown.

ready-websocket-plugin-soapui-project.xml

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
<?xml version="1.0" encoding="UTF-8"?>
2-
<con:soapui-project id="5e871d76-59b2-469f-8b50-884412b8247e" activeEnvironment="Default" name="ready-websocket-plugin" resourceRoot="" soapui-version="5.2.0" abortOnError="false" runType="SEQUENTIAL" xmlns:con="http://eviware.com/soapui/config"><con:settings><con:setting id="WebSocketConnections"><![CDATA[<xml-fragment>
2+
<con:soapui-project id="5e871d76-59b2-469f-8b50-884412b8247e" activeEnvironment="Default environment" name="ready-websocket-plugin" resourceRoot="" soapui-version="6.0.0" abortOnError="false" runType="SEQUENTIAL" xmlns:con="http://eviware.com/soapui/config"><con:settings><con:setting id="WebSocketConnections"><![CDATA[<xml-fragment>
33
<Connection>
44
<Name>sample echo</Name>
55
<ServerURI>ws://websocket-hschott.rhcloud.com:8000/echo/websocket</ServerURI>
@@ -60,12 +60,12 @@
6060
</con:configuration>
6161
</assertion></con:config></con:testStep><con:testStep type="WebsocketDropConnectionTestStep" name="Drop Websocket Connection" id="b1b78f5a-45e1-4ffe-b3a2-87cfa3bbf858"><con:settings/><con:config><ConnectionName>echo.websocket.org</ConnectionName><Timeout>30000</Timeout><TimeoutMeasure>Seconds</TimeoutMeasure><DropMethod>SendDisconnect</DropMethod></con:config></con:testStep><con:properties/><con:reportParameters/><con:breakPoints><con:testStepId>c627ec6b-68fa-4ea5-a00a-f797a9394029</con:testStepId><con:status>NONE</con:status><con:properties/></con:breakPoints><con:breakPoints><con:testStepId>544deb0f-4897-42d0-b1d6-eb1e3373956c</con:testStepId><con:status>NONE</con:status><con:properties/></con:breakPoints><con:breakPoints><con:testStepId>b1b78f5a-45e1-4ffe-b3a2-87cfa3bbf858</con:testStepId><con:status>NONE</con:status><con:properties/></con:breakPoints></con:testCase><con:testCase id="e5456773-8f37-40f1-ac52-26666c03e77c" failOnError="true" failTestCaseOnErrors="true" keepSession="false" maxResults="0" name="sample echo" searchProperties="true"><con:settings/><con:testStep type="websocketPublishTestStep" name="Publish using Websocket" id="63fc5f29-f33a-46de-869c-53a3b91e85b8"><con:settings/><con:config><ConnectionName>sample echo</ConnectionName><Timeout>10000</Timeout><TimeoutMeasure>Seconds</TimeoutMeasure><MessageKind>Text</MessageKind><Message>${=UUID.randomUUID().toString()}</Message></con:config></con:testStep><con:testStep type="WebsocketReceiveTestStep" name="Receive Websocket Message" id="7fe1de57-583b-4a35-8512-82f809bfa87c"><con:settings/><con:config><ConnectionName>sample echo</ConnectionName><Timeout>10000</Timeout><TimeoutMeasure>Seconds</TimeoutMeasure><ExpectedMessageType>Text</ExpectedMessageType><MaxMessageCount>0</MaxMessageCount><assertion type="Simple Contains" id="86361834-f58b-40da-af2f-9ea6b3ba1f9b" name="Contains">
6262
<con:configuration><token>[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}</token><ignoreCase>false</ignoreCase><useRegEx>true</useRegEx></con:configuration>
63-
</assertion></con:config></con:testStep><con:testStep type="WebsocketDropConnectionTestStep" name="Drop Websocket Connection" id="8a9ac491-000d-4f7c-9a5e-8f8d84bc8564"><con:settings/><con:config><ConnectionName>sample echo</ConnectionName><Timeout>30000</Timeout><TimeoutMeasure>Seconds</TimeoutMeasure><DropMethod>SendDisconnect</DropMethod></con:config></con:testStep><con:loadTest id="ee97b7cc-bd56-4b76-a0a6-722ab8d64c94" name="LoadTest 1"><con:settings><con:setting id="HttpSettings@close-connections">false</con:setting></con:settings><con:threadCount>5</con:threadCount><con:startDelay>0</con:startDelay><con:sampleInterval>250</con:sampleInterval><con:calculateTPSOnTimePassed>true</con:calculateTPSOnTimePassed><con:resetStatisticsOnThreadCountChange>true</con:resetStatisticsOnThreadCountChange><con:historyLimit>0</con:historyLimit><con:testLimit>30</con:testLimit><con:limitType>TIME</con:limitType><con:loadStrategy><con:type>Simple</con:type><con:config><testDelay>100</testDelay><randomFactor>1.0</randomFactor></con:config></con:loadStrategy><con:assertion type="Step Status" name="Step Status"/><con:maxAssertionErrors>100</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:updateStatisticsPerTestStep>false</con:updateStatisticsPerTestStep></con:loadTest><con:properties/><con:reportParameters/><con:breakPoints><con:testStepId>8d6b38b9-7a09-43d4-8d17-04e6e4e62333</con:testStepId><con:status>NONE</con:status><con:properties/></con:breakPoints><con:breakPoints><con:testStepId>5e20ce24-91ec-4af1-b3be-5b881fd2debb</con:testStepId><con:status>NONE</con:status><con:properties/></con:breakPoints></con:testCase><con:testCase id="e5bf9b66-fccb-43bd-a901-ca09ba8f865e" failOnError="true" failTestCaseOnErrors="true" keepSession="false" maxResults="0" name="sample stream" searchProperties="true"><con:settings/><con:testStep type="WebsocketReceiveTestStep" name="Receive Websocket Message" id="b683e840-e961-4ee6-9915-beb5c7d06a80"><con:settings/><con:config><ConnectionName>sample stream</ConnectionName><Timeout>0</Timeout><TimeoutMeasure>Seconds</TimeoutMeasure><ExpectedMessageType>BinaryData</ExpectedMessageType><MaxMessageCount>0</MaxMessageCount><assertion type="Simple Contains" id="bd55144b-a7e6-4918-9cc7-0abbc858bc59" name="Contains">
63+
</assertion></con:config></con:testStep><con:testStep type="WebsocketDropConnectionTestStep" name="Drop Websocket Connection" id="8a9ac491-000d-4f7c-9a5e-8f8d84bc8564"><con:settings/><con:config><ConnectionName>sample echo</ConnectionName><Timeout>30000</Timeout><TimeoutMeasure>Seconds</TimeoutMeasure><DropMethod>SendDisconnect</DropMethod></con:config></con:testStep><con:loadTest id="ee97b7cc-bd56-4b76-a0a6-722ab8d64c94" name="LoadTest 1"><con:settings><con:setting id="HttpSettings@close-connections">false</con:setting></con:settings><con:threadCount>5</con:threadCount><con:startDelay>0</con:startDelay><con:sampleInterval>250</con:sampleInterval><con:calculateTPSOnTimePassed>true</con:calculateTPSOnTimePassed><con:resetStatisticsOnThreadCountChange>true</con:resetStatisticsOnThreadCountChange><con:historyLimit>0</con:historyLimit><con:testLimit>30</con:testLimit><con:limitType>TIME</con:limitType><con:loadStrategy><con:type>Simple</con:type><con:config><testDelay>100</testDelay><randomFactor>1.0</randomFactor></con:config></con:loadStrategy><con:assertion type="Step Status" name="Step Status"/><con:maxAssertionErrors>100</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:updateStatisticsPerTestStep>false</con:updateStatisticsPerTestStep><con:reportParameters/></con:loadTest><con:properties/><con:reportParameters/><con:breakPoints><con:testStepId>8d6b38b9-7a09-43d4-8d17-04e6e4e62333</con:testStepId><con:status>NONE</con:status><con:properties/></con:breakPoints><con:breakPoints><con:testStepId>5e20ce24-91ec-4af1-b3be-5b881fd2debb</con:testStepId><con:status>NONE</con:status><con:properties/></con:breakPoints></con:testCase><con:testCase id="e5bf9b66-fccb-43bd-a901-ca09ba8f865e" failOnError="true" failTestCaseOnErrors="true" keepSession="false" maxResults="0" name="sample stream" searchProperties="true"><con:settings/><con:testStep type="WebsocketReceiveTestStep" name="Receive Websocket Message" id="b683e840-e961-4ee6-9915-beb5c7d06a80"><con:settings/><con:config><ConnectionName>sample stream</ConnectionName><Timeout>0</Timeout><TimeoutMeasure>Seconds</TimeoutMeasure><ExpectedMessageType>BinaryData</ExpectedMessageType><MaxMessageCount>0</MaxMessageCount><assertion type="Simple Contains" id="bd55144b-a7e6-4918-9cc7-0abbc858bc59" name="Contains">
6464
<con:configuration><token>4301</token><ignoreCase>false</ignoreCase><useRegEx>false</useRegEx></con:configuration>
6565
</assertion></con:config></con:testStep><con:properties/><con:reportParameters/><con:breakPoints><con:testStepId>8d6b38b9-7a09-43d4-8d17-04e6e4e62333</con:testStepId><con:status>NONE</con:status><con:properties/></con:breakPoints><con:breakPoints><con:testStepId>5e20ce24-91ec-4af1-b3be-5b881fd2debb</con:testStepId><con:status>NONE</con:status><con:properties/></con:breakPoints></con:testCase><con:testCase id="d1c89c6d-99a6-4dbd-8142-c65870fe1bad" failOnError="true" failTestCaseOnErrors="true" keepSession="false" maxResults="0" name="sample hello" searchProperties="true"><con:settings/><con:testStep type="WebsocketReceiveTestStep" name="Receive Websocket Message" id="92143b19-63f7-4a7a-a3e9-928cc10b5009"><con:settings/><con:config><ConnectionName>sample hello</ConnectionName><Timeout>1000</Timeout><TimeoutMeasure>Seconds</TimeoutMeasure><ExpectedMessageType>Text</ExpectedMessageType><assertion type="Simple Contains" id="d84495ec-89ba-482b-a87e-7335a9b8279c" name="Contains">
6666
<con:configuration>
6767
<token>Hello world!</token>
6868
<ignoreCase>false</ignoreCase>
6969
<useRegEx>false</useRegEx>
7070
</con:configuration>
71-
</assertion></con:config></con:testStep><con:properties/><con:reportParameters/><con:breakPoints><con:testStepId>8d6b38b9-7a09-43d4-8d17-04e6e4e62333</con:testStepId><con:status>NONE</con:status><con:properties/></con:breakPoints><con:breakPoints><con:testStepId>5e20ce24-91ec-4af1-b3be-5b881fd2debb</con:testStepId><con:status>NONE</con:status><con:properties/></con:breakPoints></con:testCase><con:testCase id="7ace7571-b1c5-40a0-b94e-1d2b0188e032" failOnError="true" failTestCaseOnErrors="true" keepSession="false" maxResults="0" name="sample code" searchProperties="true"><con:settings/><con:testStep type="websocketPublishTestStep" name="Publish using Websocket" id="e805a2bc-e7db-4adc-9884-6d3f02adb11c"><con:settings/><con:config><ConnectionName>sample code</ConnectionName><Timeout>1000</Timeout><TimeoutMeasure>Seconds</TimeoutMeasure><MessageKind>IntegerValue</MessageKind><Message>1006</Message></con:config></con:testStep><con:testStep type="WebsocketReceiveTestStep" name="Receive Websocket Message" id="2eecdb9f-4808-4409-a4c2-c53e434cb98a"><con:settings/><con:config><ConnectionName>sample code</ConnectionName><Timeout>1000</Timeout><TimeoutMeasure>Seconds</TimeoutMeasure><ExpectedMessageType>BinaryData</ExpectedMessageType></con:config></con:testStep><con:properties/></con:testCase><con:properties/></con:testSuite><con:properties/><con:wssContainer/><con:oAuth2ProfileContainer/><con:sensitiveInformation/></con:soapui-project>
71+
</assertion></con:config></con:testStep><con:properties/><con:reportParameters/><con:breakPoints><con:testStepId>8d6b38b9-7a09-43d4-8d17-04e6e4e62333</con:testStepId><con:status>NONE</con:status><con:properties/></con:breakPoints><con:breakPoints><con:testStepId>5e20ce24-91ec-4af1-b3be-5b881fd2debb</con:testStepId><con:status>NONE</con:status><con:properties/></con:breakPoints></con:testCase><con:testCase id="7ace7571-b1c5-40a0-b94e-1d2b0188e032" failOnError="true" failTestCaseOnErrors="true" keepSession="false" maxResults="0" name="sample code" searchProperties="true"><con:settings/><con:testStep type="websocketPublishTestStep" name="Publish using Websocket" id="e805a2bc-e7db-4adc-9884-6d3f02adb11c"><con:settings/><con:config><ConnectionName>sample code</ConnectionName><Timeout>1000</Timeout><TimeoutMeasure>Seconds</TimeoutMeasure><MessageKind>IntegerValue</MessageKind><Message>1006</Message></con:config></con:testStep><con:testStep type="WebsocketReceiveTestStep" name="Receive Websocket Message" id="2eecdb9f-4808-4409-a4c2-c53e434cb98a"><con:settings/><con:config><ConnectionName>sample code</ConnectionName><Timeout>1000</Timeout><TimeoutMeasure>Seconds</TimeoutMeasure><ExpectedMessageType>BinaryData</ExpectedMessageType></con:config></con:testStep><con:properties/><con:reportParameters/></con:testCase><con:properties/><con:reportParameters/></con:testSuite><con:properties/><con:wssContainer/><con:databaseConnectionContainer/><con:oAuth2ProfileContainer/><con:reporting><con:xmlTemplates/><con:parameters/></con:reporting><con:sensitiveInformation/><con:authRepository/></con:soapui-project>

src/main/java/com/tsystems/readyapi/plugin/websocket/DropConnectionTestStep.java

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@
1616
import com.eviware.soapui.support.xml.XmlObjectConfigurationReader;
1717

1818
@PluginTestStep(typeName = "WebsocketDropConnectionTestStep", name = "Drop Websocket Connection",
19-
description = "Disconnects from the websocket server", iconPath = "com/smartbear/assets/drop_step.png")
19+
description = "Disconnects from the websocket server", iconPath = "com/tsystems/readyapi/plugin/websocket/drop_step.png")
2020
public class DropConnectionTestStep extends ConnectedTestStep {
2121
private static final String DROP_METHOD_SETTING_NAME = "DropMethod";
2222

@@ -120,11 +120,11 @@ public DropMethod getDropMethod() {
120120
}
121121

122122
protected void initIcons() {
123-
unknownStepIcon = UISupport.createImageIcon("com/smartbear/assets/unknown_drop_step.png");
124-
disabledStepIcon = UISupport.createImageIcon("com/smartbear/assets/disabled_drop_step.png");
123+
unknownStepIcon = UISupport.createImageIcon("com/tsystems/readyapi/plugin/websocket/unknown_drop_step.png");
124+
disabledStepIcon = UISupport.createImageIcon("com/tsystems/readyapi/plugin/websocket/disabled_drop_step.png");
125125

126-
iconAnimator = new IconAnimator<DropConnectionTestStep>(this, "com/smartbear/assets/unknown_drop_step.png",
127-
"com/smartbear/assets/drop_step.png", 5);
126+
iconAnimator = new IconAnimator<DropConnectionTestStep>(this, "com/tsystems/readyapi/plugin/websocket/unknown_drop_step.png",
127+
"com/tsystems/readyapi/plugin/websocket/drop_step.png", 5);
128128
}
129129

130130
@Override

src/main/java/com/tsystems/readyapi/plugin/websocket/PublishTestStep.java

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@
2121

2222
@PluginTestStep(typeName = "websocketPublishTestStep", name = "Publish using Websocket",
2323
description = "Publishes a specified message through websocket protocol.",
24-
iconPath = "com/smartbear/assets/publish_step.png")
24+
iconPath = "com/tsystems/readyapi/plugin/websocket/publish_step.png")
2525
public class PublishTestStep extends ConnectedTestStep {
2626

2727
private final static String MESSAGE_KIND_SETTING_NAME = "MessageKind";
@@ -191,11 +191,11 @@ public PublishedMessageType getMessageKind() {
191191
}
192192

193193
protected void initIcons() {
194-
unknownStepIcon = UISupport.createImageIcon("com/smartbear/assets/unknown_publish_step.png");
195-
disabledStepIcon = UISupport.createImageIcon("com/smartbear/assets/disabled_publish_step.png");
194+
unknownStepIcon = UISupport.createImageIcon("com/tsystems/readyapi/plugin/websocket/unknown_publish_step.png");
195+
disabledStepIcon = UISupport.createImageIcon("com/tsystems/readyapi/plugin/websocket/disabled_publish_step.png");
196196

197-
iconAnimator = new IconAnimator<PublishTestStep>(this, "com/smartbear/assets/unknown_publish_step.png",
198-
"com/smartbear/assets/publish_step.png", 5);
197+
iconAnimator = new IconAnimator<PublishTestStep>(this, "com/tsystems/readyapi/plugin/websocket/unknown_publish_step.png",
198+
"com/tsystems/readyapi/plugin/websocket/publish_step.png", 5);
199199
}
200200

201201
@Override

src/main/java/com/tsystems/readyapi/plugin/websocket/ReceiveTestStep.java

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -54,7 +54,7 @@
5454

5555
@PluginTestStep(typeName = "WebsocketReceiveTestStep", name = "Receive Websocket Message",
5656
description = "Waits for a Websocket message of a specific topic.",
57-
iconPath = "com/smartbear/assets/receive_step.png")
57+
iconPath = "com/tsystems/readyapi/plugin/websocket/receive_step.png")
5858
public class ReceiveTestStep extends ConnectedTestStep implements Assertable {
5959
private final static Logger LOGGER = Logger.getLogger(PluginConfig.LOGGER_NAME);
6060

@@ -408,13 +408,13 @@ private void initAssertions(TestStepConfig testStepData) {
408408
}
409409

410410
protected void initIcons() {
411-
validStepIcon = UISupport.createImageIcon("com/smartbear/assets/valid_receive_step.png");
412-
failedStepIcon = UISupport.createImageIcon("com/smartbear/assets/invalid_receive_step.png");
413-
unknownStepIcon = UISupport.createImageIcon("com/smartbear/assets/unknown_receive_step.png");
414-
disabledStepIcon = UISupport.createImageIcon("com/smartbear/assets/disabled_receive_step.png");
411+
validStepIcon = UISupport.createImageIcon("com/tsystems/readyapi/plugin/websocket/valid_receive_step.png");
412+
failedStepIcon = UISupport.createImageIcon("com/tsystems/readyapi/plugin/websocket/invalid_receive_step.png");
413+
unknownStepIcon = UISupport.createImageIcon("com/tsystems/readyapi/plugin/websocket/unknown_receive_step.png");
414+
disabledStepIcon = UISupport.createImageIcon("com/tsystems/readyapi/plugin/websocket/disabled_receive_step.png");
415415

416-
iconAnimator = new IconAnimator<ReceiveTestStep>(this, "com/smartbear/assets/receive_step_base.png",
417-
"com/smartbear/assets/receive_step.png", 5);
416+
iconAnimator = new IconAnimator<ReceiveTestStep>(this, "com/tsystems/readyapi/plugin/websocket/receive_step_base.png",
417+
"com/tsystems/readyapi/plugin/websocket/receive_step.png", 5);
418418
}
419419

420420
@Override

0 commit comments

Comments
 (0)