Руководство по развитию

Хорошая жизнь начинается с испытания

Программист, который не пишет автоматические тестовые примеры, не является хорошим инженером-тестировщиком. Мы рекомендуем всем проектам с самого начала устанавливать полные автоматизированные тестовые наборы. По мере развития проекта первоначальные вложения будут вознаграждены сотни раз.

Давайте продолжим пример из предыдущего раздела и посмотрим, как использовать 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();

Пустой тестовый фрейм

Начнем с базовой среды тестирования:

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

Сохраните как test.jsпозже, в командной строке fibjs test.jsвы увидите следующий результат: была написана базовая тестовая среда.

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

Запустить тестовый сервер

Поскольку нам нужно протестировать http-сервер, нам нужно сначала запустить сервер. Тестовый пример отправит запрос на сервер, а затем проверит результат запроса, чтобы определить, соответствует ли сервер требованиям:

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

В этом коде мы оцениваем, является ли логика сервера нормальной, проверяя, является ли результат http.get ожидаемым. Согласно этому примеру мы можем быстро выполнить набор тестов, и заодно оптимизировать код:

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

Групповое управление сценариями использования

Давайте добавим тест bonjour. Хотя bonjour и hello - это один и тот же набор служб, поскольку путь изменился, нам также необходимо проверить правильность службы. На этот раз, чтобы лучше управлять вариантами использования, мы выполнили тестовые примеры. Одновременно с группированием, поскольку тестовое содержимое hello и bonjour одинаково, мы снова оптимизировали код и протестировали два набора сервисов с одним и тем же набором кодов:

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

Благодаря группировке вариантов использования мы можем более четко просматривать результаты тестирования, а также легко пропустить и протестировать группу вариантов использования по отдельности, что ускоряет разработку и скорость тестирования. Ниже приведены результаты этого раунда тестирования:

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)

Согласно проекту нашего сервера, у нас также есть набор статических файловых служб. В соответствии с приведенным выше примером, я считаю, что вы можете быстро написать эту часть тестовых примеров.

Тест в один клик

После введения выше мы сможем быстро установить тестовые случаи. Но для того, чтобы использовать этот тестовый сценарий, вы должны сначала запустить сервер, это очень просто, мы хотим запустить test.jsтест напрямую. Мы можем использовать следующий код для достижения:

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

Строки с 6 по 10 этого кода, мы добавили main.jsкод запуска абзаца , немного подождем, а затем перезапустим тесты.

Проверка покрытия кода

Хорошие тестовые примеры должны учитывать, что тестовые примеры должны охватывать все отрасли бизнеса, чтобы гарантировать, что бизнес выполняется правильно.В настоящее время можно использовать проверки покрытия кода, чтобы определить, завершен ли тест.

Это очень простой процесс, просто добавьте параметр --cov при тестировании:

1
fibjs --cov test

После завершения теста в текущем каталоге будет сгенерирован файл журнала fibjs-xxxx.lcov.В это время необходимо проанализировать журнал и сформировать отчет:

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

Затем вы можете создать набор аналитических отчетов в каталоге out. Войдите в каталог для проверки, вы увидите следующую страницу: cov Вы увидите, что main.jsпокрытие кода достигло 100%, что означает, что тест полностью покрывает бизнес-логику. Щелкните main.jsдальше, чтобы увидеть более подробный отчет.

👉 [ Найдите убийцу производительности ]