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
Í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
Pruebas de código asíncrono
No basta con correr el código y ver el resultado
Requieren una librería especial
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(callback, args...)
Llama a la callback después de los eventos de I/O
y antes de setTimeout()
y setInterval()
Ayuda de testing
testing.run([test function], callback);
testing.success("Well done!", callback);
Comprueba que el valor pasado sea igual al esperado
testing.equals([value], [expected], message, callback);
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
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 existenteAyuda
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);
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
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
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,931