View all services
Talk to QA Advisor
Browse the Knowledge Hub211 resources
Tools Library · Review and guide

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

Reviewed by Viral Patel

Co-Founder, QAbleLast reviewed 13 October 2026

At a glance

SoapUI at a glance

Official site
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

  1. Download SoapUI Open Source 5.10 for Windows, macOS or Linux from soapui.org; it bundles its own Java runtime.
  2. Create a SOAP project from the service’s WSDL URL or file, and let SoapUI generate sample requests.
  3. Fill in one request, send it, and confirm the response in the XML or JSON view.
  4. Generate a test suite from the interface, then add assertions such as SOAP Response, Schema Compliance and XPath Match.
  5. Store the endpoint as a project property and reference it with property expansion.
  6. 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.0

A 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) <= maxTotal

Running 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

ToolSOAP and WSDLTest authoringCI executionData-driven testsLicence
SoapUIGenerates requests and mocks from WSDLDesktop interface plus Groovytestrunner or official Docker imageDataSource step is ReadyAPI onlyEUPL; ReadyAPI is commercial
PostmanRaw XML requests over HTTPDesktop or web app plus JavaScriptPostman CLICSV or JSON iteration dataProprietary, freemium
REST AssuredXML bodies with XmlPath, no WSDL toolingJava codeMaven or Gradle test runJUnit or TestNG parameterised testsApache 2.0
KarateSOAP requests with XML matchFeature files with embedded JavaScriptJUnit runner or standalone CLIScenario Outline examples tablesMIT, 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

Ready

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.

Talk to QA Advisor