Руководство по разработке руководства

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

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

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

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

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

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

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

1
fibjs --cov test

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

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

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

【【 Узнайте убийцу производительности