Scenario
So maybe you’ve built up some useful Groovy code for over time that you use again and again, spread across your projects, but would rather manage it from one place? If so, this recipe shows how you can create and import them via jar files so that you can reuse them from SoapUI objects like Groovy TestSteps, Setup/Teardown Scripts and Script Assertions.
Why bother?
- This way of packaging your Java/Groovy code promotes reuse and can ease the maintainability of your commonly used test code.
- It is possible to use these libraries to override existing SoapUI code/functionality i.e. create patches.
- Whilst various recipes in the SoapUI Cookbook show how to use prebuilt Java/Groovy libraries, I felt this was a valid recipe and building block in its own right.
TIP: Quick Start – People who already have a suitable Java/Groovy library and just want to know how to use it in SoapUI, can jump in at step #6
Prep
This recipe uses Groovy and Gradle (v2.12) to compile and package the example Groovy class as a jar file. If you haven’t got Gradle, please refer to http://www.groovy-lang.org/download.html and https://docs.gradle.org/current/userguide/installation.html
For mac/linux I used SDKMAN! (http://sdkman.io/) e.g.
sdk install gradle
sdk install groovy (This is optional, useful if you want to run some Groovy without SoapUI)
Steps
1.Create the following directory structure
soapuilib/src/main/groovy/custom
2.Get some Groovy code
For this example, I have knocked together a simple script to generate sequential ids. It may be of little practical use, but I wanted something with a simple public static method to call. Since the method is static, there will be no need to instantiate the class before calling it in step #8.
package custom
import java.util.concurrent.atomic.AtomicLong
public class SequentialIdGenerator {
public static final long counterSeed = 1000
public static final String prefix = "id"
private static AtomicLong counter = new AtomicLong(counterSeed)
public static String nextId() {
return prefix + counter.incrementAndGet()
}
}
- create the above script as a text file called SequentialIdGenerator.groovy
- copy it to soapuilib/src/main/groovy/custom
3.Create Gradle build script
For this part, there are plenty of options to build the code and package it, such as Maven, Ant or just running the right shell commands! The following minimal Gradle script allows us to compile and package the code as a jar in one easy statement.
apply plugin: 'groovy'
version = '1.0'
jar {
classifier = 'library'
manifest {
attributes 'Implementation-Title': 'SoapUI Sample Groovy Library', 'Implementation-Version': version
}
}
repositories {
mavenCentral()
}
dependencies {
compile 'org.codehaus.groovy:groovy:2.1.7' //Matches Groovy in SoapUI 5.2.1
}
- Create the above Gradle script as soapuilib/build.gradle
5.Compile it & Create jar file
Now we’re ready to use the Gradle script to compile the sample script from step #2 and package it as a jar file.
- Open a shell/command prompt at soapuilib/
- gradle clean build jar
You should then see output like:
tests-MacBook-Pro:soapuilib test$ gradle clean build jar
:clean
:compileJava UP-TO-DATE
:compileGroovy
:processResources UP-TO-DATE
:classes
:jar
:assemble
:compileTestJava UP-TO-DATE
:compileTestGroovy UP-TO-DATE
:processTestResources UP-TO-DATE
:testClasses UP-TO-DATE
:test UP-TO-DATE
:check UP-TO-DATE
:build
BUILD SUCCESSFUL
Total time: 5.499 secs
This build could be faster, please consider using the Gradle Daemon: https://docs.gradle.org/2.12/userguide/gradle_daemon.html
and our new library jar file created under the directory:
soapuilib/build/soapuilib-1.0-sample.jar
6.Add jar file to SoapUI
To make our new Groovy library jar available for use in SoapUI, it should be added in SoapUI Home under the following external library directory:
Or the Windows equivalent e.g. C:\Program Files\SmartBear\SoapUI-5.2.1\bin\ext
7.Verify jar file is imported
When SoapUI is restarted, you should see the following log entry indicating that the jar file has been successfully added to the SoapUI classpath:
8.Call the code
Our SequentialIdGenerator has a public static method nextId() that we can call, so to do this we can either import the class (Example 1) or just prefix the class with its package (Example 2). See below:
- Example 1 – Call from Groovy TestStep:
import custom.*
log.info SequentialIdGenerator.nextId()
Gives output like:
Thu May 12 16:49:20 BST 2016:INFO:id1001
- Example 2 – Call from Property Expansion:
${= custom.SequentialIdGenerator.nextId()}
More
This section may evolve over time e.g. include details of further use-cases and examples. Anything you’d like to see, please ask!
Links
No links yet.
Hi Rup,
Nice to your article, and I like it with gradle.
Just one comment, may be it will help if you can add the SoapUI version compatibility, because some people might still be on earlier to 5.x.
I believe that it will inspire more people and kick start to develop on their own.
Thanks for the feedback Rao, inspires me to write more blogs too! 🙂
Thats a fair point about the version, I will add some details at the beginning of the recipe when I get a chance.
Hi Rupert,
thanks for your article, especially handling different versions of Groovy.
Karel
You’re welcome Karel,
Thanks for reading it!
Hi, I posted a query in the SoapUI forum but though you are better positioned to answer this
—————–
I created a custom Groovy library to store some reusable functions and used them in the SoapUI tests. I observed a couple of limitations with this approach
– When an exception occurs in a function of the library, system does not show any details in output but will show the error log specific to groovy steps in the SoapUI test case
– Console output cannot be printed to SoapUI “Script Log”. e.g. using “println” in the groovy class
could you please provide your inputs and list any limitations you found.
Thank you
Regards,
Krish