2017-12-16 13:29:42 +01:00
---
id: unit-testing
2018-06-20 07:46:52 +02:00
title: "Tests Unitarios"
2017-12-16 13:29:42 +01:00
---
2018-06-20 07:46:52 +02:00
Todos los tests están divididos entre tres carpetas:
2017-12-16 13:29:42 +01:00
2018-06-20 07:46:52 +02:00
- `test/unit` - Tests que cubren funciones que transforman datos de forma no-trivial. Estos tests simplemente `require()` (requieren de) algunos archivos y código de ejecución, por lo que son muy rápidos.
- `test/functional` - Tests que ejecutan una instancia de verdaccio y realizan una serie de peticiones a esta sobre http. Son de mayor lentitud en comparación a los tests unitarios.
- `test/integration` - Tests que ejecutan una instancia de verdaccio y realizan peticiones a esta usando npm. Son considerablemente lentas y pueden incidir sobre un registro real de npm. **test sin mantenimiento**
2017-12-16 13:29:42 +01:00
2018-06-21 07:44:00 +02:00
Los tests de tipo unit y functional son ejecutados automáticamente al correr `npm test` desde el directorio raíz del proyecto. Los tests de tipo integration se suponen deben ser ejecutados de forma manual ocasionalmente.
2017-12-16 13:29:42 +01:00
2018-06-20 07:46:52 +02:00
Utilizamos `jest` para todos los tests.
2017-12-16 13:29:42 +01:00
2018-06-20 07:46:52 +02:00
## El Script npm
2017-12-16 13:29:42 +01:00
2018-06-20 07:46:52 +02:00
Para ejecutar el script de test puedes utilizar tanto `npm` como `yarn` .
2017-12-16 13:29:42 +01:00
yarn run test
2018-06-20 07:46:52 +02:00
Esto accionará solo los primeros dos grupos de tests, unit y funtional.
2017-12-16 13:29:42 +01:00
2018-06-20 07:46:52 +02:00
### Usando test/unit
2017-12-16 13:29:42 +01:00
2018-06-21 07:44:00 +02:00
El siguiente es simplemente un ejemplo de cómo se debe ver un test unitario. Básicamente, sigue el estándar `jest` .
2018-01-21 00:04:36 +01:00
2018-06-20 07:46:52 +02:00
Intenta describir exactamente qué hace el test unitario en una sola frase en el encabezado de la sección `test` .
2017-12-16 13:29:42 +01:00
```javacript
2018-01-21 00:04:36 +01:00
const verdaccio = require('../../src/api/index');
const config = require('./partials/config');
2018-06-20 07:46:52 +02:00
describe('basic system test', () => {
2017-12-16 13:29:42 +01:00
2018-01-21 00:04:36 +01:00
beforeAll(function(done) {
2018-06-20 07:46:52 +02:00
// algo importante
2018-01-21 00:04:36 +01:00
});
2017-12-16 13:29:42 +01:00
2018-01-21 00:04:36 +01:00
afterAll((done) => {
2018-06-20 07:46:52 +02:00
// deshacer algo importante
2018-01-21 00:04:36 +01:00
});
2017-12-16 13:29:42 +01:00
2018-01-21 00:04:36 +01:00
test('server should respond on /', done => {
2018-06-20 07:46:52 +02:00
// tu test
2018-01-21 00:04:36 +01:00
done();
});
});
2017-12-16 13:29:42 +01:00
```
2018-06-20 07:46:52 +02:00
### Usando test/functional
2017-12-16 13:29:42 +01:00
2018-06-21 07:44:00 +02:00
Los tests funcionales en verdaccio acarrean un mayor nivel de complejidad que amerita una explicación profunda para asegurar el éxito de tu experiencia.
2017-12-16 13:29:42 +01:00
2018-06-21 07:44:00 +02:00
Todo inicia en el archivo `index.js` . Adentrémonos en este.
2017-12-16 13:29:42 +01:00
```javascript
2018-06-20 07:46:52 +02:00
// creamos tres instancias de servidores
2018-01-21 00:04:36 +01:00
const config1 = new VerdaccioConfig(
'./store/test-storage',
'./store/config-1.yaml',
'http://localhost:55551/');
const config2 = new VerdaccioConfig(
'./store/test-storage2',
'./store/config-2.yaml',
'http://localhost:55552/');
const config3 = new VerdaccioConfig(
'./store/test-storage3',
'./store/config-3.yaml',
'http://localhost:55553/');
const server1: IServerBridge = new Server(config1.domainPath);
const server2: IServerBridge = new Server(config2.domainPath);
const server3: IServerBridge = new Server(config3.domainPath);
const process1: IServerProcess = new VerdaccioProcess(config1, server1, SILENCE_LOG);
const process2: IServerProcess = new VerdaccioProcess(config2, server2, SILENCE_LOG);
const process3: IServerProcess = new VerdaccioProcess(config3, server3, SILENCE_LOG);
const express: any = new ExpressServer();
...
2018-06-20 07:46:52 +02:00
// revisamos si todas las instancias han sido iniciadas, desde su ejecución en procesos independientes
2018-01-21 00:04:36 +01:00
beforeAll((done) => {
Promise.all([
process1.init(),
process2.init(),
process3.init()]).then((forks) => {
_.map(forks, (fork) => {
processRunning.push(fork[0]);
});
express.start(EXPRESS_PORT).then((app) =>{
done();
}, (err) => {
done(err);
});
}).catch((error) => {
done(error);
});
2017-12-16 13:29:42 +01:00
});
2018-06-20 07:46:52 +02:00
// al finalizarlas, nos aseguramos de que han sido detenidas
2018-01-21 00:04:36 +01:00
afterAll(() => {
_.map(processRunning, (fork) => {
fork.stop();
});
express.server.close();
2017-12-16 13:29:42 +01:00
});
2018-01-21 00:04:36 +01:00
2017-12-16 13:29:42 +01:00
```
2018-06-20 07:46:52 +02:00
### Uso
2018-01-21 00:04:36 +01:00
2018-06-21 07:44:00 +02:00
Aquí describiremos cómo se ve un test funcional típico.
2017-12-16 13:29:42 +01:00
2018-06-20 07:46:52 +02:00
#### El lib/server.js
2017-12-16 13:29:42 +01:00
2018-06-20 07:46:52 +02:00
La clase de servidor es tan solo un wrapper que simula un cliente `npm` y proporciona un API simple para el test funcional.
2017-12-16 13:29:42 +01:00
2018-06-20 07:46:52 +02:00
Como mencionamos en la sección previa, estamos creando 3 servidores de proceso que son accesibles en cada proceso como `server1` , `server2` y ``server3`.
2017-12-16 13:29:42 +01:00
2018-06-20 07:46:52 +02:00
Usando dichas referencias serás capaz de enviar peticiones a cualquiera de las 3 instancias en ejecución.
2017-12-16 13:29:42 +01:00
```javascript
2018-01-21 00:04:36 +01:00
< br / > export default function(server) {
2018-06-20 07:46:52 +02:00
// recibimos cualquier instancia de servidor a través de argumentos
2018-01-21 00:04:36 +01:00
test('add tag - 404', () => {
2018-06-20 07:46:52 +02:00
// interactuamos con la instancia de servidor.
2018-01-21 00:04:36 +01:00
return server.addTag('testpkg-tag', 'tagtagtag', '0.0.1').status(404).body_error(/no such package/);
2017-12-16 13:29:42 +01:00
});
2018-01-21 00:04:36 +01:00
});
2017-12-16 13:29:42 +01:00
```
### Test/integration
2018-06-21 07:44:00 +02:00
Esta sección no ha sido usada jamás, pero estamos buscando ayuda con la intención de poder ejecutarla apropiadamente. **Toda idea nueva es bien recibida.**