Guía de desarrollo de guías

Una buena vida comienza con las pruebas

Un programador que no escribe casos de prueba automáticos no es un buen ingeniero de pruebas. Alentamos a todos los proyectos a establecer casos de prueba automatizados completos desde el principio. Con el desarrollo del proyecto, la inversión inicial se verá recompensada cientos de veces.

Continuemos con el ejemplo de la sección anterior y veamos cómo usar fibjs para escribir casos de prueba.

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21
const http = require('http'); const path = require('path'); var hello_server = { '/:name(fibjs.*)': (req, name) => { req.response.write('hello, ' + name + '. I love you.'); }, '/:name': (req, name) => { req.response.write('hello, ' + name); } }; var root_server = { '/hello': hello_server, '/bonjour': hello_server, '*': http.fileHandler(path.join(__dirname, 'web')) }; var svr = new http.Server(8080, root_server); svr.start();

Un marco de prueba vacío

Comencemos con un marco de prueba básico:

1 2 3 4 5 6 7 8 9 10
var test = require('test'); test.setup(); describe('hello, test', () => { it('a empty test', () => { }); }); test.run();

Después de guardarlo como test.js , ejecute fibjs test.js en la línea de comando, verá el siguiente resultado y se escribe un marco de prueba básico.

1 2 3 4
hello, test √ a empty test √ 1 tests completed (0ms)

Iniciar servidor de prueba

Debido a que necesitamos probar el servidor http, primero debemos iniciar el servidor. El caso de prueba enviará una solicitud al servidor y luego probará el resultado de la solicitud para determinar si el servidor cumple con los requisitos:

1 2 3 4 5 6 7 8 9 10 11 12 13 14
var test = require('test'); test.setup(); var http = require('http'); describe('hello, test', () => { it('hello, fibjs', () => { var r = http.get('http://127.0.0.1:8080/hello/fibjs'); assert.equal(r.statusCode, 200); assert.equal(r.data.toString(), 'hello, fibjs. I love you.'); }); }); test.run();

En este código, juzgamos si la lógica del servidor es normal verificando si el resultado de http.get es el resultado que esperamos. Según este ejemplo, podemos completar rápidamente un conjunto de pruebas y también optimizamos el código:

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30
var test = require('test'); test.setup(); var http = require('http'); function test_get(url, rep) { var r = http.get('http://127.0.0.1:8080' + url); assert.equal(r.statusCode, 200); assert.equal(r.data.toString(), rep); } describe('hello, test', () => { it('hello, fibjs', () => { test_get('/hello/fibjs', 'hello, fibjs. I love you.'); }); it('hello, fibjs*', () => { test_get('/hello/fibjs-great', 'hello, fibjs-great. I love you.'); }); it('hello, JavaScript', () => { test_get('/hello/JavaScript', 'hello, JavaScript'); }); it('hello, v8', () => { test_get('/hello/v8', 'hello, v8'); }); }); test.run();

Gestión grupal de casos de uso

Agreguemos la prueba de bonjour. Aunque bonjour y hello son el mismo conjunto de servicios, debido a que la ruta ha cambiado, también necesitamos verificar la corrección del servicio. Esta vez, para administrar mejor los casos de uso, realizamos los casos de prueba Agrupando, al mismo tiempo, debido a que el contenido de prueba de hello y bonjour es el mismo, optimizamos el código nuevamente y probamos los dos conjuntos de servicios con el mismo conjunto de códigos:

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37
var test = require('test'); test.setup(); var http = require('http'); function test_get(url, rep) { var r = http.get('http://127.0.0.1:8080' + url); assert.equal(r.statusCode, 200); assert.equal(r.data.toString(), rep); } describe('hello, test', () => { function test_hello(hello) { describe(hello + ' test', () => { it('fibjs', () => { test_get('/' + hello + '/fibjs', 'hello, fibjs. I love you.'); }); it('fibjs*', () => { test_get('/' + hello + '/fibjs-great', 'hello, fibjs-great. I love you.'); }); it('JavaScript', () => { test_get('/' + hello + '/JavaScript', 'hello, JavaScript'); }); it('v8', () => { test_get('/' + hello + '/v8', 'hello, v8'); }); }); } test_hello('hello'); test_hello('bonjour'); }); test.run();

Al agrupar los casos de uso, podemos ver los resultados de las pruebas con mayor claridad y también es fácil omitir y probar un grupo de casos de uso individualmente para acelerar el desarrollo y las pruebas. Los siguientes son los resultados de esta ronda de pruebas:

1 2 3 4 5 6 7 8 9 10 11 12 13
hello, test hello test √ fibjs √ fibjs* √ JavaScript √ v8 bonjour test √ fibjs √ fibjs* √ JavaScript √ v8 √ 8 tests completed (3ms)

De acuerdo con el diseño de nuestro servidor, también tenemos un conjunto de servicios de archivos estáticos. Según el ejemplo anterior, creo que puede escribir rápidamente esta parte de los casos de prueba.

Prueba de un clic

Después de la introducción anterior, podemos establecer rápidamente casos de prueba. Pero para utilizar este script de prueba, primero se debe iniciar el servidor, lo cual es muy inconveniente. Esperamos que ejecutar test.js pueda completar directamente la prueba. Podemos usar el siguiente código para lograr:

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43
var test = require('test'); test.setup(); var http = require('http'); var coroutine = require('coroutine'); coroutine.start(() => { run('./main.js'); }); coroutine.sleep(100); function test_get(url, rep) { var r = http.get('http://127.0.0.1:8080' + url); assert.equal(r.statusCode, 200); assert.equal(r.data.toString(), rep); } describe('hello, test', () => { function test_hello(hello) { describe(hello + ' test', () => { it('fibjs', () => { test_get('/' + hello + '/fibjs', 'hello, fibjs. I love you.'); }); it('fibjs*', () => { test_get('/' + hello + '/fibjs-great', 'hello, fibjs-great. I love you.'); }); it('JavaScript', () => { test_get('/' + hello + '/JavaScript', 'hello, JavaScript'); }); it('v8', () => { test_get('/' + hello + '/v8', 'hello, v8'); }); }); } test_hello('hello'); test_hello('bonjour'); }); process.exit(test.run());

En las líneas 6-10 de este código, agregamos una sección de código para iniciar main.js y esperamos un rato antes de comenzar la prueba.

Verificación de cobertura de código

Los buenos casos de prueba deben tener en cuenta que los casos de prueba deben cubrir todas las ramas de la empresa para garantizar que se ejecute correctamente. En este momento, las verificaciones de cobertura de código se pueden utilizar para determinar si la prueba está completa.

Este proceso es muy simple, solo agregue el parámetro --cov cuando pruebe:

1
fibjs --cov test

Una vez finalizada la prueba, se generará un archivo de registro de fibjs-xxxx.lcov en el directorio actual. En este momento, es necesario analizar el registro y generar un informe:

1
fibjs --cov-process fibjs-xxxx.lcov out

Luego, puede generar un conjunto de informes de análisis en el directorio de salida. Ingrese al catálogo para ver, puede ver la siguiente página:cov Como puede ver, la cobertura de código de main.js alcanza el 100%, lo que indica que la prueba cubre por completo la lógica empresarial. Haga clic en main.js para ver un informe más detallado.

👉 [ Encuentra el asesino del rendimiento ]