¡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
Es Open Source.
Tiene una gran comunidad.
No necesitas tener conocimientos de programación previos.
Es fácil de escribir, fácil de leer y entender.
Desarrollas productividad, mantenibilidad y calidad.
JSON es nativo.
Amigable con todo lo que es integración continua.
Muy fácil hacer Assertion.
Soporta REST y SOAP.
Soporta pruebas de performance.
Permite test en paralelo sin añadir scripts adicionales.
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.
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.
Especificamos el repositorio de donde Gradle va a descargar las dependencias.
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:
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
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
Dentro de la carpeta get vamos a crear nuestro primer archivo feature, en este caso se llamara “user-get.feature”.
En este caso, un método GET que trae un usuario en específico.
Nuestro Endpoint es el siguiente:
Scenario: es el título, algo general de lo que va a hacer el escenario.
Given: paso que se usa para describir el contexto inicial del sistema (acá usamos la palabra clave “url” que nos da Karate).
When: lo vamos a utilizar para la acción que realizaremos (en este caso usamos la palabra clave “method” que nos da Karate).
Then: permite describir el resultado esperado (usamos la palabra clave “status” que nos brinda Karate).
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.
Método POST
Paso 1: Creamos la carpeta y archivo requerido
Dentro de la carpeta users creamos una carpeta llamada “post”.
En esta última creamos un nuevo archivo feature; en este caso se llamara “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:
Paso 2: Armamos el escenario
A diferencia del método GET, aquí vamos a realizar algunos cambios:
Scenario: al igual que en el método anterior, este título indica en general lo que se hará en el escenario.
Given: se usa para describir el contexto inicial del sistema (acá usamos la palabra clave “url” que nos da Karate).
And: nuevo paso para mencionar la palabra clave “request” que nos brinda Karate; esto es para enviarle un JSON en un body.
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).
Then: permite describir el resultado esperado (usamos la palabra clave “status” que nos brinda Karate).
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”.
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.
Ponemos una condición donde le decimos que $.email tiene que ser igual a janet.weaver@reqres.in.
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:
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:
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:
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”.
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.
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.
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.
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:
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.
Paso 7: Por último, ejecutamos.
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:
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”.
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.