lunes, 19 de agosto de 2013

Multiidioma de JSP con JSTL

Para implementar un jsp recuperando los literales de un fichero de propiedades y de esta manera internacionalizar nuestra web utilizaremos las librerias de JSTL (JSP Tag Library) que es un componente dentro de la especificación J2EE.

En primer descargaremos los jars de aquí, necesitaremos los llamados jstl-api-x.x.jar y jstl-impl-x.x-jar.

Los añadiremos al directorio WEB-INF/lib de nuestro proyecto.

Ahora en la página jsp objeto de nuestra implementación añadimos los tag libs antes de la etiqueta
<html>

<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>  
<%@ taglib uri="http://java.sun.com/jsp/jstl/fmt" prefix="fmt"%>



Los ficheros de lenguas los pondremos en WEB-INF/classes/bundle/ y tendrán la nomenclatura :
lang_es.propertieslang_es.properties por ejemplo para el caso de dos ficheros uno en español y otro en inglés.

Se tratan de ficheros clásicos de propiedades en estructura de clave - valor.


Antes de la etiqueta <head> de nuestra página incluimos este código :


<c:if test="${param.locale!=null}">
      <fmt:setLocale value="${param.locale}" scope="session"/>
</c:if>

<fmt:setBundle basename="bundle.lang"/>

Será el encargado de comprobar si nos llega un parámetro de una pagina previa correspondiente a la variable locale que nos indicara la lengua seleccionada, en caso afirmativo le setearemos la variable a nivel de session para que durante toda la navegación tengamos el idioma seleccionado, en caso contrario, que no nos llegue ningún idioma predeterminado previamente, cogeremos por defecto el que esté configurado en el navegador.
Mediante setBundle le indicamos donde están estos ficheros de idiomas.

Ahora es tan fácil como, en vez de hardcodear los literales en nuestro código,  hagamos referencia a ellos mediante el tag :


<fmt:message key="saludo"/>

Donde saludo se refiere a la clave que contiene el valor saludo, en este caso es bastante lógico que se trate de "Hello" o "Hola".

Una pequeña ayuda en el caso que tengamos funciones javascript que contengan también literales y sea externa a nuestra página, si decidimos tener un solo método para internacionalizar nuestra pagina, podemos recuperar los valores de nuestros literales de la misma manera mencionada anteriormente y recogerlos en variables globales de javascript que luego utilizaremos desde cualquier función que las requiera, por ejemplo :


<script type="text/javascript">

var lun="<fmt:message key="Fecha.Lunes"/>";
</script>


La variable lun ya contendrá el valor adecuado según nuestro mecanismo de selección de idioma y se generará de forma dinámica al aplicar cualquier cambio.

martes, 13 de agosto de 2013

Selenium : Grabación y ejecución de un test


Para crear un nuevo test tenemos dos opciones, escribirlo desde 0 o utilizar el ide de selenium y luego exportarlo. Vamos a escoger la segunda opción por su sencillez y rapidez.

 Descargamos el plugin para Firefox de la pagina de selenium y lo instalamos. Selenium IDE

Una vez volvamos a abrir Firefox ya tendremos el IDE disponible, el funcionamiento es el mismo que al instalar cualquier otro plugin en este navegador, si no lo vemos por defecto, podemos activarlo en la pestaña Ver -> Panel Lateral -> Selenium IDE.

Esta es la apariencia y su funcionamiento es muy intuitivo: 



Al apretar el botón "rec" e ir haciendo acciones sobre nuestro navegador, estas se irán grabando automáticamente, podemos modificar estas acciones manualmente desde la pestaña Table o Source según nos sea mas cómodo.

Una vez grabado un test, haremos Archivo -> Export Test Case As.. -> Java/JUnit4/WebDriver



Es importante recordar que el archivo debe tratarse de un .java

Ahora ya podemos copiar nuestro test en nuestro proyecto de Eclipse ( La explicación de como crear un proyecto para ejecutar Selenium la tenemos en el post anterior) y ejecutarlo es tan sencillo como hacer click derecho Run as -> JUnit Test

Si miramos con detenimiento el código java que se nos ha generado veremos que es relativamente sencillo de entender y por tanto es sencillo de modificar si queremos completarlo, como por ejemplo, algo útil que se puede necesitar es asignarle un TimeOut a la carga de las páginas, para ello a la instancia de WebDriver que se nos ha creado podemos llamar a su método pageLoadTime y pasar como parámetro los segundos máximos en los que queremos que se nos cargue, por ejemplo: 

driver.manage().timeouts().pageLoadTimeout(20, TimeUnit.SECONDS);

Y puede ser buena idea try catchear el bloque de código que ejecuta el test para controlar en caso de que falle por Time Out.


Otra cosa que puede resultar útil a la hora de automatizar una serie de test diferentes puede ser la creación de una clase principal que lance y controle nuestras pruebas, en este caso, recordar que para ejecutar una clase como si fuese un test de JUnit desde java se puede recurrir a crear una instancia de JUnitCore:

JUnitCore junit = new JUnitCore();

y luego llamar a su metodo run y recoger los resultados en una instancia de la clase Result

junit.run(NombreDeLaClase.class);

sábado, 10 de agosto de 2013

Selenium : Primeros Pasos


Vamos a preparar nuestro entorno de desarrollo para crear y ejecutar nuestros test de automatización web en selenium. En el ejemplo hemos escogido Eclipse como IDE

Lo primero que debemos hacer es descargar los archivos selenium-server-standalone-x.xx.x y selenium-java-x.xx.x de la pagina de selenium. Jars Selenium

Tambien vamos a necesitar el jar de junit que se puede bajar de aquí

Una vez lo tenemos todo, creamos un nuevo Java Project en Eclipse y añadimos los jars bajados a nuestro classpath, hay varias formas de hacer esto, yo voy a poner un ejemplo para incluirlos en nuestro proyecto y no tener dependencias de ubicaciones externas.

Creamos una nueva carpeta llamada lib en el primer nivel de nuestro proyecto y copiamos allí los jars bajados.





Ahora hacemos click derecho en cada uno de ellos y seleccionamos Build path -> Add to Build Path.

Veremos como una vez hecho esto, se ha creado en nuestro proyecto unas nuevas librerías bajo el nombre de Referenced Libraries, para asegurarnos que no estan corruptas y tienen contenido podemos desplegarlas y asegurarnos que contienen los packages con sus clases.

De esta manera se pueden ejecutar test grabados desde el ide Selenium en Firefox ejecutados como test JUnit o escribir a mano los propios casos de pruebas en Java.

En siguientes post, entraremos en materia y haremos varios ejemplos de circuitos ejecutandose