Introducción práctica a

para



Día 3: Pruebas asíncronas

Vuestro anfitrión

Alex Fernández

Ingeniero senior en LogTrust

Co-organizador de Node.js Madrid

@pinchito

Índice día 3


  • Librerías de pruebas: testing

  • Sesión práctica 1: Pruebas asíncronas

  • Pruebas automáticas

  • Sesión práctica 2: Probando simplecached

Librerías de pruebas


Testing

Tipos de pruebas


Pruebas unitarias


Pruebas de integración /  de sistemas


Pruebas de carga



Pruebas automáticas: ¡las mejores!

librerías de testing


Mocha


Vows


nodeunit


jasmine


and, of course, testing

Pruebas de código asíncrono


No basta con correr el código y ver el resultado


Requieren una librería especial


Se envía el éxito o fracaso a una callback

Mocha

Usa funciones globales

Estilo BDD (behaviour driven development)


Ejemplo:

 describe('User', function() {
describe('#save()', function() {
it('should save without error', function(done) {
var user = new User('Luna');
user.save(function(err) {
if (err) done(err);
else done();
});
});
});
});


Testing


No usa globales


No muy extendida


Más didáctica (¡espero!)


Documentación: testing

Sesión Práctica 1: prueba asíncrona


Comprobar que la función getFiveAsync() no da error


Comprobar que devuelve el valor 5


código a probar

Función que envía 5 a la callback

inmediatamente pero asíncrono

function getFiveAsync(callback) {
    setImmediate(function() {
        callback(null, 5);
    });
}


setImmediate()

setImmediate(callback, args...) 

Llama a la callback después de los eventos de I/O

y antes de setTimeout() y setInterval()


Ayuda de testing

Corre una prueba

testing.run([test function], callback);

Da la prueba por buena

testing.success("Well done!", callback);

Comprueba que el valor pasado sea igual al esperado

testing.equals([value], [expected], message, callback);

Comprueba que no haya error

testing.check(error, "There is an error", callback);

 

Fuente: testing

Good job!

Bonus Track


Cambiar la función para que devuelva otro valor


Devolver un error desde la función


Cambiar el valor esperado a cuatro


Cambiar a pruebas síncronas

Pruebas

automáticas

¡Automatiza!


Diseña una API de control


Arranca y para el sistema usando la API


Tests auto-contenidos: limpia al terminar 

Tres Reglas Básicas


Un solo botón


Haz los fallos visibles


Sin intervención manual

Sesión de prácticas 2: Simplecached


Crear un cliente de simplecached


Implementar get(), set(), delete()


Hacer pruebas con testing

Especificación técnica (cliente)

var client = new Client(host, port);

Crea un nuevo cliente

client.connect(callback);

Conecta al servidor simplecached

client.get(key, (error, value) => ...);

Obtiene un valor, o null si no existe

client.set(key, value, callback);

Añade un valor para una clave

client.delete(key, callback);
Borra una clave existente

Ayuda

Conectarse a un host y puerto

net.connect(port, host, listener)

Escuchar un evento una única vez

emitter.once(name, listener)

Crear una clase

class Client {
    constructor(params) {
        ...
    }
    get(key, callback) {
        ...
    }
}

Especificación técnica (test)


Hacer pruebas del cliente:

  • Buscar una clave, comprobar que no existe.
  • Guardar un valor cualquiera en la clave.
  • Obtener la clave de nuevo, comprobar que existe
  • Comprobar que tiene el valor guardado.
  • Modificar la clave.
  • Comprobar que tenemos el nuevo valor.
  • Borrar la clave.
  • Buscar la clave de nuevo, comprobar que no existe.

Good Job!

Bonus Track


Añadir un comando quit:

client.quit(callback);

Cierra el cliente.


Pruebas:
  • Probar a cerrar el cliente.
  • Intentar buscar una clave después de quit, ver qué pasa.

Bonus track: integración


Arrancar y parar el servidor con una API de control

Crear una prueba completa end-to-end
(Prueba de integración)

Reescribir la prueba de integración usando Mocha

Reimplementar con promesas o async/await

Fin del día 3