Manuales de desarrollo de YeboYebo
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
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
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.
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;
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;
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;
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;
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;