Mocha(Moка) – багатофункціональна тестова система для Node.js. Вона створена, щоб зробити асинхронне тестування легким. Тестування виконується серійно, що дає можливість точного звітування, та одночасного відстеження винятків з правильних тестів.
На перший погляд він може здаватися складним, але насправді працювати з ним достатньо просто.
Інсталяція Mocha з термінала
Виконайте команду:
$ npm install -g mocha
Якщо ви встановлюєте npm модуль глобально, то ви не обмежуєте його використання тільки одним проектом. Замість цього ви матимете доступ до модуля з будь-якого місця, а також отримуєте можливість використовувати його як інструмент термінала.
Як тільки Mocha буде встановлена, ви зможете запускати команди з термінала використовуючи ключове слово mocha
.
Щоб перевірити інсталяцію використайте команду $ mocha --version
.
Створення проекту
За замовчуванням Mocha запускає тести з директорії test
, тому наступним кроком стане створення директорії проекту з ім'ям test
. В нашій тестовій директорії ми створимо файл test.js
. Ініціалізуємо проект запустивши команду $ npm init
, знаходячись у директорії.
Команда $ npm init
– найкоротший і найпростіший шлях створення файлу packaje.json. Тепер, ми можемо запускати фреймворк просто виконавши у терміналі $ npm test
.
Ви мали отримати приблизно таку структуру файлів:
test
|-- test.js
|-- package.json
Ваш package.json має містити наступний код:
"scripts": {
"test": "mocha"
},
Якщо ви виконали попередні інструкції вірно, і отримали все необхідне, можна починати тестування.
Написання першого тесту
Ми скопіюємо тест з документації mocha, потім я поясню, що саме відбувається у коді. У ваш файл test.js скопіюйте наступний код:
var assert = require('assert');
describe('Array', function() {
describe('#indexOf()', function() {
it('should return -1 when the value is not present', function(){
assert.equal(-1, [1,2,3].indexOf(4));
});
});
});
Тепер запустіть ваш тест через термінал, виконавши $ npm test
. Ви маєте отримати повідомлення:
Array
#indexOf()
✓ should return -1 when the value is not present
1 passing (9ms)
Це повідомлення означає, що тест пройдено. Це звичайно добре, але ми й гадки не маємо як працює код, тож пройдемося по основних пунктах.
Можна запускати Mocha як одноразово, так і в режимі постійного тестування в очікуванні змін. Для другого варіанту вказуємо параметр watch: $ mocha --watch
Коли ви пишете тест, то вам має бути відомо про дві базові функції: describe()
та it()
. Вони обидві задіяні у нашому прикладі.
describe(a,b)
- це найпростіший спосіб згрупувати наші тести у Mocha. Ми можемо об'єднувати наші тести у групи як ми забажаємо. Функція приймає два аргументи:
- a – ім'я тестової групи
- b – функція зворотнього виклику
describe('string name', function(){
// ще describe(), або тести
});
Пригадайте наш попередній приклад. В ньому є група тестів Array, яка містить тестову групу #indexOf()
, яка у свою чергу є контейнером для нашого тесту.
It(a,b)
- слугує для індивідуальних тест кейсів, також приймає два аргументи:
- a - рядок, який містить пояснення того, що тест має робити
- b - функцію зворотнього виклику, яка у свою чергу містить сам тест
it('should blah blah blah', function(){
// Тут тести
});
Разом з Mocha можна використовувати Assert бібліотеки. Цей інструмент використовується для перевірки різного роду речей на коректність – це те, що безпосередньо визначає результат.
Використання Assert бібліотек не є необхідністю, проте вони роблять тестування набагато простішим. Mocha дозволяє нам використовувати будь-які бібліотеки. У прикладі нижче (а також усіх інших прикладах) ми використовуємо вбудовані модулі Node.js.
Це рядок коду у якому ми підключаємо бібліотеку:
var assert = require('assert');
Існує певна кількість різних тестів включених до assert
.
Assert бібліотеки
Mocha дозволяє обирати стилі/бібліотеки:
- should.js BDD style
- expect.js
- chai expect(), assert() and should style assertions
- better-assert
Одна з них – assert.equal(actual, expected);
вона перевіряє рівність між нашим наявним і очікуваним параметрами, використовуючи подвійний знак рівності ==
.
Згадайте наш приклад:
it('should return -1 when the value is not present', function(){
assert.equal(-1, [1,2,3].indexOf(4));
});
Все, що ми зробили – це перевірили, чи [1,2,3].indexOf(4));
дорівнює -1
. Якщо наш очікуваний параметр дорівнює наявному, то тест проходить.
Ми знову звертаємося до термінала і запускаємо наш тест командою $ npm test
.
Array
#indexOf()
✓ should return -1 when the value is not present
1 passing (9ms)
Якщо розбити його на рядки то він матиме такий вигляд:
- Перша тестова група
Array
- Базова тестова група
indexOf()
- Лінія, що вказує на пройдений тест і містить його опис
- Підсумок, що вказує на наявність 1 пройденого тесту і час, за який його було пройдено у мілісекундах
Пояснення
Ви маєте всі частини пазлу, тож спробуємо зібрати їх разом. Тут приведено код оригінального тесту, з коментарями, щоб пояснити кожен рядок.
// підключення вбудованої бібліотеки assert
var assert = require('assert');
// створення групи тестів Arrays
describe('Array', function() {
// Всередині групи Array створюємо тести indexOf
describe('#indexOf()', function() {
// Пояснення, що ми тестуємо
it('should return -1 when the value is not present', function(){
// Наш тест: -1 має бути рівним indexOf(...)
assert.equal(-1, [1,2,3].indexOf(4));
});
});
});
Перевірка знань
Що ж, прийшов час підсумувати все, чому ви навчилися. Спробуйте виконайте наступні запитання не підглядаючи:
- Створіть групу тестів і надайте їй ім'я, наприклад
Math
- Створіть ще два тести у вашій групі.
- Перший тест має перевіряти чи є нерівність
33 = 9
дійсною - Другий тест повинен перевірити нерівність
(3-4)8 = -8
НЕ ГОРТАЙТЕ СТОРІНКУ НИЖЧЕ, ДОКИ У ВАС НЕ БУДЕ ДВА ПРОЙДЕНИХ ТЕСТИ!
Відповідь
Якщо у вас не вийшло написати власний тест без підказок, то це нормально.
Отже, поглянемо на рішення з коментарями:
// підключення бібліотеки
var assert = require('assert');
// створення групи тестів на ім'я Math
describe('Math', function() {
// Перший тест: Пояснення того, що ми тестуємо
it('should test if 3*3 = 9', function(){
// Наш тест: 3*3 має дорівнювати 9
assert.equal(9, 3*3);
});
// Другий тест: коментар то нього
it('should test if (3-4)*8 = -8', function(){
// Сам тест: (3-4)*8 має дорівнювати -8
assert.equal(-8, (3-4)*8);
});
});
Тепер після запуску $ npm test
у терміналі ми отримаємо:
Math
√ should test if 3*3 = 9
√ should test if (3-4)*8 = -8
2 passing (13ms)
Запуск y браузері
Mocha можна запустити й в браузері, для цього необхідно під'єднати скрипт стилів і вказати який інтерфейс ви хочете використовувати й потім запустити тести:
<link href="mocha.css" rel="stylesheet">
<div></div>
<script src="jquery.js"></script>
<script src="expect.js"></script>
<script src="mocha.js"></script>
<script>mocha.setup('bdd')</script>
<script src="test.array.js"></script>
<script>
mocha.checkLeaks();
mocha.globals(['jQuery']);
mocha.run();
</script>
Ведення логу
Підтримується стандартний метод ведення журналу console.log()
, який виводить параметри у термінал під час запуску тестів.
Генератори звітів
Генерує звіти в різних варіантах, а також генерує документацію з тестів:
- Dot Matrix – стандартний
- Spec
- Nyan
- TAP
- Landing Strip
- List
- Progress
- JSON
- JSON Stream
- JSONCov
- HTMLCov
- Min
- Doc
- XUnit
- TeamCity
- Markdown
- HTML
Щоб обрати варіант тесту, використайте параметр reporter
:
username:/$ mocha --reporter list
username:/$ mocha --reporter min
username:/$ mocha --reporter markdown
Коментарі (1)