Version curso.2024

Ejercicios de tests de aceptación con Selenium.
Objetivos
  • Desplegar una plantilla de proyecto web con base de datos en Azure.

  • Comenzar a crear tests de aceptación de aplicaciones web con Selenium IDE.

Realización y entrega

La realización de estas actividades se realizará en equipo. La entrega será mediante el envío de un informe y el acceso al profesor a los repositorios y servicios configurados, para la revisión y evaluación de los mismos.

1. Test de la web del equipo

Realiza con Selenium IDE los tests de la web del equipo de la sesión 04 que verifiquen que la web incorpora todos los elementos que se pedían que se incluyeran en la misma.

Como siempre, crea un repositorio (privado) en GitHub para guardar los archivos creados. Se trata de una actividad en equipo, así que aplica el método de colaboración habitual. Comparte el repositorio con el profesor para que pueda tener acceso al mismo.

2. Aplicación web con base de datos

Desde ahora hasta el final de la asignatura vamos a iniciar un proyecto de equipo consistente en el desarrollo de una aplicación web dinámica (con base de datos) sobre el que aplicar las herramientas y métodos que vamos introduciendo durante el curso. El proyecto tendrá diversa funcionalidad, como las operaciones CRUD (Create, Read, Update, Delete) sobre una o varias entidades, un login y registro de usuarios, etc., así que vamos a comenzar por implementar esta funcionalidad. Tenemos dos alternativas: elegir una plantilla de proyecto que ya implemente la funcionalidad deseada, o bien hacerlo nosotros mismos.

2.1. Elige una plantilla

El objetivo de esta práctica es diseñar e implementar pruebas de aceptación con Selenium IDE para una aplicación web que sea funcional y que implemente, al menos, las siguientes funcionalidades:

  • Registro de usuarios

  • Login de usuarios

  • CRUD (Create, Read, Update, Delete) sobre una entidad (por ejemplo, tareas, usuarios, eventos, etc).

Para ello, puedes elegir una (o varias) plantilla(s) de proyecto que ya implemente(n) estas funcionalidades. Es indiferente en que lenguaje esté implementada. Lo que sí es importante es que, además de ejecutar la aplicación web en tu entorno de desarrollo local, también debes desplegar la aplicación en Azure. Por tanto, sea cual sea la plantilla que elijas, asegúrate de que podrás desplegarla en Azure.

2.2. Plantillas Vaadin

Como propuesta, os dejo algunos ejemplos en Vaadin, que es un framework que conocéis de la asignatura MDS2. Además, estas plantillas usan una base de datos H2 en memoria, lo que facilita el despliegue y reduce los gastos de Azure.

vaadin starter app master detail entity
Figura 1. Nueva vista Master-detail
  1. En la propiedad View access elige Users who have logged in. Esto te añadirá una página de Login.

vaadin starter app login
Figura 2. Añadir Login
  1. Guarda el proyecto y descárgalo. Elije Java 17.

vaadin starter app downloadProject
Figura 3. Guardar proyecto
Esta plantilla no implementa la eliminación. Puedes usarla en cualquier caso.

Despliegue en Azure

Si has elegido una plantilla de Vaadin, puedes seguir la siguiente documentación: Azure deploy. Durante la ejecución del asistente, elije Java 17. Asegúrate que usa la capa F1 (gratis).

azure webapp config
Figura 4. Asistente para despliegue en Azure

La ejecución del asistente modifica automáticamente el archivo pom.xml para añadir la configuración necesaria para desplegar en Azure.

            <plugin>
                <groupId>com.microsoft.azure</groupId>
                <artifactId>azure-webapp-maven-plugin</artifactId>
                <version>2.13.0</version>
                <configuration>
                    <schemaVersion>v2</schemaVersion>
                    <resourceGroup>my-app-1715855750474-rg</resourceGroup> (1)
                    <appName>my-app-1715855750474</appName> (2)
                    <pricingTier>F1</pricingTier>
                    <region>centralus</region> (3)
                    <runtime>
                        <os>Linux</os>
                        <javaVersion>Java 17</javaVersion>
                        <webContainer>Java SE</webContainer>
                    </runtime>
                    <deployment>
                        <resources>
                            <resource>
                                <directory>${project.basedir}/target</directory>
                                <includes>
                                    <include>*.jar</include>
                                </includes>
                            </resource>
                        </resources>
                    </deployment>
                </configuration>
            </plugin>
1 Puedes editar el nombre del grupo de recursos si lo deseas.
2 Puedes editar el nombre de la aplicación si lo deseas.
3 Puedes editar la región si lo deseas.

2.3. Usa tu propio proyecto

Como alternativa, si ya has desarrollado o estás desarrollando un proyecto similar en alguna tecnología que conozcas, y que implemente las funcionalidades indicadas, puedes usar tu propio proyecto.

Asegúrate de que tu proyecto es funcional, es decir, implementa las características indicadas y estas funcionan, ya que el objetivo es probarlas con Selenium. Y además tu proyecto debe implementar los casos de error mediante los mensajes de validación oportunos. Si tu proyecto no es funcional, o no implementa esas características o los casos de error, entonces mejor usa alguna de las plantillas propuestas.

Despliegue en Azure

En la documentación de Azure existen diversos tutoriales que describen como desplegar en Azure aplicaciones web con base de datos implementadas en distintas tecnologías. También dispones de ejemplos de despliegue en webapps. Estos tutoriales pueden servir de orientación para el despliegue de tu propio proyecto, aunque hay que tener cuidado al seguirlos paso a paso porque las instrucciones crean recursos relacionados con las bases de datos de elevado coste.

Por ello se recomienda que, si decides usar tu proyecto personal, configures una base de datos en memoria como H2 o SQLite.

En caso de duda consulta al profesor.

3. Creación de los tests Selenium

Crear en Selenium los test cases necesarios para probar, tanto escenarios correctos como escenarios de error, de las siguientes funcionalidades CRUD sobre la entidad elegida:

  • Registro de usuarios (caso correcto)

  • Registro de usuarios (casos incorrectos)

  • Login (caso correcto)

  • Login (casos incorrectos)

CRUD sobre una entidad (por ejemplo, tareas, usuarios, eventos, etc.):

  • Listado (Caso correcto)

  • Listado (Casos incorrectos)

  • Creación (Caso correcto)

  • Creación (Casos incorrectos)

  • Modificación (caso correcto)

  • Modificación (casos incorrectos)

  • Eliminación (caso correcto)

  • Eliminación (casos incorrectos)

En función de la tecnología que hayas elegido, tu plantilla de aplicación web tendrá todas estas funcionalidades, alguna de las indicadas anteriormente no estará implementada, o bien incorporará alguna funcionalidad adicional. En caso de que falte alguna, no te preocupes, crea los tests de las funcionalidades que estén incorporadas. Y si por el contrario la plantilla ofrece alguna funcionalidad adicional, puedes crear los tests de esa funcionalidad adicional de forma optativa.

Guardar los test cases en una test suite (formato .side).

Puesto que para realizar una prueba exhaustiva, cubriendo todos los posibles escenarios, el número de casos de prueba es elevado, la forma de trabajar es dividir las funcionalidades entre los miembros del equipo y así repartir el trabajo: Una persona que haga los tests de las dos primeras funcionalidades, y otra el resto.

Para equipos de 3 personas, como actividad adicional se pide probar el sitio demo disponible en https://opensource-demo.orangehrmlive.com, que es una aplicación web de gestión de recursos humanos. En este caso, se pide crear los tests de Selenium para las funcionalidades de Login, y Change password para el usuario logueado.

4. Funciones avanzadas de Selenium IDE

Ciertos pasos de algunos casos de prueba no se podrán grabar grabar con Selenium IDE, sino que habrá que modificarlos manualmente. A continuación, se ponen algunos ejemplos, que pueden serte útiles. Dependiendo de tu proyecto necesitarás utilizarlos o no.

4.1. Creación de una tarea ya existente (Caso correcto)

Para que el test de creación de una tarea, si suponemos que el nombre de la tarea es un identificador único, no debería permitir crear una nueva tarea con el nombre de una tarea ya existente. La plantilla que estés usando puede que valide esta restricción o no. Si lo hace, para poder ejecutar este test repetidamente sin que de el error de "tarea ya existe", tenemos que usar un texto aleatorio en cada ejecución del test. Eso se consigue definiendo una variable en Selenium, llamado al comando execute script, escribiendo la función de JavaScript que genere ese valor te texto, por ejemplo un email aleatorio, y guardándolo en una variable que luego usaremos en en paso que escribe el valor en el campo tarea del formulario de creación.

El paso sería del test case de Selenium IDE es:

  • Command: execute script

  • Target: return "ual-" + Math.floor(Math.random()*1500000)+"@ual.es"`

  • Value: emailramdon

register email ramdon
Figura 5. Generación de un email aleatorio

4.2. Implementación del test incorrecto con validación HTML5

En aquellos formularios en los que se debe introducir un valor, por ejemplo una dirección de email y el campo está definido como tal en HTML5 mediante <input type="email" …​>, el valor introducido se valida en el navegador de manera que cuando el valor introducido no es un email válido muestra un pop-up con el texto "Introduzca una dirección de correo." Este tipo de pop-ups no se pueden capturar con el menú contextual de Selenium IDE (botón derecho sobre el texto a validar), por lo que debemos usar un método alternativo.

selenium ide email incorrecto
Figura 6. Pop-up de validación en HTML5: email incorrecto

Para ello, tras hacer click sobre el botón de enviar, debemos usar el comando execute script de Selenium IDE para que guarde el valor del atributo validationMessage del campo tipo email en una variable, y a continuación comprobamos el valor almacenado en esa variable. El resultado sería tal que así:

selenium ide email incorrecto commands
Figura 7. Comandos en Selenium IDE para validar el mensaje de email incorrecto.
1 Guarda el contenido del atributo validationMessage del campo con id email-address en la variable message:
  • Command: execute script

  • Target: return document.getElementById("email-address").validationMessage

  • Value: message.

2 Muestra la variable message en el log de Selenium IDE.
3 Validación de que el valor de message es el esperado.

El comando execute script permite acceder a los elementos y propiedades del DOM del documento HTML, y llamar a los métodos del mismo, en concreto en el ejemplo llama a getElementById("fieldId").

En caso de que el elemento no se pueda identificar por su id, como alternativa se usar el método getElementsByName("fieldName"), pero ten en cuenta que getElementsByName devuelve una colección de objetos HTMLCollection en lugar de un único objeto, por lo que si queremos acceder al primer elemento de la colección simplemente tenemos que añadir la posición entre corchetes: getElementsByName("fieldName")[0].

Esta solución también se puede aplicar a otros campos de HTML5 que también crean este tipo de pop-ups para la validación, por ejemplo los campos que se establecen como requeridos, o con una longitud mínima y máxima, definidos por ejemplo así: <input type="password" required minlength="6" maxlength="10"/>

selenium ide contraseña requerida
Figura 8. Pop-up de validación en HTML5: contraseña requerida
selenium ide contraseña requerida assert
Figura 9. Comandos en Selenium IDE para validar contraseña vacía.
selenium ide contraseña incorrecta
Figura 10. Pop-up de validación en HTML5: contraseña demasiado corta

Otro ejemplo son los campos de fecha definidos como <input type="date" …​>

date picker chrome error message
Figura 11. Pop-up de validación en HTML5: fecha incorrecta

Los mensajes de validación son distintos en cada navegador (Firefox, Chrome), tenlo en cuenta a la hora de definir el assert. También hay que considerar el idioma en el que esté configurado el navegador (En Firefox, en su repostorio selecciona el idioma deseado y busca el archivo dom/chrome/dom/dom.properties, y en Chrome lo encontrarás en el archivo del idioma, en español content_strings_es.xtb).

Table 1. Validación de email incorrecto en Firefox y Chrome

logo.eb1324e44442

chrome logo

selenium ide email incorrecto firefox

selenium ide email incorrecto chrome

Como acabamos de ver en el punto anterior, puede ser necesario que en función del navegador que estemos usando o del idioma en que esté configurado dicho navegador, nuestro assert deba validar un mensaje u otro.

4.3. Control de flujo en Selenium IDE

Selenium IDE permite añadir sentencias de control de flujo como condicionales y bucles.

El siguiente ejemplo usa de la propiedad navigator.userAgent que incluye información del navegador que se está utilizando en la ejecución del test.

execute script | return navigator.userAgent  |  valor_navigatoruserAgent
if             | ${navigatoruserAgent}.includes("Firefox")
assert         | message | Ajústese al formato solicitado: 8 character password.
end            |
if             | ${navigatoruserAgent}.includes("Chrome")
assert         | message | Utiliza un formato que coincida con el solicitado
end            |
selenium ide conditional navigators
Figura 12. Uso de condicional para distinguir entre navegadores

De igual forma, la propiedad navigator.language puede ayudarnos a identificar el idioma del navegador: es_ES para español, en_GB para inglés.

5. Desplegar la aplicación en Azure

La aplicación que hemos probado localmente, debemos ponerla "en producción", es decir, desplegarla en Azure para que esté disponible por nuestros usuarios (ficticios).

Dependiendo de la plantilla elegida, el despliegue será distinto. Los tutoriales indican como hacerlo mediante Web Apps.

Si los test los has creado en el entorno de desarrollo, es decir, en nuestro equipo local, deben adaptarse para que funcionen en entorno de producción es decir, deben atacar a la aplicación desplegada. Para ello simplemente tendrás que cambiar la URL base.