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

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

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

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

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