Вступление
Доступен ряд популярных платформ для тестирования JavaScript - Jasmine, Mocha, Jest, NodeUnit и многие другие. . Многие из них предоставляют множество функциональных возможностей и нацелены на предоставление полного решения для тестирования. В большинстве случаев они разделяют Test Runner (то, что запускает тесты и сообщает о результатах) и Assertion Library (то, что позволяет вам писать тесты, описывающие, как ваше приложение должно вести себя). Библиотеки утверждений входят в состав BDD (разработка на основе поведения) и TDD (разработка на основе тестирования), что еще больше усложняет выбор между встроенной библиотекой утверждений Node и такими альтернативами, как Expect.js и Чай.
Tape использует другой подход и стремится предоставить минимум инструментов, необходимых для создания и запуска модульных тестов, без предоставления зачастую подавляющего выбора вариантов, которые предлагают другие фреймворки. Философия заключается в том, чтобы заставить разработчика писать ясные, простые тесты и, следовательно, писать ясный, простой, модульный код, который удовлетворяет требованиям этих тестов. Лента предоставляет как базовую программу выполнения тестов, так и базовый набор утверждений TDD.
Начиная
Добавьте ленту в свой проект:
npm install tape --g npm install tape --save-dev
Базовый формат теста
Базовая структура тестов следующая:
var test = require( 'tape' ) ; test( '<TEST NAME>', function( assert ) { assert.<FUNCTION>( <PARAMETERS>, '<STATEMENT THAT WILL BE TRUE IF TEST PASSES>' ) ; assert.end() ; } ) ;
Например, создайте test.js следующим образом:
var test = require( 'tape' ) ; test( 'My first test', function( assert ) { assert.equal( 1, 2, 'Numbers 1 and 2 are the same' ) ; assert.end() ; } ) ;
Затем вы можете запустить этот тест из командной строки:
node test.js
что даст следующий результат:
TAP version 13 # My first test not ok 1 Numbers 1 and 2 are the same - - - operator: equal expected: 2 actual: 1 ... 1..1 # tests 1 # pass 0 # fail 1
Планы испытаний
При создании плана тестирования вы можете либо указать количество тестов, которые следует запустить, либо явно указать Tape, когда набор тестов завершится.
Первый вариант выполняется с помощью метода assert.plan:
test( 'My second test', function( assert ) { assert.plan( 2 ) ; // Specifies that we will be executing exactly two tests assert.equal( 1 + 1, 2, '1 + 1 = 2' ) ; assert.equal( 2 + 2, 4, '2 + 2 = 4' ) ; } ) ;
Если у вас меньше тестов, чем указано, будет выдана ошибка. Если утверждений больше, чем указано, все они завершатся ошибкой.
Второй вариант выполняется с помощью метода assert.end:
test( 'My third test', function( assert ) { assert.equal( 1 + 1, 2, '1 + 1 = 2' ) ; assert.equal( 2 + 2, 4, '2 + 2 = 4' ) ; assert.end() ; } ) ;
Любые утверждения после вызова assert.end завершатся ошибкой.
Утверждения
Библиотека Tape предоставляет меньше методов, чем такие альтернативы, как Expect.js и Chai, но во многих отношениях это хорошо, поскольку побуждает разработчика делать тесты простыми и краткими.
Вы должны иметь возможность протестировать все мыслимые сценарии, просто используя ограниченный набор методов тестирования, описанных ниже:
assert.true( value, msg ) / assert.false( value, msg )
Утверждает, что значение является правдой или ложью.
assert.true( 1 + 1 = 2, '1 + 1 = 2' ) ; assert.false( 1 + 1 = 3, '1 + 1 = 3' ) ;
assert.equal (фактическое, ожидаемое, сообщение) / assert.notEqual (фактическое, ожидаемое, сообщение)
Утверждает, что фактический === ожидаемый / фактический! == ожидаемый.
assert.equal( 1 + 1, 2, '1 + 1 = 2' ) ; assert.equal( 2 + 2, 4, '2 + 2 = 4' ) ;
assert.deepEqual (фактическое, ожидаемое, сообщение) / assert.notDeepEqual (фактическое, ожидаемое, сообщение)
Утверждает, что фактическое и ожидаемое имеют одинаковую / разную структуру и вложенные значения со строгим сравнением (===) на конечных узлах.
assert.deepLooseEqual (фактическое, ожидаемое, сообщение) / assert.notDeepLooseEqual (фактическое, ожидаемое, сообщение)
Утверждает, что фактическое и ожидаемое имеют одинаковую / различную структуру и вложенные значения с нестрогим сравнением (==) на конечных узлах.
var person1 = { name: 'Andy', age: 45 } ; var person2 = { name: 'Andy', age: 45 } ; var person3 = { name: 'Andy', age: '45' } ; assert.deepEqual( person1, person2, 'person1 and person2 are identical' ) ; assert.notDeepEqual( person1, person3, 'person1 and person3 are not identical due to the datatype of the age key' ) ; assert.deepLooseEqual( person1, person3, 'person1 and person3 are loosely identical despite the datatype of the age key' ) ;
assert.throws (функция, [ожидается], сообщение) / assert.doesNotThrow (функция, ожидается, сообщение)
Утверждает, что вызов функции function () вызывает / не вызывает исключение. Если указано, ожидаемый должен быть регулярным выражением или функцией.
function add( num1, num2 ) { try { num1 = parseFloat( num1 ) ; num2 = parseFloat( num2 ) ; return num1 + num2 ; } catch( err ) { throw err ; } } assert.throws( function() { add( 2, 'two' ) }, 'Error adding number to string' ) ;
Структура приложения
Точная структура, которую вы примете для своих планов тестирования, будет зависеть от таких вещей, как личные предпочтения, структура приложения и любые фреймворки, которые вы можете использовать, но для простого приложения вы можете просто создать одну папку test и получить ее включите скрипты, которые тестируют каждый из ваших модулей, или, возможно, только один скрипт index.js, если ваше приложение небольшое.
Вы должны добавить команду, необходимую для запуска этих тестов, в файл package.json вашего проекта в разделе скриптов:
... "scripts": { "test": "node_modules/.bin/tape test/*.js" }, ...
Затем вы можете запустить свои тесты из командной строки следующим образом:
npm test
Многие системы автоматизированного тестирования и непрерывной интеграции ожидают, что смогут запускать «npm test» для выполнения ваших тестов, поэтому имеет смысл придерживаться этого стандарта.
Ресурсы
Https://github.com/substack/tape
Https://medium.com/javascript-scene/why-i-use-tape-instead-of-mocha-so-should-you-6aa105d8eaf4
Http://ponyfoo.com/articles/testing-javascript-modules-with-tape
Http://www.catonmat.net/blog/writing-javascript-tests-with-tape/