Functional Web Services Testing Made Easy with SoapUI - Part 3

Subtitle: 
SoapUI and Continuous Integration

In the first two parts(part 1 and part 2) of this series we have seen how to use SoapUI to write functional tests for web services and also how to use Groovy for test setup, properties transfer, and assertions. As we have already said, tests should be integrated with your builds and should be able to be run with them. If you have automated your builds and they are running as part of your continuous integration (CI) setup, SoapUI comes in even handier: you can run the test suites and the test cases you created and, moreover, you can generate JUnit reports.

This part of the series guides you step-by-step through the Ant tasks for running tests written using SoapUI, generating JUnit reports, integrating with CI, and to top it all off getting code coverage using Cobertura. When you are done with this part, you will be able to reap the benefits of writing tests, continuous integration, and code coverage.

The project we will use is the famous PetStore from Sun’s BluePrints. We will use JPA (with Toplink) for the persistence tier and session beans for the business tier; by adding simple annotations we will publish these session beans as web services. This project has no front end. It will be deployed to the JEE reference app server GlassFish. This is a prototype written for this series in less than an hour using the NetBeans IDE. However, we will pass over the details of project creation in favor of keeping our eyes on the prize: using SoapUI and Ant, generating JUnit reports, integration with CI, and code coverage.

Source code for the AccountManager session bean interface:
package com.stelligent.biz.ws;

import java.util.Collection;

import javax.ejb.Remote;

import com.stelligent.ent.jpa.Account;
/**
*
* @author msubbarao
*/
@Remote
public interface AccountManager
{
public Account create(Account info);
public Account update(Account info);
public void remove(Account info);
public Account[] findAllAccounts();
public Account findByUsername(String username);
}

Implementation Class for Account Manager with annotations for web services:

package com.stelligent.biz.ws;

import javax.ejb.Stateless;
import javax.jws.WebMethod;
import javax.jws.WebService;
import javax.jws.soap.SOAPBinding;
import javax.persistence.*;

import com.stelligent.ent.jpa.Account;

import java.util.*;
/**
*
* @author msubbarao
*/
@WebService(name="AccountManager", serviceName = "AccountManagerService", targetNamespace = "urn:AccountManagerService")
@SOAPBinding(style = SOAPBinding.Style.RPC)
@Stateless(name="AccountManager")
public class AccountManagerBean implements AccountManager
{
@PersistenceContext
private EntityManager manager;

@WebMethod
public Account create(Account info)
{
this.manager.persist(info);
return info;
}


/**
* Updates the Account entity.
*
* @param info the Account object used to update.
* @return the info object.
*/
@WebMethod
public Account update(Account info)
{
return this.manager.merge(info);
}

/**
* Removes the Account entity.
*
* @param info the Account object used to update.
*/
@WebMethod
public void remove(Account info)
{
this.manager.remove(this.manager.getReference(Account.class, info.getUserid()));
}

/**
* Retrieves all the Account entities as an array.
*
* @return the objects as a Account array.
*/
@WebMethod
public Account[] findAllAccounts()
{
Query query = this.manager.createQuery("SELECT o FROM Account o");
java.util.List<Account> accounts = new java.util.ArrayList<Account>();
java.util.Iterator<Account> iter = query.getResultList().iterator();
while (iter.hasNext())
{
accounts.add(((Account) iter.next()));
}
return (Account[]) accounts.toArray(new Account[accounts.size()]);
}



/**
* This method retrieves the Account entity info using the primary key.
*
* @param username the String
* @return the object as a AccountInfo or null if not found.
*/
@WebMethod
public Account findByUsername(final String username)
{
try
{
return (Account) this.manager.find(Account.class, username);
}
catch (Exception e)
{
return null;
}
}


}

 

Article Type: 
How-to
5
Average: 5 (1 vote)

(Note: Opinions expressed in this article and its replies are the opinions of their respective authors and not those of DZone, Inc.)

Comments

David Sills replied on Mon, 2008/05/19 - 8:46am

What a terrific series, Meera! This is a great introduction to several tools more developers should be using!

SumaBS replied on Mon, 2008/05/19 - 1:34pm

Excellent Series Meera!

Sreekant replied on Thu, 2008/05/22 - 3:32pm

hi

I would like to know whether SOAPUI support complextype as input values.

2. whether it provides UI based support of testing Webservices

3. whether it generate test result  in the report fasion.

if you have any product which support all these let me know.

 

Sreek

Meera Subbarao replied on Thu, 2008/05/22 - 4:10pm

Hi Sreekant,

Everything you have asked above is what SoapUI is. Also, the AccountManagerBean code shown in this page has all the methods except remove method return a complex type, which in my case is the Account entity object. And the create method does take Account as its input as shown below.

     @WebMethod  
public Account create(Account info)
{
this.manager.persist(info);
return info;
}

 

srimaan replied on Sun, 2008/07/20 - 2:12pm

Excellent Material, Much helpful Thank you very much Meera

arazauci@gmail.com replied on Fri, 2008/08/01 - 8:49pm

hi,

I am trying to specify my Test Report XML from soapui

as

 

C:\Results\2008-08-01_17-32-28\28\report.xml

 

and I get teh following error in hudson.

 

'C:\Results\2008-08-01_17-32-28\28\report.xml' doesn't match anything: even 'C:' doesn't exist 

What am I doing wrong. why am I getting this error when the report.xml file exists.

Comment viewing options

Select your preferred way to display the comments and click "Save settings" to activate your changes.