Guida Guida allo sviluppo

Una buona vita inizia con un test

Un programmatore che non scrive casi di test automatici non è un buon ingegnere di test. Incoraggiamo tutti i progetti a stabilire casi di test automatici completi dall'inizio. Con lo sviluppo del progetto, l'investimento iniziale verrà premiato centinaia di volte.

Continuiamo l'esempio della sezione precedente e diamo un'occhiata a come scrivere casi di test usando fibjs.

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 framework di test vuoto

Cominciamo con il framework di test più semplice:

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

Dopo aver salvato come test.js , eseguire fibjs test.js dalla riga di comando, verrà visualizzato il seguente output, viene scritto un framework di test di base.

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

Inizia a testare il server

Poiché dobbiamo testare il server http, dobbiamo prima avviare il server. Il caso di test invierà una richiesta al server, quindi testerà il risultato della richiesta per determinare se il server soddisfa i requisiti:

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

In questo codice, determiniamo se la logica del server è normale verificando che il risultato di http.get sia quello che ci aspettiamo. Seguendo questo esempio, possiamo completare rapidamente una serie di test e allo stesso tempo abbiamo ottimizzato il codice:

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

Gestione raggruppata dei casi d'uso

Aggiungiamo i test di bonjour. Sebbene bonjour e ciao siano lo stesso insieme di servizi, dobbiamo anche verificare la correttezza del servizio perché il percorso è cambiato. Questa volta, al fine di gestire meglio i casi d'uso, abbiamo condotto casi di test Raggruppando, allo stesso tempo, poiché il contenuto del test di hello e bonjour è lo stesso, abbiamo ottimizzato nuovamente il codice e testato due set di servizi con lo stesso set di codice:

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

Raggruppando i casi d'uso, possiamo visualizzare i risultati dei test in modo più chiaro ed è anche facile saltare e testare un gruppo di casi d'uso singolarmente, accelerando lo sviluppo e la velocità dei test. I seguenti sono i risultati di questo ciclo di test:

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)

Secondo la progettazione del nostro server, disponiamo anche di una serie di servizi di file statici Secondo l'esempio sopra, credo che tu possa scrivere rapidamente questa parte del test case.

Test con un clic

Dopo l'introduzione di cui sopra, possiamo creare rapidamente casi di test. Ma per utilizzare questo script di test, è necessario prima avviare il server, il che è molto scomodo. Speriamo di eseguire test.js per completare direttamente il test. Possiamo usare il seguente codice per ottenere:

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

Nelle righe 6 ~ 10 di questo codice, abbiamo aggiunto un codice per avviare main.js e abbiamo aspettato un po 'prima di iniziare il test.

Verifica della copertura del codice

Un buon caso di prova deve considerare che il caso di prova deve coprire tutti i rami dell'azienda per garantire che l'attività venga eseguita correttamente, al momento è possibile utilizzare il controllo della copertura del codice per determinare se il test è completo.

Questo processo è molto semplice, basta aggiungere il parametro --cov durante il test:

1
fibjs --cov test

Una volta completato il test, un file di registro fibjs-xxxx.lcov verrà generato nella directory corrente, al momento è necessario analizzare il registro e generare un rapporto:

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

È possibile generare un set di report di analisi nella directory out. Inserisci la directory per visualizzare, puoi vedere la seguente pagina: COV Come puoi vedere, la copertura del codice di main.js raggiunto il 100%, indicando che il test ha coperto completamente la logica aziendale. Fai clic su main.js per visualizzare un rapporto più dettagliato.

👉 【 Scopri il performance killer