Evento Agile Levante – Pruebas funcionales

El próximo martes 10 de abril Agile Levante organiza su evento mensual en las oficinas de Openfinance. Esta vez el tema elegido para charlar es pruebas funcionales.

Podéis encontrar más información en http://agilelevante.wordpress.com/ y sacar los tickets en http://agilelevante1204.eventbrite.com/.

desarrollo, evento ,

Testing de servicios REST protegidos con oAuth usando SoapUI

En ocasiones necesitamos montar un test (ya sea funcional o de integración) sobre un servicio que se encuentra protegido por oAuth y nos encontramos en la situación de tener que montar todo el proceso de autenticación para conseguir hacer la llamada.

En lugar de programar un cliente específico (en .Net o en Java) que haga el trabajo y ejecutarlo como un proyecto de pruebas, podemos usar como alternativa la herramienta SoapUI con bastante poco trabajo. En este post vamos a describir como hacerlo paso a paso

 

Entorno de pruebas.

Nuestro entorno de pruebas tendrá los siguientes elementos

  • Servicio web de petición de token de autenticación : GetRequestToken.svc
  • Servicio web de petición de token de acceso al recurso : GetAccessToken.svc
  • Servicio web de acceso al recurso :  Wall.svc (en nuestro caso)

Para simular la autorización por parte del usuario del acceso al recurso protegido, hemos montado un servicio web que valida los datos de prueba y genera la verificación del token requerida

  • Servicio web de validación del token : UserAuthorization.svc

Los servicios REST usados en este ejemplo están desarrollados en C# con VS2010 y emplea la librería de devDefined oAuth (http://code.google.com/p/devdefined-tools/wiki/OAuth) que implementa la versión 1.0 del protocolo

Para el desarrollo de este post hemos usado SoapUIPro versión 4.0.1 aunque la versión libre de la herramienta también sirve para los mismos propósitos.

 

Creando las peticiones a los servicios.

Lo primero que tenemos que hacer es montar un nuevo proyecto para nuestras pruebas y añadir los servicios REST. Con el servicio, el recurso y la petición asociada al mismo creado tenemos que verificar que todo esta correcto.

Abrimos el método que cuelga del recurso (getToken) y añadiremos a ese método el parámetro que necesitamos. En nuestro caso es un parámetro llamado “Authorization” y le indicamos que es de estilo HEADER

Abrimos la petición asociada, verificamos que la URL es la esperada (la editamos ahí mismo si no es el caso)

Si dispusiéramos de algún valor del parámetro valido, lo podemos testear aquí mismo introduciendo ese dato y usando la flecha verde de ejecución.

 

Con todos los servicios creados tendremos un proyecto como el mostrado. Verificamos que todas las peticiones tienen el endPoint adecuado en las peticiones y que todas tienen el parámetro Authorization en los métodos.

 

 

 

 

Creando las pruebas.

El siguiente paso es crear la suite de pruebas que ejecute las llamadas en el orden adecuado preparando las cabeceras de cada llamada y que mueva los datos resultado de cada llamada a la siguiente etapa. Vamos por pasos.

Creamos una nueva TestSuite y un nuevo TestCase en nuestro proyecto. Vamos a usar las propiedades de ese TestCase para mover los datos entre llamadas a los servicios de forma que vamos a la pestaña de “Properties” del caso de test y añadimos las siguientes propiedades mostradas en la captura de pantalla.

Como veréis, solamente las primeras tienen un valor establecido que es el necesario para iniciar la autenticación oAuth. El resto de variables irán tomando valor en cada uno de los pasos del test. El valor de las variables user y password se emplea para simular la autorización por parte del propietario del recurso en el servicio web UserAuthorization.svc

Con las propiedades listas, vamos a ir añadiendo pasos a nuestro caso de test. Para cada servicio estableceremos cuatro pasos simples

  • Crear la cabecera oAuth con un script
  • Insertar la cabecera en el siguiente paso (Property Transfer)
  • Ejecutar la llamada al servicio REST
  • Extraer los datos de la respuesta del servicio y rellenar las variables del Test Case pertinentes.

Empecemos por el primer servicio (GetRequestToken.svc) y empecemos por crear el script que realiza la firma y monta las cabeceras oAuth (Add Step:Groovy Script)

 

El contenido del script es el mostrado en el siguiente fichero :

import java.util.Random
import java.net.URLEncoder
import java.util.regex.Pattern
import java.util.regex.Matcher
import javax.crypto.Mac
import javax.crypto.spec.SecretKeySpec
import org.apache.commons.codec.binary.Base64


// Generate auth_nonce
Random rand = new Random()
def rn1 =(rand.nextFloat() * 100000000)
def rn2 =(rand.nextFloat() * 100000000)
String oa_nonce = "oauth_nonce="+ rn1.round().toString()+ "-" + rn2.round().toString()


// Generate ticks
Date now = new Date();
int tm = (now.getTime()/1000)
String oa_timestamp = "oauth_timestamp=" + tm

//Otras variables
def oa_consumer = "oauth_consumer_key=" + testRunner.testCase.getPropertyValue( "oauth_consumer_key" )
def oa_version = "oauth_version=" + testRunner.testCase.getPropertyValue( "oauth_version" )
def oa_sig_method = "oauth_signature_method=" + testRunner.testCase.getPropertyValue( "oauth_signature_method" )
def oa_secret = testRunner.testCase.getPropertyValue( "oauth_secret" )

// Montamos la firma
String baseURL = "http://localhost:50595/"
String resource = "GetRequestToken.svc"

String headerParams = "oauth_callback=GetRequestToken.svc" +
"&" + oa_consumer +
"&" + oa_nonce +
"&" + oa_sig_method +
"&" + oa_timestamp +
"&" + oa_version

String sigBase = "GET&" +
URLEncoder.encode(baseURL+resource+"/") +
"&" + URLEncoder.encode(headerParams);

String keyF = URLEncoder.encode(oa_secret)+"&"

Mac m = Mac.getInstance("HmacSHA1");
m.init(new SecretKeySpec(keyF.getBytes(), "HmacSHA1"));
m.update(sigBase.getBytes());
byte[] res = m.doFinal();
def signature = new String(Base64.encodeBase64(res));

String cabecera = "OAuth " + headerParams.replaceAll('&', ',') + ",oauth_signature=" +signature;

return cabecera

Como podéis ver, el script calcula la firma de los parámetros y monta la cabecera oAuth con los mismos devolviéndolos como resultado del script. Merece la pena fijarse en la forma de acceder a las propiedades del caso de test (testRunner.testCase.getPropertyValue  ) ya que en todos los demás pasos iremos accediendo a las propiedades que vamos guardando después de cada ejecución de la llamada REST.

A continuación incluimos un nuevo paso de test para mover los resultados del script a la llamada y la llamada al servicio REST. (Incluir los pasos y luego configurar)

El paso de mover parámetros, tomara como origen el resultado del script anterior y como destino la propiedad “Authorization” del paso de llamada a servicio REST.

 

El ultimo paso es de nuevo un “Property Transfer” que obtiene los datos del resultado de la llamada al servicio REST y los introduce en las propiedades del caso de Test.

En nuestro caso, sacamos el token y el secret de la llamada con dos transferencias. Fijaros en que tenemos como origen el paso de llamada REST, la propiedad es “ResponseAsXml” y usamos un XPath (diferente en cada valor) para acceder al dato dentro de la respuesta. El destino es el caso de test y la propiedad correspondiente.

Esto finalizaría el primer paso de llamada al primer servicio REST.

 

Completando el test.

Procedemos de la misma forma en el resto de casos de llamada a los servicios hasta ir completando toda la información necesaria para el último paso que es la llamada al servicio protegido con oAuth. El caso de test completo se puede ver debajo

 

 

 

 

 

Para completar el test, incluimos en la llamada una aserción de test que cuente los nodos de comentario y lo contraste con el número esperado.

Ejecutando el test.

Con todos los pasos creados, podemos ejecutar el test del tirón y comprobar que aparece el resultado en verde.

Pulsando sobre cada paso del log, podemos ver los detalles de ejecución del paso o el error que aparezca en caso de tener alguno.

 

 

 

 

Mejoras y evolución.

Puesto que la llamada a los métodos oAuth son comunes a todas las llamadas a métodos protegidos, podria crearse un caso de test que contuviera solamente las llamadas oAuth y llamarlo como un paso mas en cada uno de los tests de nuestros servicios como paso previo. Esto nos permitiría reutilizar el mismo grupo de llamadas y simplificaría el test de regresión de todos los servicios ofrecidos por nuestro aplicativo.

 

Conclusiones.

Como veis, es bastante sencillo montar un proyecto de test y extenderlo para cubrir todos los servicios ofrecidos por nuestra aplicación que se encuentren protegidos con oAuth.

Os animo a probar este método de prueba y a crearos vuestros própios proyectos de test de las aplicaciones de forma que podais efectuar un test de regresión rápidamente después de cada despliegue.

desarrollo , , , , , ,

CAS 2011

No me gusta escribir sobre este tipo de eventos mientras tienen lugar o nada más terminan porque el compañerismo, la euforia de lo que estás viviendo y el hecho de hablar de mejorar y mejorar me nubla las ideas y no me permite valorar objetivamente el evento. Ahora que ya han pasado unos días hago retrospectiva, miro atrás y puedo dar mi crítica para que sea lo más constructiva posible.

Esta es la primera vez que asistía a un evento de este tipo y mis impresiones son las siguientes:

Me ha gustado…

  • La organización. No es nada fácil organizar un evento de esta magnitud y el resultado ha sido fantástico
  • El compromiso adquirido entre los compañeros que fuimos desde Openfinance para poner en marcha las ideas que íbamos tomando de cada una de las ponencias y otras tantas que nos iban surgiendo
  • La keynote de Xavier Quesada, para mí la mejor de todas las ponencias que han tenido lugar, la que más captó mi atención y de la que más “apuntes tomé”
  • Poner cara a mucha de la gente de la que leo, he oído hablar o sigo en twitter
  • La conversación que tuve con Emma (@hell03610)
  • El esfuerzo realizado por Openfinance por llevarnos y el patrocinio de la comida del viernes demostrando el apoyo y el trabajo que se está haciendo en pro de las metodologías ágiles

No me ha gustado…

  • El nivel y la calidad de muchas de las charlas a las que ido, sin duda esperaba mucho más
  • Que la mesa redonda no diera pie a un debate más abierto y que prácticamente consistiese en la opinión de los que componían la mesa
  • Que los tracks eran muy parecidos en contenido y al final daba la impresión de que todo era muy repetitivo
  • No haber podido intercambiar experiencias e ideas con toda la gente que me hubiese gustado

Mis propuestas para la próxima edición…

  • Que los tracks sean realmente tracks, más diferenciados y que no haya tantas sesiones que hablen de los mismos temas
  • Fomentar más el diálogo entre los asistentes ya que de estas conversaciones es de donde más se aprende
evento

Mi CAS 2011

Y tras varios meses de embarazo @hell03610 parió una CAS, bueno está claro que el hijo no es solo de ella pero me hizo mucha gracia el día que me dijo “Fran, la CAS es como un hijo para mí”. He vivido muy de cerca la organización de la CAS 2011 por ella, tanto que al final me transmitía sus nervios mientras trabajábamos.

Empiezo con esto para dar las gracias a todos los organizadores y colaboradores porque organizar un evento así es un gran curro y lo hicieron estupendamente.

Tras el evento la verdad es que me quedé con una sensación de despago, gran parte de esto la tiene @jjballano porque desde el DevOpenMadrid que organizó no he vuelto a asistir a un evento donde he aprendido tanto en tan poco tiempo ¡insuperable!

Tras reflexionar un poco la verdad es que el evento no ha estado nada mal, me llevo muy buenas cosas. Podría resumir las sesiones que más me han gustado o hablar sobre las sesiones de los keynotes, pero para mí esta CAS ha sido muy especial por las personas, he podido disfrutar de ella con mis compañeros de trabajo, he vuelto a ver a toda la gente asidua a estos eventos y lo más importante porque he estado con mi equipo.

Trabajo en un equipo distribuido entre Madrid, Barcelona y Valencia y tras la marcha de Emma mis únicos compañeros son el skype, el joinme, el gravitydev, el saros para eclipse y google docs. La verdad es que ver a compañeros con los que llevas meses trabajando y apenas has visto una vez en la vida no tiene precio, para todo lo demás vente a la CAS! Ji jiiiii  total que al final se ha convertido en lo que más me ha aportado, una pena que no estuviéramos todos.

Equipazo!

 

evento ,

Próximo Coding Dojo

El próximo miércoles Openfinance celebra un coding dojo, se trata de una reunión entre programadores para trabajar conjuntamente resolviendo problemas, y así aprender los unos de los otros.

Aprovechando su paso por tierras levantinas, contaremos con Carlos Ble como invitado de excepción.

Será de 18h a 20h en nuestras oficinas de Pintor Sorolla, 25 pta 3.
Como pequeño homenaje, la kata planteada será desarrollar un linkedlist y una tabla hash como siempre con TDD en tu lenguaje favorito.

¿Qué necesitas? Un portatil y ganas de programar :)
Mándanos un mail a dev at openfinance dot es para confirmar tu asistencia.
¡Te esperamos!

evento

XP2011 – Modular Design

First day of XP2011 Conference was held in Madrid 10th May.  It was a day full of morning and afternoon workshops and tutorials, so I had to choose carefully among all the options. I asked recommendations and my friends advised me to go and see what J.B.Rainsberger and M. Feathers would tell in their sessions. Here you have my summary of the first session, I hope you enjoy it as much as I enjoyed Rainsberger’s session!

A Simple Approach to Modular Desing by J. B. Rainsberger

What makes us good professionals, excellent programmers or designers? Being able to create and grow modular designs. What J. B. Rainsberger defines as a modular design is just four elements now minimized to two: Continúa leyendo

desarrollo, evento ,

XP 2011

La semana pasada se celebró en Madrid la XP2011, es decir, la 12º Conferencia Internacional sobre Desarrollo Software Agil y tuve la gran suerte de poder asistir.

Han sido cuatro días intensos de workshops, tutoriales, networking, lightning talks y agile games que iré contando en sucesivas entradas. La sensación que me llevo es la de haber subido a un mirador  y haber ampliando horizontes que antes eran inexistentes. Una vez terminada la conferencia toca explorarlos con calma.

Viewpoint

Si tuviera que decir en una frase qué horizontes nuevos he visto, sin duda serían sobre testing. Los test de integración son un dolor de cabeza que se puede minimizar y BDD es tener conversaciones, no es escribir en cucumber given/when/then. J.B. Rainsberger y Liz Keogh han abierto posibilidades que seguro abordaremos en los nuevos proyectos de Openfinance.

evento ,

Una semana de internship

Desde ayer y durante esta semana estoy de intership en Frogtek. Llegué a Huesca el domingo desde Barcelona y lo primero que me llamó la atención fue el buen tiempo primaveral que había en la ciudad. Tras instalarme y dar una pequeña vuelta por el centro, sólo quedaba dormir para empezar la semana.

El lunes conocí al equipo técnico de Frogtek, me enseñarón su panel scrumban con sus carriles y sus códigos de colores, muy parecidos a los utilizados en BeCode, hicimos la daily stand up, Guillermo me explicó por encima la empresa y tras un corto pair programming con Jose, empezamos una historia de usuario Julio y yo. Me vino bien refrescar conceptos de Android sobre Activities, Intents y Adapters que ya tenía olvidados tras el PFC de Nacho en Openfinance y la verdad es que Julio fue muy paciente conmigo y mis preguntas. Fue un día largo, donde vi la ventaja de trabajar con dos monitores y dos teclados! No sabes lo que te pierdes hasta que lo pruebas.

Hoy el día ya no ha salido tan primaveral, amenazando lluvia. Tras el daily meeting, debíamos terminar la historia de usuario que habíamos empezado ayer antes de comer: misión cumplida. Por la tarde ya con Jose, hemos hecho code review apoyándonos en las herramientas ágiles y hemos charlado un poco sobre ellas y sobre código en general.

Mañana más ;)

kaizen ,

DevUp11

El viernes pasado se celebró en Barcelona la #DevUp11, la iphone developers conference montada por Ideateca. La gestión del evento fue impresionante. En el Liceo de Barcelona, un evento muy mediático, con banners led, live streaming, sillas cool para los invitados y una presentadora que como toda presentadora de eventos que se precie, debe cambiarse al menos dos veces en el acto. Nos reunimos unas 300 personas, en su mayoría adictos de la manzana en su version phone o pad, para ver un intenso programa que nos había preparado Ideateca. Hasta los del País aparecieron por allí.

Las sesiones eran de tan sólo 20 minutos, bastantes en modo entrevista con moderador, y algunas en inglés. En general se habló mucho sobre la monetización de las aplicaciones y muy poco sobre desarrollo. Aunque otro gran olvidado fue el diseño. Continúa leyendo

evento ,

Kata Roman Numerals # Iteración 1

Gracias al curso que ofreció Carlos Ble para la gente de @openfinancedev me di cuenta de que me estaba quedando un poco anticuado en referente al desarrollo software.  Decidiendo por tanto hacer un proceso de autoformación intentando aplicar los conocimientos que adquirimos en dicho curso.

Me he planteado el reto de realizar las 12 katas de la iniciativa de 12meses12katas. Iré posteando el proceso de cada una de estas katas y así comprobar la evolución que voy teniendo.
Continúa leyendo

kaizen ,