Mocha (Мока) — многофункциональная среда JavaScript-тестирования, работающая на Node.js и в браузере, что делает асинхронное тестирование простым и интересным. Тесты Mocha запускаются серийно, что позволяет гибко и точно создавать отчеты.
При первом знакомстве Mocha может показаться сложным фреймворком, но на самом деле работа с ним легка и приносит удовольствие.
Установка Mocha через терминал
Для установки выполните команду:
$ npm install -g mocha
Если вы устанавливаете npm модуль глобально, вы не ограничиваете его использование в рамках одного проекта. В место этого вы имеете доступ к фреймворку с любого каталога и проекта.
Как только Mocha будет установлен глобально вы сможете запускать команды в терминале используя ключевое слово mocha
.
Что бы проверить установку используйте команду $ mocha --version
Создание проекта
Далее мы создадим папку для проекта с именем test
. В папке test мы создадим файл с именем test.js
. Находясь в директории в терминале запустим команду $ npm init
для инициализации проекта.
Команда $ npm init
— самый простой и короткий способ создания файла package.json. Теперь мы можем запускать Mocha выполнив в терминале команду $ 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
этот элемент массива [1,2,3].indexOf(4)
. Если наш ожидаемый параметр равен явному, то тест пройден.
Далее снова запускаем наш тест с терминала командой $ 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)
Запуск в браузере
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>
Генераторы отчетов
Генерируют отчеты в разных вариантах, а так же генерируют документацию к тестам:
- 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 markdowncomments powered by HyperComments