Introducción práctica a

para



Día 3: Pruebas asíncronas, npm

Vuestro anfitrión

Alex Fernández

Ingeniero senior en mediasmart

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.

  • npm. Anatomía de un paquete de Node.js.

  • Sesión práctica 3: Instalación

  • Sesión práctica 4: Tu primer módulo

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

Uses global functions

BDD-style programming


Sample:

 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 (1)

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 un objeto

function Client(params) {
    ...
}

Añadir una función al prototipo
Client.prototype.get = function(params) {
    ...
};

Especificación técnica (2)


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, ver qué pasa.


Arrancar y parar el servidor con una API de control

NPM

 

El gestor de paquetes de Node.js (entre otros)

Comandos NPM


  • npm install : instala un paquete (o varios)
  • npm install -g : instalación global
  • npm update : actualiza un paquete (o varios)
  • npm remove : elimina un paquete
  • npm test : corre los tests del paquete


Fuente: npm Dcoumentation

Resolución de Directorios

Local:

             node_modules
         ../node_modules
      ../../node_modules
   ...
$HOME/node_modules
          ./node_modules

Global:

{prefix}/lib/node_modules

donde {prefix} normalmente es /usr/local


Fuente: npm-folders

Sesión Práctica 3: instalación

Queremos usar el paquete simplecached


Instalación:

npm install simplecached

Importación con require:

var simplecached = require('simplecached');

Fuente: simplecached

Usa los paquetes importados


Importación con require:

var simplecached = require('simplecached');

    
var server = new simplecached.Server(port);

var client = new simplecached.Client(port);

client.set(key, value, function(error) {});

client.get(key, function(error, value) {}); 

¿Falla? ¡Es una condición de carrera!
Resuélvela

Usa npm


Corre npm install sin parámetros

Corre npm list para ver lo que tienes instalado

Corre npm update sin parámetros

Corre npm remove simplecached
y luego npm list

Good job!

Anatomía de un módulo


Fichero léeme: README.md


Definición: package.json


Punto de entrada: index.js


Código: lib/

Documentación: doc/

Binarios: bin/

aNATOMía de un package.json

{
    "name": "simplecached",
    "version": "0.0.1",
    "description": "Simplified memcached server.",
    "contributors": ["Alex Fernández "],
    "license": "MIT",
    "repository": {
        "type": "git",
        "url": "https://github.com/alexfernandez/simplecached"
    },
    "dependencies": {
        "testing": "0.1.x"
    },
    "keywords" : ["simplecached", "didactic", "memcached", "caching"],
    "bin": {
        "simplecached": "bin/server.js"
    },
    "scripts": {
        "test": "node test.js"
    },
}

Fuente: package.json

Especificación de versiones


  • "1.2.3": versión específica
  • ">=1.2.3": mayor que la dada
  • "~1.2.3" (churro): fija la versión menor (1.2.x) y más
  • "^1.2.3" (caret): fija la versión mayor (2.x.x) y más
  • "*" (asterisco): cualquier versión
  • URL: "http://asdf.com/asdf.tar.gz"
  • Git: "git+ssh://user@hostname:project.git#commit"



Fuente: package.json dependencies, semver


Sesión Práctica 4: Tu Primer Módulo


Mueve todo a su sitio:

  • Código a lib
  • Documentación a doc


Crea index.js que requiere el resto

Crea un package.json


Nombre y descripción


Autor(es)


Depende de simplecached



Usa npm


Corre npm install sin parámetros

Corre npm list para ver lo que tienes instalado

Publica con npm publish


¡Y ahora bórralo! con npm unpublish --force


¡Tachán!

Bonus track: binarios


Crea un script en bin/test.js


Corre las pruebas en el script


Añade el script al package.json


Corre el script con npm test

Fin del día 3


Introducción práctica a Node.js, día 3

By Alex Fernández

Introducción práctica a Node.js, día 3

Curso de Nodejs para devAcademy, día 3: pruebas asíncronas, npm. 2016-11-11.

  • 2,804