Diferencia entre revisiones de «SoapUI Con JUnit»
(No se muestran 17 ediciones intermedias de 8 usuarios) | |||
Línea 1: | Línea 1: | ||
+ | ==Integración== | ||
+ | |||
Es muy fácil incorporar la suite de test [[JUnit]] generada por [[SoapUI]] a nuestro proyecto y poder así sumar estos test a los test de integración de nuestra aplicación. | Es muy fácil incorporar la suite de test [[JUnit]] generada por [[SoapUI]] a nuestro proyecto y poder así sumar estos test a los test de integración de nuestra aplicación. | ||
− | Librerias a incluir en el modulo de test de nuestro proyecto | + | ===Librerias a incluir en el modulo de test de nuestro proyecto=== |
*bcprov-jdk15-138.jar | *bcprov-jdk15-138.jar | ||
*commons-beanutils.jar | *commons-beanutils.jar | ||
+ | *commons-beanutils-1.7.0.jar | ||
*commons-cli.jar | *commons-cli.jar | ||
*commons-codec.jar | *commons-codec.jar | ||
*commons-httpclient.jar | *commons-httpclient.jar | ||
*not-yet-commons-ssl.jar | *not-yet-commons-ssl.jar | ||
+ | *saxon-dom-9.1.0.8j.jar | ||
+ | *saxon-9.1.0.8j.jar | ||
*soapui.jar | *soapui.jar | ||
*soapui-xmlbeans.jar | *soapui-xmlbeans.jar | ||
Línea 14: | Línea 19: | ||
*xbean-fixed.jar | *xbean-fixed.jar | ||
*xmlpublic.jar | *xmlpublic.jar | ||
+ | *xbean_xpath-2.4.0.jar | ||
+ | |||
+ | |||
+ | Al incluir las librerias propuesta arriba podremos correr los tests con Junit y fucionarán los siguientes asserts de SoapUI: | ||
+ | |||
+ | *Contains | ||
+ | *SOAP response | ||
+ | *Soap fault | ||
+ | *Schema Compliance | ||
+ | *not soap fault | ||
+ | |||
+ | Si se desean otras validaciones sobre la respuesta deberán agregar otros JARs que see encuentran dentro del directorio donde se instalo SoapUI. | ||
+ | |||
+ | Great haemmr of Thor, that is powerfully helpful! | ||
+ | |||
+ | === Problemas con Assertions === | ||
+ | |||
+ | Se presentan ciertos problemas al correr los test SoapUi con JUnit. | ||
+ | |||
+ | Soapui propone muchas formas para realizar assert sobre el response de un ws, a continuación un breve explicación de cada una: | ||
+ | |||
+ | *'''WS-security status''' : Chequea que el reponse tenga un encabezado ws-security válido. | ||
+ | *'''not soap fault''' : Chequea que el response no sea un fault. | ||
+ | *'''Response SLA''' : Chequea que el response haya tardado menos del tiempo configurado. | ||
+ | *'''SOAP response''': Chequea que el response sea un mensaje soap. | ||
+ | *'''Script assertion''': Permite hacer scrips de groovy para realizar assert con el response. | ||
+ | *'''WS adressing response''': Chequea que el encabezado del resopnse tenga propiedades válidas. | ||
+ | *'''Contains''': Chequea que el response contenga un valor o un tag con un valor determinado. | ||
+ | *'''Not Contains''': Chequea que el response no contenga un valor o un tag con un valor determinado. | ||
+ | *'''xQuery math''': Permite chequear el contenido del response con expresiones de xquery 2.0. | ||
+ | *'''Schema Compliance''': Chequea que el response sea compatible con un shema dado. | ||
+ | *'''xPath match''': Permite chquear el contenido del response con expresiones de xPath. | ||
+ | *'''Soap fault''': Chequea que el response sea un fault. | ||
+ | |||
+ | |||
+ | Estos assert son muy completos y muy fáciles de usar con SoapUI. En principio con los contains se pueden hacer asserts sobre todo el response, pero tienen una serie de limitaciones: solo permite hacer assert por tag, es decir, que no se puede hacer un assert del xml completo, con lo cual si el xml del response tiene 20 tag, habrá que hacer 20 assert distintos. Otro punto en contra es que no hay un forma con las assertions para testeas los tags en el caso de que nuestro WebServices retorne una colección de datos, ya que es estos casos hace un assert sobre todo el xml, sin controlar la cantidad. | ||
+ | |||
+ | ==Componentes== | ||
+ | |||
+ | Para poder realizar los test de componentes de un Servicio Web tenemos que [http://www.soapui.org/Getting-Started/your-first-soapui-project.html crear un proyecto SoapUI, mediante un WSDL], [http://www.soapui.org/Getting-Started/mock-services.html simular los servicios (Mocks)] y guardarlo. En el test de componentes utilizar el xml del proyecto [[SoapUI]] para obtener los servicios simulados y exponerlos mediante [[Jetty]]. Para la ejecución de los test hay que cambiar la configuración de la url de los servicios, para que invoquen a los servicios simulados y no a los reales. | ||
+ | |||
+ | ===Librerias a incluir en el modulo de test de nuestro proyecto=== | ||
+ | |||
+ | <code xml> | ||
+ | <dependencies> | ||
+ | |||
+ | <dependency> | ||
+ | <groupId>junit</groupId> | ||
+ | <artifactId>junit</artifactId> | ||
+ | <version>4.8.2</version> | ||
+ | <scope>test</scope> | ||
+ | <type>jar</type> | ||
+ | </dependency> | ||
+ | |||
+ | <dependency> | ||
+ | <groupId>eviware</groupId> | ||
+ | <artifactId>soapui-pro</artifactId> | ||
+ | <version>4.0.0</version> | ||
+ | <scope>test</scope> | ||
+ | </dependency> | ||
+ | |||
+ | <dependency> | ||
+ | <groupId>eviware</groupId> | ||
+ | <artifactId>soapui</artifactId> | ||
+ | <version>4.0.0</version> | ||
+ | <scope>test</scope> | ||
+ | </dependency> | ||
+ | |||
+ | <dependency> | ||
+ | <groupId>eviware</groupId> | ||
+ | <artifactId>soapui-xmlbeans</artifactId> | ||
+ | <version>4.0.0</version> | ||
+ | <scope>test</scope> | ||
+ | </dependency> | ||
+ | |||
+ | <dependency> | ||
+ | <groupId>xmlbeans</groupId> | ||
+ | <artifactId>xbean</artifactId> | ||
+ | <version>fixed-2.4.0</version> | ||
+ | <scope>test</scope> | ||
+ | </dependency> | ||
+ | |||
+ | <dependency> | ||
+ | <groupId>commons-httpclient</groupId> | ||
+ | <artifactId>commons-httpclient</artifactId> | ||
+ | <version>3.1</version> | ||
+ | <scope>test</scope> | ||
+ | </dependency> | ||
+ | |||
+ | <dependency> | ||
+ | <groupId>commons-cli</groupId> | ||
+ | <artifactId>commons-cli</artifactId> | ||
+ | <version>1.0</version> | ||
+ | <scope>test</scope> | ||
+ | </dependency> | ||
+ | |||
+ | <dependency> | ||
+ | <groupId>commons-ssl</groupId> | ||
+ | <artifactId>commons-ssl</artifactId> | ||
+ | <version>0.3.4</version> | ||
+ | <scope>test</scope> | ||
+ | </dependency> | ||
+ | |||
+ | <dependency> | ||
+ | <groupId>xerces</groupId> | ||
+ | <artifactId>xercesImpl</artifactId> | ||
+ | <version>2.9.1</version> | ||
+ | <scope>test</scope> | ||
+ | </dependency> | ||
+ | |||
+ | <dependency> | ||
+ | <groupId>log4j</groupId> | ||
+ | <artifactId>log4j</artifactId> | ||
+ | <version>1.2.8</version> | ||
+ | <scope>test</scope> | ||
+ | </dependency> | ||
+ | |||
+ | <dependency> | ||
+ | <groupId>wsdl4j</groupId> | ||
+ | <artifactId>wsdl4j</artifactId> | ||
+ | <version>1.6.2-fixed</version> | ||
+ | <scope>test</scope> | ||
+ | </dependency> | ||
+ | |||
+ | <dependency> | ||
+ | <groupId>javax.mail</groupId> | ||
+ | <artifactId>mail</artifactId> | ||
+ | <version>1.4.1</version> | ||
+ | <scope>test</scope> | ||
+ | </dependency> | ||
+ | |||
+ | <dependency> | ||
+ | <groupId>javax.servlet</groupId> | ||
+ | <artifactId>servlet-api</artifactId> | ||
+ | <version>2.5</version> | ||
+ | <scope>test</scope> | ||
+ | </dependency> | ||
+ | |||
+ | <dependency> | ||
+ | <groupId>commons-collections</groupId> | ||
+ | <artifactId>commons-collections</artifactId> | ||
+ | <version>3.2</version> | ||
+ | <scope>test</scope> | ||
+ | </dependency> | ||
+ | |||
+ | <dependency> | ||
+ | <groupId>commons-beanutils</groupId> | ||
+ | <artifactId>commons-beanutils</artifactId> | ||
+ | <version>1.7.0</version> | ||
+ | <scope>test</scope> | ||
+ | </dependency> | ||
+ | |||
+ | <dependency> | ||
+ | <groupId>jetty</groupId> | ||
+ | <artifactId>jetty</artifactId> | ||
+ | <version>6.1.26</version> | ||
+ | <scope>test</scope> | ||
+ | </dependency> | ||
+ | |||
+ | <dependency> | ||
+ | <groupId>jetty</groupId> | ||
+ | <artifactId>jetty-util</artifactId> | ||
+ | <version>6.1.26</version> | ||
+ | <scope>test</scope> | ||
+ | </dependency> | ||
+ | |||
+ | <dependency> | ||
+ | <groupId>groovy</groupId> | ||
+ | <artifactId>groovy-all</artifactId> | ||
+ | <version>1.8.0</version> | ||
+ | <scope>test</scope> | ||
+ | </dependency> | ||
+ | |||
+ | <dependency> | ||
+ | <groupId>bouncycastle</groupId> | ||
+ | <artifactId>bcprov-jdk15</artifactId> | ||
+ | <version>140</version> | ||
+ | <scope>test</scope> | ||
+ | </dependency> | ||
+ | |||
+ | <dependency> | ||
+ | <groupId>eviware</groupId> | ||
+ | <artifactId>soap-xmlbeans</artifactId> | ||
+ | <version>1.2</version> | ||
+ | <scope>test</scope> | ||
+ | </dependency> | ||
+ | |||
+ | <dependency> | ||
+ | <groupId>xmlbeans</groupId> | ||
+ | <artifactId>xbean_xpath</artifactId> | ||
+ | <version>2.4.0</version> | ||
+ | <scope>test</scope> | ||
+ | </dependency> | ||
− | < | + | <dependency> |
+ | <groupId>saxon</groupId> | ||
+ | <artifactId>saxon-dom</artifactId> | ||
+ | <version>9.1.0.8j</version> | ||
+ | <scope>test</scope> | ||
+ | </dependency> | ||
− | < | + | <dependency> |
− | + | <groupId>saxon</groupId> | |
− | + | <artifactId>saxon</artifactId> | |
− | + | <version>9.1.0.8j</version> | |
− | + | <scope>test</scope> | |
− | + | </dependency> | |
− | + | ||
− | + | </dependencies> | |
− | </code> | + | |
+ | <repositories> | ||
+ | <repository> | ||
+ | <id>eviware</id> | ||
+ | <url>http://www.eviware.com/repository/maven2</url> | ||
+ | </repository> | ||
+ | </repositories> | ||
+ | </code> | ||
− | + | ===Test=== | |
− | <code java | + | <code java> |
− | |||
− | |||
− | + | /** | |
− | + | * Lista de corredores de servicios. | |
+ | */ | ||
+ | private static List<MockRunner> runners; | ||
− | + | /** | |
− | + | * Levanta los servicios simulados del proyecto SoapUI. | |
− | + | * @throws Exception | |
+ | */ | ||
+ | @BeforeClass | ||
+ | public static void levantarMocks() throws Exception { | ||
+ | runners = new ArrayList(); | ||
− | + | /** | |
− | + | * Lee poryecto SoapUI. | |
+ | */ | ||
+ | WsdlProject project = new WsdlProject("HolaMundo-soapui-project.xml"); | ||
− | + | /** | |
− | + | * Obtiene e inicia los servicios simulados. | |
− | + | */ | |
− | } | + | for (int c = 0; c < project.getMockServiceCount(); c++) { |
+ | MockService mockService = project.getMockServiceAt(c); | ||
+ | runners.add(mockService.start()); | ||
+ | } | ||
+ | } | ||
+ | |||
+ | . | ||
+ | . | ||
+ | . | ||
+ | . | ||
− | |||
− | |||
− | + | /** | |
− | + | * Baja los corredores de servicios. | |
− | + | * @throws Exception | |
− | } | + | */ |
+ | @AfterClass | ||
+ | public static void bajarMocks() throws Exception { | ||
+ | for (MockRunner runner : runners) { | ||
+ | runner.stop(); | ||
+ | } | ||
+ | } | ||
− | </code> | + | </code> |
== Ver también == | == Ver también == | ||
− | *[[ | + | *[[Mock de un web service con Jetty|Alternativa a SoapUI utilizando Jetty]] |
*[http://www.soapui.org/userguide/commandline/functional.html SoapUITestCaseRunner ] | *[http://www.soapui.org/userguide/commandline/functional.html SoapUITestCaseRunner ] | ||
[[Category:Web_Service]] [[Category:JUnit]] | [[Category:Web_Service]] [[Category:JUnit]] |
Revisión actual del 11:47 15 sep 2011
Contenido
Integración
Es muy fácil incorporar la suite de test JUnit generada por SoapUI a nuestro proyecto y poder así sumar estos test a los test de integración de nuestra aplicación.
Librerias a incluir en el modulo de test de nuestro proyecto
- bcprov-jdk15-138.jar
- commons-beanutils.jar
- commons-beanutils-1.7.0.jar
- commons-cli.jar
- commons-codec.jar
- commons-httpclient.jar
- not-yet-commons-ssl.jar
- saxon-dom-9.1.0.8j.jar
- saxon-9.1.0.8j.jar
- soapui.jar
- soapui-xmlbeans.jar
- soap-xmlbeans.jar
- xbean-fixed.jar
- xmlpublic.jar
- xbean_xpath-2.4.0.jar
Al incluir las librerias propuesta arriba podremos correr los tests con Junit y fucionarán los siguientes asserts de SoapUI:
- Contains
- SOAP response
- Soap fault
- Schema Compliance
- not soap fault
Si se desean otras validaciones sobre la respuesta deberán agregar otros JARs que see encuentran dentro del directorio donde se instalo SoapUI.
Great haemmr of Thor, that is powerfully helpful!
Problemas con Assertions
Se presentan ciertos problemas al correr los test SoapUi con JUnit.
Soapui propone muchas formas para realizar assert sobre el response de un ws, a continuación un breve explicación de cada una:
- WS-security status : Chequea que el reponse tenga un encabezado ws-security válido.
- not soap fault : Chequea que el response no sea un fault.
- Response SLA : Chequea que el response haya tardado menos del tiempo configurado.
- SOAP response: Chequea que el response sea un mensaje soap.
- Script assertion: Permite hacer scrips de groovy para realizar assert con el response.
- WS adressing response: Chequea que el encabezado del resopnse tenga propiedades válidas.
- Contains: Chequea que el response contenga un valor o un tag con un valor determinado.
- Not Contains: Chequea que el response no contenga un valor o un tag con un valor determinado.
- xQuery math: Permite chequear el contenido del response con expresiones de xquery 2.0.
- Schema Compliance: Chequea que el response sea compatible con un shema dado.
- xPath match: Permite chquear el contenido del response con expresiones de xPath.
- Soap fault: Chequea que el response sea un fault.
Estos assert son muy completos y muy fáciles de usar con SoapUI. En principio con los contains se pueden hacer asserts sobre todo el response, pero tienen una serie de limitaciones: solo permite hacer assert por tag, es decir, que no se puede hacer un assert del xml completo, con lo cual si el xml del response tiene 20 tag, habrá que hacer 20 assert distintos. Otro punto en contra es que no hay un forma con las assertions para testeas los tags en el caso de que nuestro WebServices retorne una colección de datos, ya que es estos casos hace un assert sobre todo el xml, sin controlar la cantidad.
Componentes
Para poder realizar los test de componentes de un Servicio Web tenemos que crear un proyecto SoapUI, mediante un WSDL, simular los servicios (Mocks) y guardarlo. En el test de componentes utilizar el xml del proyecto SoapUI para obtener los servicios simulados y exponerlos mediante Jetty. Para la ejecución de los test hay que cambiar la configuración de la url de los servicios, para que invoquen a los servicios simulados y no a los reales.
Librerias a incluir en el modulo de test de nuestro proyecto
<dependencies>
<dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>4.8.2</version> <scope>test</scope> <type>jar</type> </dependency>
<dependency> <groupId>eviware</groupId> <artifactId>soapui-pro</artifactId> <version>4.0.0</version> <scope>test</scope> </dependency>
<dependency> <groupId>eviware</groupId> <artifactId>soapui</artifactId> <version>4.0.0</version> <scope>test</scope> </dependency>
<dependency> <groupId>eviware</groupId> <artifactId>soapui-xmlbeans</artifactId> <version>4.0.0</version> <scope>test</scope> </dependency>
<dependency> <groupId>xmlbeans</groupId> <artifactId>xbean</artifactId> <version>fixed-2.4.0</version> <scope>test</scope> </dependency> <dependency> <groupId>commons-httpclient</groupId> <artifactId>commons-httpclient</artifactId> <version>3.1</version> <scope>test</scope> </dependency> <dependency> <groupId>commons-cli</groupId> <artifactId>commons-cli</artifactId> <version>1.0</version> <scope>test</scope> </dependency> <dependency> <groupId>commons-ssl</groupId> <artifactId>commons-ssl</artifactId> <version>0.3.4</version> <scope>test</scope> </dependency> <dependency> <groupId>xerces</groupId> <artifactId>xercesImpl</artifactId> <version>2.9.1</version> <scope>test</scope> </dependency> <dependency> <groupId>log4j</groupId> <artifactId>log4j</artifactId> <version>1.2.8</version> <scope>test</scope> </dependency> <dependency> <groupId>wsdl4j</groupId> <artifactId>wsdl4j</artifactId> <version>1.6.2-fixed</version> <scope>test</scope> </dependency>
<dependency> <groupId>javax.mail</groupId> <artifactId>mail</artifactId> <version>1.4.1</version> <scope>test</scope> </dependency>
<dependency> <groupId>javax.servlet</groupId> <artifactId>servlet-api</artifactId> <version>2.5</version> <scope>test</scope> </dependency> <dependency> <groupId>commons-collections</groupId> <artifactId>commons-collections</artifactId> <version>3.2</version> <scope>test</scope> </dependency> <dependency> <groupId>commons-beanutils</groupId> <artifactId>commons-beanutils</artifactId> <version>1.7.0</version> <scope>test</scope> </dependency> <dependency> <groupId>jetty</groupId> <artifactId>jetty</artifactId> <version>6.1.26</version> <scope>test</scope> </dependency> <dependency> <groupId>jetty</groupId> <artifactId>jetty-util</artifactId> <version>6.1.26</version> <scope>test</scope> </dependency>
<dependency> <groupId>groovy</groupId> <artifactId>groovy-all</artifactId> <version>1.8.0</version> <scope>test</scope> </dependency>
<dependency> <groupId>bouncycastle</groupId> <artifactId>bcprov-jdk15</artifactId> <version>140</version> <scope>test</scope> </dependency>
<dependency> <groupId>eviware</groupId> <artifactId>soap-xmlbeans</artifactId> <version>1.2</version> <scope>test</scope> </dependency>
<dependency> <groupId>xmlbeans</groupId> <artifactId>xbean_xpath</artifactId> <version>2.4.0</version> <scope>test</scope> </dependency>
<dependency> <groupId>saxon</groupId> <artifactId>saxon-dom</artifactId> <version>9.1.0.8j</version> <scope>test</scope> </dependency>
<dependency> <groupId>saxon</groupId> <artifactId>saxon</artifactId> <version>9.1.0.8j</version> <scope>test</scope> </dependency> </dependencies> <repositories> <repository> <id>eviware</id> <url>http://www.eviware.com/repository/maven2</url> </repository> </repositories>
Test
/** * Lista de corredores de servicios. */ private static List<MockRunner> runners;
/** * Levanta los servicios simulados del proyecto SoapUI. * @throws Exception */ @BeforeClass public static void levantarMocks() throws Exception { runners = new ArrayList();
/** * Lee poryecto SoapUI. */ WsdlProject project = new WsdlProject("HolaMundo-soapui-project.xml");
/** * Obtiene e inicia los servicios simulados. */ for (int c = 0; c < project.getMockServiceCount(); c++) { MockService mockService = project.getMockServiceAt(c); runners.add(mockService.start()); } } . . . .
/** * Baja los corredores de servicios. * @throws Exception */ @AfterClass public static void bajarMocks() throws Exception { for (MockRunner runner : runners) { runner.stop(); } }