QA

API Testing con KarateDSL

Publicado por
Mauro Valls
API Testing con KarateDSL
Escrito por
Mauro Valls
Publicado en
March 9, 2023
Tiempo de lectura
Categoría
QA

Karate

¡No, me refiero al deporte! Karate es una herramienta de código abierto, fácil de manejar para personas que no poseen conocimientos de programación. Esta herramienta combina la automatización de API y las pruebas de rendimiento en un marco único.

12 razones por las que debes usar Karate

  1. Es Open Source.
  1. Tiene una gran comunidad.
  1. No necesitas tener conocimientos de programación previos.
  1. Es fácil de escribir, fácil de leer y entender.
  1. Desarrollas productividad, mantenibilidad y calidad.
  1. JSON es nativo.
  1. Amigable con todo lo que es integración continua.
  1. Muy fácil hacer Assertion.
  1. Soporta REST y SOAP.
  1. Soporta pruebas de performance.
  1. Permite test en paralelo sin añadir scripts adicionales.
  1. Trae su propio reporte, pero se puede integrar el reporte de Cucumber.

Llegó la hora de la acción y que comiences tus primeras pruebas de Karate

Para esto vamos a utilizar Java 8+ y como entorno de desarrollo tenemos Intellij IDEA. Vamos a crear un proyecto de JAVA basado en Gradle y para probar usaremos https://reqres.in/.

Comencemos:

Paso 1: Construir nuestro build.gradle

Gradle es un sistema de automatización de construcción de código de software, que nos va a permitir integrar con terceros, programar tareas, escribir en varios lenguajes, etc.

  1. Especificamos los plugins que vamos a usar; necesitamos todas las herramientas de JAVA mediante un id. Con este id le decimos a Gradle que se traiga todas las nuevas tareas de JAVA.
  1. Especificamos el repositorio de donde Gradle va a descargar las dependencias.
  1. Especificamos las dependencias que vamos a descargar; en este caso la librería de Karate.

 

Con tan solo esto ya podemos ejecutar nuestro primer test:

paso 1

Método GET

PASO 1: Vamos a armar la estructura de carpetas y el archivo feature

Karate nos recomienda tener 1 o 2 como máximo nivel de profundidad de carpetas

  1. Vamos a ir a la carpeta test del proyecto, luego creamos la primera carpeta llamada users y dentro de la carpeta users vamos a crear otra carpeta llamada get y así darle como máximo 2 niveles de profundidad
  1. Dentro de la carpeta get vamos a crear nuestro primer archivo feature, en este caso se llamara “user-get.feature”.

carpetas

Paso 2: Armamos el escenario

En este caso, un método GET que trae un usuario en específico.

Nuestro Endpoint es el siguiente:

metodo get

  1. Scenario: es el título, algo general de lo que va a hacer el escenario.
  1. Given: paso que se usa para describir el contexto inicial del sistema (acá usamos la palabra clave “url” que nos da Karate).
  1. When: lo vamos a utilizar para la acción que realizaremos (en este caso usamos la palabra clave “method” que nos da Karate).
  1. Then: permite describir el resultado esperado (usamos la palabra clave “status” que nos brinda Karate).

Scenarios

Paso 3: Ejecutamos y vemos el resultado por consola

Por consola vamos a poder observar un log donde podremos revisar cuál es el request, response, el tiempo de respuesta, etc.

resultado consola 1

resultado consola 2

resultado consola 3

Método POST

Paso 1: Creamos la carpeta y archivo requerido

  1. Dentro de la carpeta users creamos una carpeta llamada “post”.
  1. En esta última creamos un nuevo archivo feature; en este caso se llamara “user-post.feature”.

user-post.feature

En este ejemplo vamos a crear un usuario. Para ello tomamos el siguiente Endpoint, donde observamos cuál es la respuesta que se espera y el formato del JSON que irá en el body:

Request

Paso 2: Armamos el escenario

A diferencia del método GET, aquí vamos a realizar algunos cambios:

  1. Scenario: al igual que en el método anterior, este título indica en general lo que se hará en el escenario.
  1. Given: se usa para describir el contexto inicial del sistema (acá usamos la palabra clave “url” que nos da Karate).
  1. And: nuevo paso para mencionar la palabra clave “request” que nos brinda Karate; esto es para enviarle un JSON en un body.
  1. When: lo vamos a utilizar para la acción que llevará a cabo (en este caso usamos la palabra clave “method” que nos da Karate).
  1. Then: permite describir el resultado esperado (usamos la palabra clave “status” que nos brinda Karate).

Status

Paso 3: Ejecutar y ver los resultados

 

Validación adicional

¿Cómo podemos validar que un response nos trae un valor que esperamos en un atributo especifico?

Sigamos con el ejemplo del método GET, que nos trae un usuario en específico y nosotros queremos validar que el e-mail de ese usuario es el esperado. En este caso, solo utilizaremos la palabra clave que nos brinda Karate: “match”.  

  1. Debemos mapear la etiqueta e-mail; en este caso lo hacemos de la siguiente manera: “$.email”, lo cual nos traerá el valor de e-mail.
  1. Ponemos una condición donde le decimos que $.email tiene que ser igual a janet.weaver@reqres.in.

Mach

Background y variables

Si en todos los escenarios de una misma feature se cumplen algunas precondiciones, es mucho más práctico usar un Background que escribir lo mismo varias veces. Esto sirve como una serie de pasos que se van a ejecutar antes de todos los escenarios de la feature. Veamos un ejemplo:

Background

Podemos observar la creación de una variable llamada “var” con el valor que es un JSON, el cual queremos enviar en el escenario. Dentro del escenario llamamos a la variable “var” para que la tome.

Una variable es donde se guardan en memoria (y se recuperan) datos que se utilizan en un programa cuando escribimos código. Las variables se utilizan para:

  • Guardar datos y estados.
  • Asignar valores de una variable a otra.
  • Representar valores dentro de una expresión matemática.
  • Mostrar valores por pantalla.

Aquí vamos a declarar variables con la siguiente sintaxis:

def var

Scenarios Outline

Son un tipo de escenario donde se especifican datos de entrada. Son muy prácticos, ya que gracias a esto no es necesario escribir un escenario por dato de entrada, por ejemplo:

Scenario Outline

Ejecuciones en paralelo

Karate nos brinda la funcionalidad de las ejecuciones en paralelo, con lo que se reducen los tiempos de ejecución.

¿Cómo empezamos?

  • Paso 1: Agregar una clase JAVA dentro de la carpeta users llamada “RunnerTest”.

RunnerTest

RunnerTest

RunnerTest

Paso 2: Dentro de la clase “RunnerTest”, agregamos un método que se va a encargar de ejecutar nuestras pruebas en paralelo; este método lo vamos a llamar “parallelExecution()” y va a ser un método void el cual no va a devolver nada.

parallelExecution

Paso 3: Dentro del método vamos a crear el ejecutable que se va a encargar de ejecutar todo lo que indiquemos en el path, luego vamos a ignorar los tags y, por último, vamos a elegir cáantos hilos queremos que se ejecuten.

ejecutable

Paso 4: Para que se ejecute el método vamos a colocar por encima del método @Test. Con esto JUnit nos ayudará a ejecutar el método especificado.

test

Paso 5: Como nosotros colocamos el @Test por encima del método que creamos para ejecutar las pruebas en paralelo, debemos dirigirnos al build.gradle y especificar que cuando encuentre un @Test lo ejecute con la plataforma de Junit. Para eso colocamos las siguientes líneas:

JUnit

Paso 6: Último y muy importante, Karate tiene la extensión de archivos .feature, pero Gradle dice que los archivos que no tengan .java vayan en la ruta src/test/resources. Como nosotros tenemos los archivos .feature dentro de la ruta src/test/java, debemos agregar algo más en el build.gradle para que funcionen nuestras pruebas. Acá le decimos a gradle que busque los recursos de pruebas en una ruta especifica y le decimos que excluya todos los archivos .java.

feature

Paso 7: Por último, ejecutamos.

ejecutar

Reportes

Cuando se ejecuten las pruebas, se generará un informe para cada característica. Se nos va a informar dónde queda la ruta donde está el reporte. Esta se encuentra en la carpeta target/karate-reports/karate-summary.html. El informe propuesto por Karate está en formato HTML y su estructura es la siguiente:

reportes

Ejecuciones por consola de comandos

Podemos ejecutar nuestras pruebas de dos formas: desde nuestro IDE o por línea de comandos. Para el segundo caso se podrá ejecutar el siguiente comando Gradle:

Paso 1: Nos paramos sobre la carpeta del proyecto.

Paso 2: Ejecutamos el comando “gradlew clean test -i”.

ejecutar en consola

Conclusiones

A la hora de tomar un proyecto donde se requiera automatizar pruebas de nuestros servicios, vamos a tener la posibilidad de usar KarateDS, una gran herramienta opensource que está en continuo crecimiento y tiene una gran comunidad, la cual va creciendo día a día. No es necesario saber programar, por lo que es muy fácil de aplicar, enseñar y preparar a cualquier personal que se requiera. Además, nos permite ejecutar pruebas en paralelo; esto nos va a ayudar a reducir los tiempos de ejecución. Karate DSL no solo nos brinda un reporte propio en html muy bueno, sino que también tenemos la posibilidad de integrar los reportes de Cucumber. Por último, y no menos importante, podemos lograr integración continua.

What’s a Rich Text element?

The rich text element allows you to create and format headings, paragraphs, blockquotes, images, and video all in one place instead of having to add and format them individually. Just double-click and easily create content.

Static and dynamic content editing

A rich text element can be used with static or dynamic content. For static content, just drop it into any page and begin editing. For dynamic content, add a rich text field to any collection and then connect a rich text element to that field in the settings panel. Voila!

How to customize formatting for each rich text

Headings, paragraphs, blockquotes, figures, images, and figure captions can all be styled after a class is added to the rich text element using the "When inside of" nested selector system.

Descarga nuestro Clever UI KIT 👇

Gracias. Te será enviado un mail confirmando la inscripción
¡Ups! Algo salió mal al enviar el formulario.
Gracias. Por rellenar el formulario
¡Ups! Algo salió mal al enviar el formulario.
Gracias. Te será enviado un mail confirmando la inscripción
¡Ups! Algo salió mal al enviar el formulario.
Gracias. Te será enviado un mail confirmando la inscripción
¡Ups! Algo salió mal al enviar el formulario.
Gracias. Por rellenar el formulario
¡Ups! Algo salió mal al enviar el formulario.

Crea tu propio manual de marca con esta plantilla gratuita.
¡Organiza tus activos de diseño de forma más eficiente!