Cómo puede probar sus aplicaciones Node.js con Ava.js

De todos modos, ¿por qué querrías escribir casos de prueba para tus aplicaciones? Bueno, es una pregunta que varios desarrolladores intentan esquivar, simplemente porque requiere esfuerzo y tiempo, y porque las pruebas manuales son mucho más satisfactorias. Haga clic ... haga clic ... complete un formulario ... Haga clic en ... Presto. Mi aplicación funciona, mis API son buenas, todo está bien.

Avance rápido hasta que se fusionen casi 30 solicitudes de extracción por día en su rama maestra. Ahora, ¿cómo se siente al probar 30 funciones manualmente o refactorizar un bloque de código y, sin saberlo, romper el código de otra persona?

En este punto, normalmente dirías: "Me gustaría haber escrito algunos casos de prueba para empezar". Así que inspírate un poco en Facebook: compartieron un artículo bastante interesante aquí, explicando cómo el equipo desarrolló React 16 con desarrollo impulsado por pruebas.

Las aplicaciones de nodo por sí mismas son bastante fáciles de construir. Hay mucho apoyo de la comunidad involucrado y, por lo general, obtendrá lo que necesita preguntando. Las aplicaciones de nodo pueden ser un gran servidor proxy para varios servidores API, lo que hace que las pruebas de sus terminales sean más cruciales.

En este artículo he cubierto cómo configurar y escribir casos de prueba básicos unidad con los informes de cobertura para aplicaciones Node.js .Así que entremos.

Hola Ava

Ava es un ejecutor de pruebas de JavaScript. Utiliza la naturaleza de E / S asíncrona de Node y ejecuta pruebas simultáneas, lo que reduce enormemente los tiempos de prueba.

Empecemos

En su directorio de trabajo, cree un package.jsonarchivo y agregue los siguientes paquetes:

yarn add ava babel-register

Cree una carpeta de pruebas . Es útil mantener sus pruebas en un solo lugar. También puede mantener los módulos de prueba / controladores allí.

Su actualización package.jsonahora debería verse así:

{ "name": "ava-test", "version": "1.0.0", "description": "", "main": "index.js", "scripts": { "start" : "node server.js", "test": "node_modules/.bin/ava tests/**/*.test.js --verbose", "test:watch": "node_modules/.bin/ava --verbose --watch" }, "dependencies": { "ava": "^0.23.0", "babel-register": "^6.26.0" }, "ava": { "require": [ "babel-register" ] }}

El babel-registercódigo ES6 transpila en tiempo de ejecución en caso de que algunas máquinas se estén ejecutando en una versión anterior de Node que no es compatible con ES6. La verbosebandera nos dará un resultado ordenado dependiendo de si nuestras pruebas fallan o pasan. Este indicador es bastante útil al depurar sus pruebas, pero si escribe cientos de casos de prueba, es posible que desee desactivarlo.

En su tests/index.test.js, puede agregar su primer caso de prueba:

Lo útil de Ava es que le permite ejecutar pruebas asíncronas, a través de funciones asíncronas en espera. La sintaxis también es bastante sencilla. El método del plan nos permite mencionar explícitamente el número de afirmaciones que nos gustaría tener por prueba.

Ejecutar yarn testdesde su consola le da el siguiente resultado:

En caso de que una de nuestras pruebas falle, obtendríamos:

Esa es la belleza del verbosemodo. Le da una pila de errores limpia y nada de basura de seguimiento de pila. En caso de que se encuentre con un error de tiempo de ejecución, también verá un buen resaltado de sintaxis.

Realmente puede aprovechar la API de Ava y usar su poderosa herramienta de afirmación para escribir casos de prueba flexibles.

Configurando su servidor Node

Hasta ahora, solo hemos hablado de una configuración básica para escribir pruebas, y seamos francos, es bastante sencillo. Entonces, en esta sección, explicaré cómo se puede dividir un servidor de nodo simple y probar sus puntos finales con Ava.

yarn add express body-parser 

En su directorio de trabajo, cree un app.jsy agregue el siguiente fragmento:

La razón por la que exporté el módulo de la aplicación es para que pueda usarse con el servidor de API simulado que Ava necesitará para ejecutar sus pruebas.

Cree un nuevo archivo server.jse importe el módulo de la aplicación para iniciar el servidor.

Ejecutar npm start debería iniciar su servidor, y navegar al punto final // localhost / status debería darle una respuesta 200OK.

Genial, nuestro servidor está funcionando.

Un vistazo rápido al código muestra que hemos creado 3 puntos finales: un punto final de estado, un punto final de saludo y un punto final de registro. Existe cierta validación en el punto final del registro, que arroja un 400 (solicitud incorrecta) en caso de que falten los parámetros del cuerpo de la publicación. El método de validación anterior es bastante ingenuo, pero cumple nuestro propósito de pruebas de puntos finales, así que me quedaré con él.

Consejo profesional: siempre puede asignar el manejo de errores a un middleware y usar next para invocar el controlador de errores.

Escribamos algunas pruebas más alrededor del punto final. Usaré el supertestmódulo. Es muy similar a superagent: usa las mismas API y tiene una sintaxis similar. Entonces, todos ganan.

Hemos importado el appmódulo exportado anteriormente y lo hemos pasado a supertest. Supertest crea un servidor proxy, que luego llegará a todas las URL de punto final mencionadas en la prueba. Puede utilizar el deepEqualmétodo para probar todo el objeto o el ismétodo para probar manualmente cada campo.

Ejecutar la prueba de hilo producirá lo siguiente:

Excelente. Hemos escrito cuatro pruebas y todas pasan como se esperaba. Pero, ¿qué pasa con la cobertura del código?

Hola nyc

Para crear esos hermosos informes de cobertura, usaremos nyc, que es la interfaz de línea de comandos de Istanbul.js. Es muy fácil de usar y tiene muchas opciones configurables. En aras de la simplicidad, usaremos una configuración muy simple.

yarn add nyc --save

The nyc command wraps nicely over your test command and will create a coverage folder (this should be in your gitignore) in your working directory.

Update your package.json as shown below:

{ "name": "ava-test", "version": "1.0.0", "description": "", "main": "index.js", "scripts": { "test": "node_modules/.bin/ava tests/**/*.test.js --verbose", "test:watch": "node_modules/.bin/ava --verbose --watch", "cover": "node_modules/.bin/nyc yarn test", }, ... other dependencies "nyc": { "reporter": [ "lcov", "text", "html" ] }}

The types of reporter you want can be configured in the nyc section of your package.json file.

Let’s run yarn cover:

Okay so we don’t have 100% coverage yet. Let’s fix that. First you’d want to go into the coverage folder of your working directory and see which part of your code hasn’t been covered.

Clearly we missed a spot. Let’s add our final test case in the tests/index.tests.js file, which will cover the entire app.js file.

test('Create a new user', async t => { let username = 'some-hase' const password = 'some-hase' const response = await request(app) .post('/register') .send({username, password});
t.is(response.status, 200); t.is(response.body.message, `new user created`);});

And now….

Presto.

Pro tip: If you want to add a threshold for test cases you can add a script in your package.json file.
"check-coverage": "node_modules/.bin/nyc check-coverage --lines 100 --functions 100 --branches 100 --statements 100"

This command can be run as part of your travis / gitlab pipeline build systems.

Conclusion

We’ve covered a basic setup with Ava for unit test cases of your Node APIs. The documentation is really extensive and can be referred to in case of doubt.

PS: Hope you like the article, correct me if I am wrong anywhere. Always welcome a discussion.