Browse the Knowledge Hub211 resources

SoapUI review: what it is, tutorial, pros and cons
SoapUI Open Source is a desktop tool for functional testing of SOAP and REST APIs, building test suites from WSDL and OpenAPI definitions, with assertions, Groovy scripting, mock services and basic load and security tests. SmartBear maintains it under the EUPL and sells ReadyAPI as the commercial successor. The current release is 5.10.0, from 2 June 2026.
QAble has evaluated this tool and works alongside it. The factual sections are complete; our view is bounded to what we have actually seen rather than a long-term verdict.
- last reviewed
- 13 October 2026
- version covered
- SoapUI Open Source 5.10
- licence
- Open source
At a glance
SoapUI at a glance
- Vendor
- SmartBear
- Category
- API testing
- Licence
- Open source (EUPL 1.1, with ReadyAPI as the commercial edition)
- Platforms
- Windows, macOS, Linux
- Languages
- Groovy
- Integrates with
- Maven, Jenkins, ReadyAPI
- First released
- 2005
- Version reviewed
- SoapUI Open Source 5.10
Verdict
Our verdict on SoapUI
Strengths
- Generates requests and test steps for every operation from a WSDL, including complex nested types
- WS-Security, namespaces and XPath assertions are handled in the tool rather than by hand
- Mock services generated from a WSDL stand in for providers that do not exist yet
- Groovy scripts and script assertions reach the whole object model when point-and-click runs out
- Command line testrunner and an official Docker image run suites in any CI system
- Open source under the EUPL and free for any use
Weaknesses
- Whole projects are single XML files, which diff and merge poorly in Git
- DataSource data-driven tests, reporting and command line environments are ReadyAPI features
- Heavy desktop application; the interface feels dated next to modern API clients
- Releases are infrequent and mostly maintenance, so new protocol support arrives slowly
Our take
SoapUI remains a sensible choice for SOAP-heavy integration work: it reads a WSDL, generates requests and mock services for every operation, handles WS-Security, and asserts with XPath against namespaced XML in ways the REST-oriented clients do not attempt. QAble has evaluated it rather than maintained a long-running suite on it, so treat this as a bounded take. For a REST-only API there is little reason to start here; Postman, Bruno or a code library will be lighter. Two things to know before committing: the open source edition changes slowly, with recent releases mostly security and installer updates, and several conveniences people associate with SoapUI, including DataSource data-driven tests, environments on the command line and reporting, are ReadyAPI features.
We have evaluated this tool rather than maintained a long-running suite on it, so this is a bounded view rather than a long-term verdict. The rest of this page is factual.
How it works
What is SoapUI and how does it work?
Projects built from service definitions
A SoapUI project starts from a WSDL or an OpenAPI definition, or from requests added by hand. From a WSDL, SoapUI creates an interface with every operation and a sample request whose XML follows the schema, which is the main reason it is still used for SOAP: building correct envelopes for large enterprise schemas by hand is slow and error-prone. Under the interfaces sit test suites, test cases and test steps, such as requests, property transfers, Groovy scripts and delays, each with its own assertions. The whole project, including tests and mocks, is saved as one XML file.
Assertions and property expansion
Each request step carries assertions: Contains and Not Contains, XPath Match and XQuery Match, Schema Compliance against the WSDL, SOAP Fault and Not SOAP Fault, valid HTTP status codes, WS-Security Status, Response SLA and Script Assertion written in Groovy. Values move between steps with property transfers or through property expansion, a syntax such as ${#Project#baseUrl} or ${#TestCase#orderId} that is resolved when the step runs. Properties live at global, project, test suite, test case and step level. This makes multi-step flows possible without code, at the cost of logic being spread across many dialogs rather than visible in one file.
Groovy as the escape hatch
When the built-in steps are not enough, Groovy Script steps and script assertions can do almost anything. Script steps receive testRunner, context and log, and can read or set properties anywhere in the project; script assertions receive messageExchange, context and log, but not testRunner, so they reach the project through messageExchange.modelItem. Groovy has access to SoapUI’s own Java classes, such as GroovyUtils and XmlHolder for XPath work. This power is also the risk: large suites accumulate scripts that only their author understands, stored inside the project XML.
Running without the interface
The installation includes testrunner.sh and testrunner.bat, which run a project file from the command line. Options select the test suite and test case, override the endpoint, set project and global properties, print a summary, export JUnit-compatible reports and choose the results folder. Some options documented on the same page, including -E for environments and the PDF and custom report options, require ReadyAPI. SmartBear also publishes the smartbear/soapuios-testrunner Docker image, which mounts a project folder and runs the testrunner with arguments from an environment variable, so CI agents need no desktop installation.
Strengths
What it does well
SOAP and WSDL depth
SoapUI handles the parts of SOAP that general API clients skip: generating envelopes from schemas, multiple WSDL interfaces in one project, WS-Security configuration and status assertions, and schema compliance assertions against the WSDL. For banking, insurance, telecoms and government integrations built on SOAP, this saves real time.
Mock services for both SOAP and REST
A mock service can be generated from a WSDL with a response per operation, then customised with property expansion or scripts and dispatch rules that pick a response by request content. Teams use mocks to test consumers before a provider exists, or to simulate faults that are hard to trigger in a real system.
Functional tests reused for load and security checks
The open source edition can turn a functional test case into a basic load test with predefined strategies and performance assertions, and run security scans such as SQL injection and XML bomb against requests. These are useful early warnings rather than replacements for dedicated load or security tools.
GraphQL and OpenAPI support
Release 5.7.0 added a GraphQL request test step and built-in OpenAPI support without plugins, and 5.8.0 updated the GraphQL library. A team with mixed SOAP, REST and GraphQL services can keep them in one project and one CI job.
Command line and Docker execution
testrunner exports JUnit-compatible XML, so any CI server can show results, and the Docker image returns distinct exit codes when the project is missing or a test run fails. That is enough to gate a pipeline on a SoapUI suite without ReadyAPI.
Pricing
SoapUI pricing and licensing
SoapUI Open Source is free under the European Union Public Licence, with no paid tier of its own. SmartBear’s commercial product is ReadyAPI, sold as modules for API functional testing, performance, virtualisation and parallel execution through TestEngine. ReadyAPI pricing is not published as list prices; SmartBear describes customisable plans and offers a free trial, so cost depends on the modules and licences you negotiate.
- Licence: EUPL version 1.1 or later, stated in the SoapUI repository. Free for commercial use.
- Open source edition: functional tests, mocks, basic load tests, security scans, Groovy scripting and the command line testrunner, with no feature limits by user or run.
- ReadyAPI: commercial modules adding features such as DataSource data-driven testing, test debugging, reporting and analytics, environment switching on the command line and REST discovery.
- Pricing model: ReadyAPI is quoted rather than listed on SmartBear’s pricing page, with a free trial available.
- Hidden costs: desktop installs for every author, merge pain from single-file XML projects, and Groovy scripts that need someone to maintain them.
Checked against the vendor’s own pages on 13 October 2026. Pricing changes; confirm on the official site before buying.
Getting started
SoapUI tutorial: getting started
Setup, step by step
- Download SoapUI Open Source 5.10 for Windows, macOS or Linux from soapui.org; it bundles its own Java runtime.
- Create a SOAP project from the service’s WSDL URL or file, and let SoapUI generate sample requests.
- Fill in one request, send it, and confirm the response in the XML or JSON view.
- Generate a test suite from the interface, then add assertions such as SOAP Response, Schema Compliance and XPath Match.
- Store the endpoint as a project property and reference it with property expansion.
- Save the project and run it with testrunner.sh to confirm it passes outside the interface.
Install
# after installing SoapUI, run a project from the command line
"<SoapUI install dir>/bin/testrunner.sh" -s"Orders" -r -j -f"reports" orders-soapui-project.xml
# or with the official Docker image
docker pull smartbear/soapuios-testrunner:5.10.0A first example
// Script assertion on a SOAP request step: check a namespaced value with XPath
import com.eviware.soapui.support.XmlHolder
def holder = new XmlHolder(messageExchange.responseContentAsXml)
holder.declareNamespace('ord', 'http://example.com/orders/v1')
def status = holder.getNodeValue('//ord:CreateOrderResponse/ord:Status')
def lines = holder.getNodeValues('//ord:CreateOrderResponse/ord:Line')
assert status == 'ACCEPTED' : "Unexpected status: ${status}"
assert lines.size() == 2
assert messageExchange.timeTaken < 2000 : 'Response slower than 2 seconds'
// Script assertions get messageExchange, context and log, but not testRunner
log.info "Order accepted with ${lines.size()} lines"What trips people up first
Namespaces. An XPath such as //Status returns nothing against a SOAP response because every element sits in a namespace, so the first XPath Match assertion fails for no visible reason. Declare each namespace the response uses, in the XPath Match assertion or in scripts with XmlHolder.declareNamespace, and use the prefix in every step of the path. The second hurdle is endpoints: requests generated from a WSDL point at the address inside the WSDL, so set a project property for the base endpoint and override it with -e on the command line.
In practice
Using SoapUI in practice
Structuring projects for a team
Because a project is one XML file, structure matters more than in most tools. Keep one project per service or integration, not one per team, so the file stays small enough to review. Organise test suites by business capability and keep test cases independent, each creating or looking up its own data. Hold endpoints, credentials and environment-specific values in project properties, never inside requests, and override them with -P on the command line so the same file runs against every environment without ReadyAPI’s environment feature. Agree that one person merges changes to a project at a time, or split large projects, because concurrent edits to the same XML file conflict badly.
Script assertions for JSON and REST services
For REST responses, Contains and status assertions cover simple checks. When an assertion needs logic, such as totals matching line items or every element having a valid status, a short script assertion with Groovy’s JsonSlurper is clearer than chaining several dialogs. Keep scripts focused on one rule, name the assertion after that rule so the failure explains itself in reports, and read configuration with context.expand rather than hard-coding values. Put a failure message on each assert, because the message is what appears in the JUnit report when the suite runs in CI.
// Script assertion on a REST request step
import groovy.json.JsonSlurper
def order = new JsonSlurper().parseText(messageExchange.responseContent)
def maxTotal = context.expand('${#Project#maxOrderTotal}') as BigDecimal
assert order.lines.every { it.quantity > 0 } : 'Every line needs a positive quantity'
def sum = order.lines.sum { (it.unitPrice as BigDecimal) * it.quantity }
assert (order.total as BigDecimal) == sum : "Total ${order.total} does not equal ${sum}"
assert (order.total as BigDecimal) <= maxTotalRunning SoapUI in GitHub Actions
The official testrunner image keeps CI agents free of a desktop installation. Mount the folder holding the project, mount a folder for reports, and pass testrunner arguments through COMMAND_LINE, using %project% and %reports% to refer to the mounted volumes. Use -j for JUnit-compatible XML so the CI server shows results, -P to inject environment-specific properties from secrets, and -e to point requests at the right endpoint. The image’s documented examples use -it, which needs a terminal; on hosted runners, drop it so the container runs non-interactively.
# .github/workflows/soapui.yml
name: soapui
on: [push, pull_request]
jobs:
functional:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v7
- name: Run the Orders project
run: |
mkdir -p reports
docker run --rm \
-v "$PWD/soapui":/project \
-v "$PWD/reports":/reports \
-e COMMAND_LINE="-j -r -f/%reports% -e${{ vars.ORDERS_ENDPOINT }} -PapiKey=${{ secrets.ORDERS_API_KEY }} '/%project%/orders-soapui-project.xml'" \
smartbear/soapuios-testrunner:5.10.0
- uses: actions/upload-artifact@v7
if: always()
with:
name: soapui-reports
path: reports/Version control and keeping suites maintainable
Commit the project XML, but treat it as generated output that people edit through the tool: review changes by running the suite and reading the test names and assertions in SoapUI, not by reading the diff alone. Keep shared Groovy logic small and documented at the top of each script, and prefer built-in assertions where they suffice, since they are visible in the interface and in reports. Version 5.8.0 added AES-256 project encryption, which protects credentials in the file but also makes diffs unreadable, so use it only for projects that must hold secrets. Upgrade deliberately: read the release notes, which for recent versions are mostly library and security updates, and rerun the suite on the new version before switching CI.
Pitfalls
Common pitfalls
XPath assertions that never match
Why it happens: SOAP responses are namespaced, so an XPath without prefixes, such as //Status, finds nothing even when the element is visibly present.
The fix: Declare the namespaces in the XPath Match assertion or with XmlHolder.declareNamespace in scripts, and prefix every element in the path.
Using -E for environments with the open source testrunner
Why it happens: The command line page documents -E, but it is marked as a ReadyAPI option, along with the PDF and custom report options. The open source runner does not support it.
The fix: Hold environment values in project properties and set them with -P, and override the endpoint with -e.
Merge conflicts in the project file
Why it happens: The whole project, including every test and mock, is one XML file, so two people editing different tests still change the same file.
The fix: Split large projects by service, keep one editor per project at a time, and pull before opening the project in SoapUI.
Following the Maven plugin documentation
Why it happens: The open source Maven plugin page still shows plugin version 4.6.1 and an http repository URL, which modern Maven setups reject or which predate current releases.
The fix: Run the testrunner from the installation or the official Docker image in CI instead, which tracks each release.
Expecting DataSource loops in the open source edition
Why it happens: SoapUI’s own feature page describes DataSource data-driven testing as a ReadyAPI feature. Tutorials written for ReadyAPI use it freely.
The fix: In the open source edition, drive iterations with a Groovy script step that reads a file and sets properties, or move data-heavy suites to a tool with built-in parameterisation.
Script assertions that reference testRunner
Why it happens: testRunner exists only in Groovy Script steps. Script assertions receive messageExchange, context and log, so code copied from a script step fails.
The fix: Reach the test case through messageExchange.modelItem.testStep.testCase, or read properties with context.expand.
Compared
How SoapUI compares
| Tool | SOAP and WSDL | Test authoring | CI execution | Data-driven tests | Licence |
|---|---|---|---|---|---|
| SoapUI | Generates requests and mocks from WSDL | Desktop interface plus Groovy | testrunner or official Docker image | DataSource step is ReadyAPI only | EUPL; ReadyAPI is commercial |
| Postman | Raw XML requests over HTTP | Desktop or web app plus JavaScript | Postman CLI | CSV or JSON iteration data | Proprietary, freemium |
| REST Assured | XML bodies with XmlPath, no WSDL tooling | Java code | Maven or Gradle test run | JUnit or TestNG parameterised tests | Apache 2.0 |
| Karate | SOAP requests with XML match | Feature files with embedded JavaScript | JUnit runner or standalone CLI | Scenario Outline examples tables | MIT, commercial add-ons |
FAQ
Frequently asked questions
Is SoapUI free?
SoapUI Open Source is free under the European Union Public Licence, including for commercial use, with functional tests, mocks, basic load tests, security scans, Groovy scripting and the command line runner. SmartBear’s commercial product is ReadyAPI, sold as modules for functional testing, performance, virtualisation and parallel execution, with pricing by quote and a free trial. Many teams use the free edition for years without needing ReadyAPI.
What is the difference between SoapUI and ReadyAPI?
ReadyAPI is SmartBear’s commercial API testing platform. SoapUI Open Source covers the core: projects from WSDL and OpenAPI, test suites, assertions, Groovy, mocks and the testrunner. ReadyAPI adds features such as DataSource data-driven testing, test debugging, reporting, environment switching on the command line, REST discovery, richer performance and virtualisation modules, and support.
Is SoapUI still maintained?
Yes, though slowly. SoapUI Open Source 5.10.0 was released on 2 June 2026, with updated macOS installers, library upgrades to resolve reported CVEs and usage analytics disabled. 5.8.0, in December 2024, moved the bundled runtime to Java 17 and added a native macOS ARM installer. Releases are mostly maintenance; new capabilities land in ReadyAPI first.
SoapUI or Postman for SOAP testing?
For SOAP, SoapUI is usually more productive: it reads the WSDL, generates correct envelopes for every operation, validates responses against the schema, handles WS-Security and generates mock services. Postman can send SOAP requests as raw XML and assert on the body with scripts, which is fine for a handful of calls. For a large SOAP estate with complex schemas, SoapUI saves considerable effort.
Can SoapUI run in CI?
Yes. testrunner.sh or testrunner.bat runs a project file headless, selecting suites and cases, overriding endpoints and properties, and exporting JUnit-compatible XML with -j. The official smartbear/soapuios-testrunner Docker image runs the same tool in a container, taking arguments through the COMMAND_LINE variable and returning distinct exit codes when the project is missing or tests fail.
Is SoapUI worth learning in 2026?
If your work involves SOAP services, yes: many enterprise integrations still run on SOAP, and SoapUI remains the most complete free tool for them. Its concepts, test suites, property transfers, XPath and schema assertions, transfer directly to ReadyAPI. If your APIs are REST and GraphQL only, time is better spent on a modern client such as Postman or Bruno and a code-based framework.
Alternatives
SoapUI alternatives worth weighing
Resources
Where to go next
Keep going
Prepare, or get it done
Picking the wrong tool costs more than picking late.
QAble advises on toolchain decisions and then implements them, with engineers who have run these tools on real delivery. Start with a free QA audit.