manuales_desarrollo

Manuales de desarrollo de YeboYebo


Project maintained by yeboyebo Hosted on GitHub Pages — Theme by mattgraham

Testing / Tests Eneboo QS

Lectura previa

La convención en cuanto a nomenclatura es que el fichero se llame igual que la clase que queremos probar, seguido de .test.qs

Ejemplo: FacturasTotalizador.qs => FacturasTotalizador.test.qs

Si no has configurado el entorno de test, puedes hacerlo en Configuración Testing Eneboo

Como lanzar Lanzar los tests

Lo haremos con el siguiente comando:

# SQLite
~/ruta_hacia_eneboo/bin/eneboo -silentconn "test:yeboyebo:SQLite3:nogui" -c "formTestQs.runner" -a "./:unit" -q

# PostgreSQL
~/ruta_hacia_eneboo/bin/eneboo -silentconn "test:user:PostgreSQL:localhost:5432:password:nogui" -c "formTestQs.runner" -a "./:unit" -q

Parámetros

El primer parámetro corresponde a la ruta sobre la que vamos a lanzar los tests. Esta ruta es relativa al path que añadimos en la configuración.

El segundo parámetro corresponde al tipo de tests que queremos lanzar. Disponemos actualmente de dos opciones “unit” y “integration”. Los test unitarios tienen una extensión “xxx.test.qs” y se componen de tests que no necesitan ningún tipo de infraestructura para funcionar. Mientras tanto, los test de integración tienen la extensión “xxx.itest.qs” y es necesario arrancar infraestructura como base de datos, apis, etc…para poder lanzarlos.

Creación de un nuevo test

Supongamos que queremos testear nuestra clase FacturasTotalizador. Para ello, lo primero que debemos hacer es crear un nuevo fichero FacturasTotalizador.test.qs

Dentro crearemos una función con el mismo nombre que el fichero precedido de la palabra Test y, después, escribiremos el nombre de la función a modo de export.

function TestFacturasTotalizador() {}

TestFacturasTotalizador;

Agregando contexto

Los tests deben estar encapsulados en una función que les de contexto, para esto utilizamos describe, que viene incluido en el parámetro que recibe la función (que hemos llamado t por ser concisos). describe recibe un texto a modo de título (recomendable utilizar el nombre del fichero o una versión extendida de este), y una función callback que incluirá posteriormente nuestros tests.

function TestFacturasTotalizador(t) {
  t.describe("TestFacturasTotalizador", function () {});
}

TestFacturasTotalizador;

Añadiendo casos de uso

Cada uno de nuestros tests necesita su propio caso de uso, donde comprobaremos escenarios como “la factura debe tener un total de 150€” o “la comisión debe ser 0 cuando el agente no tiene el % de comisión indicado”. Para esto vamos a utilizar test, también incluido en nuestro parámetro t. test, al igual que describe, recibe un título y un callback.

function TestFacturasTotalizador(t) {
  t.describe("TestFacturasTotalizador", function () {
    t.test("la factura debe tener un total de 150€", function () {});
    t.test(
      "la comisión debe ser 0 cuando el agente no tiene el % de comisión indicado",
      function () {}
    );
  });
}

TestFacturasTotalizador;

Comprobando que realmente es correcto

Para hacer estas comprobaciones, nuestro parámetro t incluye una librería expect, a la que le pasaremos el valor a comprobar y tendremos una serie de funciones de comprobación. Por ejemplo: toBe, toBeTruthy, toBeFalsy, toHaveLength, toBeDefined, etc…

Supongamos que tenemos acceso a FacturaMother y FacturasTotalizador ya que ese no es el objetivo de esta lección:

function TestFacturasTotalizador(t) {
  t.describe("TestFacturasTotalizador", function () {
    t.test("la factura debe tener un total de 150€", function () {
      const factura = FacturaMother.random();

      const totalizer = new FacturasTotalizador();
      const totalizada = totalizer.run(factura);

      t.expect(totalizada.total).toBe(150);
    });
    t.test(
      "la comisión debe ser 0 cuando el agente no tiene el % de comisión indicado",
      function () {
        const factura = FacturaMother.clienteSinComision();

        const totalizer = new FacturasTotalizador();
        const totalizada = totalizer.run(factura);

        t.expect(totalizada.comision).toBe(0);
      }
    );
  });
}

TestFacturasTotalizador;

Más funcionalidad. Hooks

Adicionalmente, se pueden añadir 4 testing hooks a nuestros tests. Son los siguientes (en orden de llamada): beforeAll, beforeEach, afterEach y afterAll.

Por supuesto están disponibles en nuestro parámetro t.

Es importante destacar que deberán declararse antes de describe.

En este caso, vamos a sacar la funcionalidad común de crear el totalizador en cada test. Lo haremos con un beforeEach para que se ejecute antes de cada test.

function TestFacturasTotalizador(t) {
  var totalizer;

  t.beforeEach(function () {
    totalizer = new FacturasTotalizador();
  });

  t.describe("TestFacturasTotalizador", function () {
    t.test("la factura debe tener un total de 150€", function () {
      const factura = FacturaMother.random();
      const totalizada = this.totalizer.run(factura);

      t.expect(totalizada.total).toBe(150);
    });
    t.test(
      "la comisión debe ser 0 cuando el agente no tiene el % de comisión indicado",
      function () {
        const factura = FacturaMother.clienteSinComision();
        const totalizada = this.totalizer.run(factura);

        t.expect(totalizada.comision).toBe(0);
      }
    );
  });
}

TestFacturasTotalizador;