Основи тестування JavaScript з Mocha

7 хв. читання

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
Помітили помилку? Повідомте автору, для цього достатньо виділити текст з помилкою та натиснути Ctrl+Enter
Codeguida 5.6K
Приєднався: 8 місяців тому
Коментарі (1)
Щоб залишити коментар необхідно авторизуватися.

Вхід / Реєстрація