Jest y Cucumber, pueden cohexistir en un mismo proyecto?

Jest y Cucumber, pueden cohexistir en un mismo proyecto?

En el mundo del desarrollo de software, las herramientas de pruebas juegan un papel esencial para garantizar la calidad y la confiabilidad del código; dos de las opciones más populares en este ámbito son Jest y Cucumber. Ambas herramientas están diseñadas para facilitar la escritura y ejecución de pruebas, pero tienen enfoques y casos de uso distintos, en el pasado he utilizado ambas librerías y he aprendido mucho sobre como debería comunicar requerimientos, así como también tener mejor comprensión sobre que tipo de pruebas realizar, entonces veamos de que va cada uno, como se aplican y sus diferencias.

Jest

Jest, creado por Facebook, es un framework de pruebas para JavaScript, especialmente útil en aplicaciones construidas con React. Facilita pruebas unitarias e integración en un entorno único. Jest ofrece assertions (afirmaciones), mocks (simulaciones) y spies (espías) para facilitar la escritura y ejecución de pruebas.

Usando Jest:

function sum(a, b) {
  return a + b;
}

test('sum adds two numbers correctly', () => {
  expect(sum(2, 3)).toBe(5);
});

Cucumber

Cucumber sigue la metodología BDD y permite que equipos colaboren en la definición y validación del comportamiento del software a través de descripciones en lenguaje natural (Gherkin). Esto mejora la comprensión de requisitos y pruebas entre miembros del equipo.

Definiendo la prueba con Gherkin

Feature: Suma de dos números
  Como usuario
  Quiero sumar dos números
  Para obtener el resultado correcto

  Scenario: Suma de dos números positivos
    Given tengo los números 2 y 3
    When los sumo
    Then obtengo el resultado 5

Usando Cucumber:

const { Given, When, Then } = require('cucumber');
const { expect } = require('chai');

let num1, num2, resultado;

Given('tengo los números {int} y {int}', function (numero1, numero2) {
  num1 = numero1;
  num2 = numero2;
});

When('los sumo', function () {
  resultado = num1 + num2;
});

Then('obtengo el resultado {int}', function (resultadoEsperado) {
  expect(resultado).to.equal(resultadoEsperado);
});

Casos de Uso

Jest

  • Pruebas unitarias e integración: Ideal para componentes y funciones JS. Ofrece aserciones incorporadas para validar comportamiento y salidas esperadas.
  • Snapshots: Captura y compara automáticamente salidas visuales o estructurales para detectar cambios.
  • Mocks y espías: Simulación y espionaje avanzados para probar eventos y funciones con dependencias externas.

Cucumber

  • Colaboración entre desarrolladores y no desarrolladores: Permite que miembros no técnicos definan escenarios de prueba en lenguaje natural.
  • Validación de requisitos y comportamiento: Asegura que el software cumple con requisitos al basarse en escenarios de negocio.
  • Pruebas End-to-End (E2E): Pruebas de flujo de trabajo completo, simulan interacción del usuario.

Resultados

Jest

  • Detección Rápida de Errores: Identificación temprana de problemas.
  • Mantenimiento Simplificado: Facilita refactorización y detección de problemas.
  • Comunidad Activa: Soporte y recursos en línea abundantes.

Cucumber

  • Claridad en Requisitos: Traduce requisitos a lenguaje natural.
  • Alineación con Negocio: Asegura que software cumple objetivos del negocio.
  • Reducción de Malentendidos: Lenguaje natural reduce confusiones.

Combinando Jest y Cucumber

Ahora imagina un proyecto en el que estás desarrollando una aplicación web para un cliente que tiene requisitos muy específicos. Quieren asegurarse de que la aplicación cumpla con esos requisitos y, al mismo tiempo, garantizar la calidad técnica. Aquí es donde Jest y Cucumber pueden coexistir de manera beneficiosa.

Usando Jest:

function calculateTotal(items) {
  return items.reduce((total, item) => total + item.price, 0);
}

test('calculateTotal calculates the correct total', () => {
  const items = [{ price: 10 }, { price: 20 }, { price: 30 }];
  expect(calculateTotal(items)).toBe(60);
});

Escenario Cucumber:

Feature: Cálculo de Total
  Como usuario
  Quiero calcular el total de los artículos
  Para obtener un resumen financiero

  Scenario: Calcular el total de los artículos
    Given tengo los siguientes artículos:
      | Nombre | Precio |
      | Item 1 | 10     |
      | Item 2 | 20     |
      | Item 3 | 30     |
    When calculo el total
    Then obtengo un total de 60

Usando Cucumber:

const { Given, When, Then } = require('cucumber');
const { expect } = require('chai');

let items, total;

Given('tengo los siguientes artículos:', function (table) {
  items = table.hashes();
});

When('calculo el total', function () {
  total = calculateTotal(items);
});

Then('obtengo un total de {int}', function (expectedTotal) {
  expect(total).to.equal(expectedTotal);
});

Si prestas atención, notarás una estructura similar a un guion o una historia. Esto es parte de Gherkin, el lenguaje específico de dominio utilizado por Cucumber para describir el comportamiento. El encabezado "Feature" establece el contexto de la prueba, mientras que el escenario ("Scenario") define un caso de prueba específico.

  • Feature: Describe la característica que se está probando y proporciona un contexto general. En nuestro caso, es "Cálculo de Total".

  • Como usuario: Establece el contexto del usuario que realiza la acción.

  • Quiero calcular el total de los artículos: Describe la acción que el usuario desea llevar a cabo.

  • Para obtener un resumen financiero: Explica el propósito de la acción.

Luego, en el escenario ("Scenario"), usamos los bloques Given, When y Then para describir acciones específicas y expectativas:

  • Given: Establece el estado inicial o el contexto de la prueba.

  • When: Describe la acción que se está realizando.

  • Then: Describe la expectativa o el resultado esperado.

En resumen, Gherkin y los bloques Given, When y Then en Cucumber permiten describir pruebas de una manera legible y estructurada, ayudando a mantener la claridad y la comunicación en el equipo de desarrollo y con otros stakeholders.

Jest y Cucumber son poderosas, pero se enfocan en diferentes áreas. Jest es para pruebas técnicas, mientras que Cucumber es para validación de comportamiento y colaboración, antes de empezar a utilizar Cucumber la comunicación entre los products owners y yo era un poco complicada ya que transmitir las necesidades solía ser un tema bastante sensible, pero después de adoptar BDD, todo ha mejorado, así es que creo que es un buen consejo que podrías adoptar.

Happy coding! :D


Photo by Sarah Kilian on Unsplash

Jack Fiallos

Jack Fiallos

Te gustó este artículo?