Вступление

Доступен ряд популярных платформ для тестирования 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/