Herramienta para Pruebas
Herramienta para Pruebas
Herramienta para Pruebas
En este post quiero darte un panorama general de cómo funcionan estas herramientas a nivel
conceptual, para que luego puedas concentrarte en estudiar cómo funciona alguna en particular.
En la imagen queda representado cómo desde unas pocas máquinas se puede ejecutar gran
cantidad de carga (usuarios virtuales) sobre nuestro sistema. Para el análisis de performance se
necesitan expertos de distintas partes de la infraestructura (red, application servers, bases de
datos, etc.) utilizando distintas herramientas de monitorización.
¿Cómo preparar los scripts para la simulación?
A diferencia de los scripts de pruebas funcionales, en estos scripts si bien se utiliza el enfoque
de record and playback, no se graba a nivel de interfaz gráfica, sino que a nivel de protocolo
de comunicación. Esto es porque en una prueba funcional al reproducir se ejecuta el navegador
y se simulan las acciones del usuario sobre el mismo. En una prueba de rendimiento se van a
simular múltiples usuarios desde una misma máquina, por lo que no es factible abrir gran
cantidad de navegadores y simular las acciones sobre ellos, ya que la máquina utilizada para
generar la carga tendría problemas de rendimiento, obteniendo así una prueba inválida. Al
hacerlo a nivel de protocolo se puede decir que se “ahorran recursos”, ya que en el caso del
protocolo HTTP lo que tendremos serán múltiples hilos que enviarán y recibirán texto por una
conexión de red, y no tendrán que desplegar elementos gráficos ni ninguna otra cosa que exija
mayor procesamiento.
Para preparar un script se procede en forma similar que para los scripts de pruebas funcionales,
pero esta vez la herramienta en lugar de capturar las interacciones entre el usuario y el
navegador, se captura los flujos de tráfico HTTP entre el cliente y el servidor (HTTP o el
protocolo que se vaya a simular, y de nuevo, cliente puede ser el browser, una app nativa o lo
que se quiera simular). Entonces, para la automatización se necesitan conocimientos sobre
herramientas de automatización y protocolos de comunicación (HTTP, SIP, SOAP, ISO8583,
etc.).
En la imagen queda representado que con herramientas como JMeter lo que sucede es cómo se
“graba” la prueba, donde básicamente se abre un proxy que capturará el tráfico entre el cliente
y el servidor. El script resultante será una secuencia de comandos en un lenguaje proporcionado
por la herramienta utilizada, en el cual se manejen los requests y responses de acuerdo al
protocolo de comunicación.
Una vez que se graba el script, es necesario luego realizar una serie de ajustes sobre estos
elementos para que quede reproducible. Estos scripts serán ejecutados por usuarios
concurrentes, y, por ejemplo, no tiene sentido que todos los usuarios utilicen el mismo nombre
de usuario y clave para conectarse, o que todos los usuarios hagan la misma búsqueda (ya que
en ese caso la aplicación funcionaría mejor que de usar diferentes valores, dado que influirían
los cachés, tanto a nivel de base de datos como a nivel de servidor de aplicaciones Web).
El costo de este tipo de ajustes dependerá de la herramienta utilizada y de la aplicación bajo
pruebas. En ocasiones es necesario ajustar cookies o variables, pues las obtenidas al grabar
dejan de ser válidas, debiendo ser únicas por usuario. Se deberán ajustar parámetros, tanto del
encabezado como del cuerpo del mensaje, etc.
Como comentario final, me gustaría destacar que hay una diferencia muy grande de esfuerzo
entre preparar un script para un flujo de un usuario en un browser a que si quisiéramos preparar
una prueba puntual para un endpoint específico de una API Rest.
Descripción
Selenium es un conjunto de utilidades que facilita la labor de obtener juegos de pruebas para
aplicaciones web. Para ello nos permite grabar, editar y depurar casos de prueba, que podrán ser
ejecutados de forma automática e iterativa posteriormente.
Además de ser una herramienta para registrar acciones, permite editarlas manualmente o crearlas
desde cero. Las acciones se basan en el uso de diferentes API's en diferentes lenguajes (PHP, Ruby,
JAVA, Javascript, etc). Entre su principales características podemos nombrar:
Recursos necesarios
Los navegadores mas conocidos compatibles con la utilización de Selenium son:
Explorer
Mozilla Firefox
Google Chrome
Safari
Las componentes de Selenium que son necesarias para la grabación y ejecución de las pruebas
son:
Selenium client v1.0.1: cliente de Selenium, necesario para crear pruebas Junit con Selenium.
Selenium IDE v1.0.2: plugin de Firefox para la grabación de las pruebas, paso a paso.
Selenium Server v1.0.1: servidor de Selenium, que es el que realiza las pruebas.
Para mas detalles sobre esto pincha aqui.
Otras consideraciones
La versión de Java necesaria es la JDK 1.6.0_16.
Es recomendable tener instalado un entorno de desarrollo, por ejemplo Eclipse 3.4.2.
Otra herramienta recomendable ya que nos va a ser muy útil para el reciclaje de las pruebas
es Firebug. Se trata de un plugin de Firefox que permite inspeccionar el código HTML de una página
y, entre otras opciones, obtener el Xpath de los diferentes elementos.
Para que las pruebas puedan ser extendidas para y puedan ser ejecutadas en varios navegadores,
necesitaremos tener instalada la herramienta JUnit. Para mas detalles sobre esto pincha aquí.
Selenium IDE
Cómo instalarlo
La instalación de Selenium IDE al tratarse de un complemento de Firefox es muy sencilla. Podemos
descargar e instalar el complemento desde cualquiera de los siguientes enlaces:
Pestaña Table
Contiene una lista con los comandos que se van grabando según se van realizando las acciones sobre
la pantalla.
Pestaña Table en el Panel de
Selenium IDE
Esta pestaña sólo aparece habilitada cuando se selecciona en el menú “Options” el formato HTML.
Pestaña Source
Muestra el código fuente generado, en el formato que se haya seleccionado.
Pestaña Source en el Panel de Selenium IDE
Esta pestaña se encuentra siempre disponible.
Grabación de Pruebas
Tipos de grabación
La grabación de una prueba puede ser configurada para que se haga de forma automática o manual:
Grabación Automática
Para grabar una prueba simplemente habrá que habilitar el panel de Selenium IDE en el
navegador Mozilla Firefox, verificar que el botón grabar está activo (debe quedar de color rojo claro)
y empezar a realizar la navegación. Nuestra navegación quedará registrada, generándose los
comandos que correspondan en cada caso, que se podrán ver en el panel de Selenium IDE.
En el botón secundario del ratón hay una opción con la cual para cualquier elemento de la página en la
que se navega se muestran las funciones de Selenium disponibles. Esta opción es muy útil para
cuando se quiere verificar que existe un texto en la pantalla o si un elemento está presente.
Menú secundario. Funciones de Selenium disponibles
Grabación Manual
Para programar las instrucciones que automatizan la prueba, se deshabilita el botón de grabar, en la
pestaña “Table” se selecciona una línea vacía y en los desplegables que aparecen en la parte inferior
se indica la instrucción.
El primer desplegable contiene la lista completa de funciones que ofrece Selenium IDE (no incluye el
detalle de cada una de ellas ya que, al seleccionarla, en la parte de información podemos ver la
operativa de la función seleccionada).
El segundo combo muestra una lista con todos los indicadores posibles para el elemento sobre el que
se quiere realizar la acción (ver Localización de elementos), siempre que se hayan grabado
automáticamente, en caso de edición manual aparece vacío.
En el último campo se introduce el valor que pueda necesitar la función de Selenium para su
ejecución, por ejemplo, el texto a introducir en un campo de texto.
En el apartado de referencias podemos encontrar un enlace a la página oficial de Selenium (Manual de
Referencia) donde se nos muestran todos los comandos posibles y su descripción.
De la misma forma también se pueden editar pruebas que ya hayan sido grabadas con anterioridad,
editando los campos que aparecen en la parte inferior de la pestaña “Table” o directamente en el
código generado en la pestaña “Source”.
id: Es la mejor opción siempre y cuando la página HTML tenga definidos correctamente los
identificadores de sus elementos, es decir, que sean únicos e invariantes en el tiempo. En estos casos,
el mantenimiento de las pruebas generadas usando este método es prácticamente nulo, y el hecho de
añadir o quitar elementos a la página no afecta al 'id' del resto de elementos existentes.
name: Por definición, el atributo 'name' de un elemento HTML no tiene que ser único, con lo que el
uso de este método de localización no garantiza que la prueba se ejecute de la manera deseada.
Además, en funciones que sólo referencian a un elemento (getText, click, type, etc...) la acción se
realizaría siempre sobre el primer elemento encontrado, por ejemplo, esta opción no sería válida para
hacer click sobre un conjunto de 'radiobuttons' con el mismo nombre.
identificador: Ésta es la opción por defecto que Selenium-IDE al grabar las pruebas y consiste en
usar el 'id' si existe y si no usar el 'name'.
dom: Esta opción utiliza el DOM de la página para hacer referencia a los elementos. El problema que
presenta es que cualquier introducción de un nuevo elemento, o reorganización de los existentes,
provoca que las referencias cambien, lo que puede invalidar las pruebas grabadas anteriormente.
xpath: Este método de identificación es similar al anterior, pero en este caso hace uso de la
estructura XML que posee todo documento HTML, para así hacer referencia a los elementos mediante
una ruta, ya sea absoluta (partiendo desde el elemento /) o relativa (partiendo de un elemento
conocido). Posee el mismo problema que el localizador por 'dom' ya que tanto el DOM como el XPATH
dependen de la estructura del documento. Además Xpath devolverá un elemento único siempre que
sea una ruta absoluta, en el caso de rutas relativas no se cumple ya que una misma ruta puede ser
válida para varios elementos.
link: Este método es el más utilizado al querer localizar un enlace. Su uso requiere conocer el texto
que va a mostrar dicho enlace en la página HTML, por lo tanto no es útil en caso de existir enlaces con
el mismo texto (devolvería el primero de ellos), enlaces sin texto, o enlaces con texto dinámico.
css: Este localizador consiste en identificar los elementos por sus propiedades de CSS. Este método
tampoco garantiza la unicidad del elemento referenciado.
Cuadro resumen
id Si Si Si(*) No
name No Si Si No
Independencia de la Compatible Compatible
Localizador Único
estructura HTML JSF Ext JS
identificador No Si Si(*) No
dom No No Si Si
Xpath Si(**) No Si Si
link No Si Si Si
css No Si Si Si
(/*) Siempre que el 'id se defina manualmente. (**) Xpath devolverá un elemento único siempre que
sea una ruta absoluta, en el caso de rutas relativas no se cumple ya que una misma ruta puede ser
válida para varios elementos.
Limitaciones
Algunas de las limitaciones encontradas para la grabación de las pruebas usando Selenium son las
siguientes:
Ventanas emergentes
Para la ejecución de las pruebas, Selenium 'inyecta' código javascript en la página HTML y así
consigue la ejecución automática del código grabado. Esto hace que no sea posible acceder a ningún
elemento que se quede fuera del ámbito del código HTML, como es el caso en el que se necesite
interactuar con ventanas emergentes. Existen varias situaciones, y en algunas de ellas el problema es
solventable:
Acceso mediante HTTPS:Cuando se accede a una página mediante HTTPS, ésta proporciona un
certificado de seguridad que se debe aceptar para continuar la navegación.
o En Internet Explorer 7, esta ventana de información se puede grabar con Selenium, con lo que se
puede sortear fácilmente.
o En cambio en Firefox, la aceptación del certificado de seguridad pasa por una ventana emergente a la
que Selenium no tiene acceso, por lo que hay que recurrir al uso de perfiles en la definición del
navegador a usar en las pruebas:
Arrancar el manager de perfiles de Firefox (firefox.exe -P )
Crear un nuevo perfil y acceder a Firefox con dicho perfil
Aceptar el certificado de seguridad permanentemente y configurar Selenium para que use el perfil
para Firefox (java -jar Selenium-server.jar -firefoxProfileTemplate [ruta al perfil]).
La interpretación de funciones:Se da el caso de que una misma funcion de Selenium tiene
comportamientos diferentes dependiendo del navegador.
o verifyTrue (verifyFalse, verifyEquals, verifyNotEquals): estas funciones comprueban si una condición
dada es verdadera o falsa, lanzando al final de la ejecución de la prueba, una excepción en caso de
error. En Internet Explorer el funcionamiento de este tipo de funciones no es el adecuado,
devolviendo valores 'true' cuando no debería hacerlo.
o isElementPresent(isTextPresent): Esta función verifica si un elemento está presente en la página HTML
o no. En Firefox, si el elemento está oculto (visibilidad con valor 'hidden') devuelve 'false', mientras
que en Internet Explorer devuelve 'true'.
Botón parar
A continuación, para ejecutar hay que pulsar el botón
Botón play
He grabado una prueba y aunque los localizadores de los elementos son correctos
(Selenium los encuentra), las funciones no se ejecutan sobre el elemento deseado.
Hay que comprobar que el localizador usado sea único, porque lo más probable en este caso sea que
no lo sea y la ejecución se esté realizando sobre otro elemento.
He grabado una prueba y al ejecutarla me dice que no encuentra un elemento que si está en
la página.
En este caso puede estar ocurriendo dos cosas:
Que el elemento se haya creado con AJAX, por lo que hay que introducir el código necesario para que
la ejecución se espere hasta que el elemento se cargue con AJAX (por ejemplo esperando a que el
elemento exista y esté visible).
Que el identificador sea dinámico y ya no sea válido, en cuyo caso hay que buscar otro tipo de
localizador que sea invariante en el tiempo.
Al ejecutar una prueba que tiene grabada la interacción con un popup javascript, no
aparecen dichos popups. ¿Está mal grabada la prueba?
No, la prueba esta correctamente grabada, Selenium a la hora de ejecutar una prueba no muestra los
popups de javascript, pero si que interactua con ellos a través de las funciones que dispone a tal
efecto.
¿Como sé si una prueba se ha ejecutado correctamente?
Al realizar una ejecución, en la lista de comandos podremos ver en color verde las instrucciones que
se lanzan correctamente y en rojo las que han fallado. Además en la ventana de información aparece
las razones por las que se ha producido el fallo.