Automatización de Pruebas Funcionales: Serenity BDD+Screen Play+Java

Marcela Soto
8 min readOct 16, 2019

--

¿Qué es Serenity BDD?

Es una librería de código abierto que ayuda a escribir pruebas de aceptación automatizadas de mayor calidad y más rápido.

Sus principales características son:

  • Escribir test flexibles y fáciles de mantener
  • Generar informes ilustrativos sobre las pruebas
  • Ajustar las pruebas automatizadas a las necesidades del proyecto
  • Ver cuanto de la aplicación se está probando

¿Y Cucumber?

Esta pregunta me la hacía cuando estaba realizando la investigación sobre Serenity BDD, ¿Dónde queda Cucumber? ¿ya no lo usamos?. A lo que concluyo que Cucumber está inmerso en Serenity, podemos hacer la analogía de que Serenity es el padre de Cucumber. Estos dos los usamos cuando escribimos las .feature en el lenguaje Gherkin.

¿Que es Screen Play?

  • Es un patrón de diseño orientado al comportamiento BDD
  • Presenta un alto desacoplamiento de la interfaz de usuario
  • Propone trabajar en términos de tareas y no de interfaz de usuario

El patrón Screen Play cumple con los principios SOLID. Para leer un poco más sobre esto te recomiendo visitar. https://enmilocalfunciona.io/principios-solid/

¿Por qué Screen Play y no Page Object?

El patrón Page Object no cumple con algunos de los principios SOLID recomendados para realizar código flexible y mantenible. Ver

Arquitectura de Screen Play

Arquitectura de screen play

CAPAS PRINCIPALES

Features:En esta capa se escriben los archivos .feature, estos describen las características y escenarios a probar haciendo uso del lenguaje Gherkin.

Ejemplo: Feature: Youtube

Runners: Contiene los archivos runner encargados de ejecutar los escenarios de la feature. Se usan las anotaciones @RunWhit() @CucumberOptions() para especificar qué ejecutar y cómo hacerlo.

Example Runners

Step Definitions: Gestiona los code snippets de los steps definidos con las palabras Given, When, Then en los escenarios de los archivos .feature

Code snippets:Son métodos que mapean las instrucciones de los escenarios

Tasks: Esta clase contiene las clases que son el corazón del patrón de screenplay=Las tareas. Las tareas son acciones de alto nivel que definen un conjunto de interacciones en el lenguaje de negocio.

Interactions: Se encargan de las interacciones con la interfaz de usuario.Muchas interacciones ya fueron desarrolladas y se encuentran disponibles gracias a las librerías de screenplay y de serenity BDD. Ejemplo: Open, Click, Enter, Hit, SelectFromOptions….

Questions: Esta capa gestiona los Asserts o verificaciones de las pruebas las cuales son el fin ultimo de las mismas, ya que con estas capturamos la información de la interfaz que puede ser usada. Text,Value, Visibility…

User interface: Almacena las clases en las cuales se mapean los elementos de la interfaz de usuario o inputs o botones.

Unicamente se mapean los elementos, las interacciones con los mismos se llevan a cabo por las interacciones en la capa de interactions

CAPAS TRANSVERSALES

Models: Los objetos de negocio son una abstracción de un ente real o virtual, modelado mediante atributos y métodos

Utils: Contiene clases con los métodos unitarios que pueden ser utilizados libremente por otras clases del proyecto como: Conversores, Waits, verificadores…

Exceptions: Esta es una capa muy importante que tiene como objetivo dar manejo a los errores que pueden presentarse en la aplicación. Es una capa sensible al negocio y particular a cada proyecto.

NUESTRO PRIMER PROYECTO

Se necesita validar que al ingresar una palabra en Inglés en Google Traslate esta palabra quede correctamente traducida en español.

Paso 1: Verificar Gradle y Cucumber

Para este proyecto usaremos Gradle donde cargamos las dependencias y plugins necesarios para el proyecto, en el archivo build.gradle.

Para este proyecto usamos el IDE Eclipse. Debemos revisar si tenemos instalado cucumber y gradle en el IDE.

Nos ubicamos en la ruta Help>Eclipse Marketplace y buscamos cucumber y gradle validamos si estan instalados si no, realizamos la instalación.

Paso 2: Creación de proyecto Gradle

Seleccionamos File>New>Project y seleccionamos Gradle. Insertamos el nombre del proyecto y continuamos. Al terminar se crea el proyecto y su estructura básica.

Paso 3: Configuración del build.gradle

Este contiene los plugins, características y gestión de dependencias.

Para descargar todas las dependencias nos ubicamos en el archivo build.gradle hacemos clic derecho Gradle>Refresh Gradle project.

Paso 4: Arquetipo base para el proyecto

Aquí creamos el proyecto con la estructura de nuestro modelo screen play.

Paso 5: Crear nuestra primer .feature

La .feature debe ubicarse en el paquete src/test/resources/features , haciendo clic derecho sobre el paquete features>New>File, en el nombre agregamos al final el .feature. Para nuestro ejemplo, la llamamos google_traslate.feature.

Escribimos la .feature en términos del negocio, realizamos primero una breve descripción general usando As a, I want to y To, y en el scenario escribimos el detalle usando Given, When and Then. Cuando escribimos el Given aquí añadimos a nuestro Actor para hacerlo más cercano al negocio, la idea es describir Que se está haciendo no Cómo.

Paso 6:Crear nuestra clase Runner

@RunWith Ejecuta el test y genera el informe en serenity, @CucumberOptions, Nos dice que vamos a ejecutar

  • Features: Insertamos la ruta donde está el archivo .feature
  • Glue: Insertamos la ruta donde van a quedar los steps definitions
  • Snippets: Nombre de los pasos a ejecutar en CAMEL

Una vez se ejecute el runner el va a ir a buscar al .feature que estamos especificando donde está cada uno de los pasos del escenario que se desea correr, nos va a generar los snippets que son los métodos Java que se mapean. Estos pasos de la notación Gherkin por defecto lo hacen usando exactamente las mismas palabras, pero nosotros vamos a decirle que lo haga en CAMEL, quitando todos los espacios y colocando todas las iniciales en mayúscula a excepción de la primera.

Paso 7: Correr la clase Runner

Aquí desde la clase Runner corremos el programa con JUnit donde el nos mostrará los snippets que utilizaremos en nuestros stepts definitions. Los snippets los copiamos para pegarlos en el paso 8.

Paso 8: Crear Step Definitions

Creamos la clase en el paquete step definitions haciendo clic derecho New>Class>Nombre de la clase en CAMEL y al final agregamos la frase StepDefinitios. Abrimos la clase y pegamos los snippets. Borramos las excepciones y para importar las anotaciones usamos el comando cmd+shift+o.

Paso 9: Agregar el Driver del navegador

Para nuestro ejercicio vamos a usar el navegador Chrome, debemos descargarlo de la aquí , se recomienda descargar el driver con la misma versión que tengamos instalada actualmente, se descomprime el archivo descargado y lo ubicamos en la raíz del proyecto en el workspace. Seguido en la clase de stepsdefinitions realizamos el llamado del navegador.

Paso 10: Crear el Actor

Instanciar la clase del Actor es lo principal en screenplay, este método ayuda a tener una alta cohesión y bajo acoplamiento, se concentra en su responsabilidad que es llevar al actor a ejecutar tareas. Screenplay no usa el driver directamente, si no el actor, para esto necesitamos conectar estas dos variables.Dentro de la instancia le damos habilidades al Actor.

Paso 11: Nuestra primer tarea-Abrir el navegador

Para esto se crea el paso en la clase stepdefintions donde usamos WasAbleTo en Given que indica si el actor pudo realizar la tarea, para este caso es Abrir en navegador, nos ubicamos en el paquete task y creamos la tarea con el nombre OpenTheBrowser, tener en cuenta que las tareas son interfaces es una entidad de Java que contiene la firma de los métodos.

Paso 12: Encontrar los elementos

Dentro de los stepts definition en Given creamos el paso de ir a la app. En el paquete de tareas creamos la clase GoTo, que contiene nuestra tarea de ir y hacer Click sobre los Elementos.Estos elementos se crean en el paquete Userinterface creando una nueva Clase, aquí la llamamos GoogleAppsComponent, que contiene los elementos ubicados, para este caso es dar click sobre el botón que muestran las Apps y hacer Click en Traslate, cuando encontramos los elementos y estos tienen id, name o class, se usa Ej:located(By.id(“dasd”)) y si es xpath o CSS se usa locatedBy(Xpath).

Paso 13: Agregar los elementos del traductor

En este paso se crea la clase nueva GoogleTraslatePage en el paquete de userinterface y se buscan los elementos de la misma manera que el paso anterior.

Paso 14: Terminar el Test

Se agregan todos los elementos en la clase de GoogleTraslatePage, y se inserta el texto a traducir. Si todo funciona OK, debemos obtener el siguiente resultado

Leer más acerca de Serenity BDD.

Enlaces recomendados:

--

--