Плагин предназначен для автоматического тестирования проектов на nodejs
Для корректной работы плагина требуется наличие следующих утилит:
- jsdoc
npm install -g jsdoc jsdoc -v // для проверки
- nodeunit
npm install -g nodeunit nodeunit -v // для проверки
Инструкция по генерации и установке плагина
npm install -g vsce // эту команду можно не выполнять если пакет vsce был установлен до этого. подробнее https://code.visualstudio.com/docs/extensions/publish-extension git clone git://git.appcode.pw/autotest-plugin.git npm install vsce package
После генерации в корневом каталоге проекта будет создан файл с расширением .vsix. Инструкция по установке плагина тут
Основные функции плагина:
- Создание автоматических тестов
- Автоматическое выполнение
- Вывод отчета о тестировании
Синтаксис для создания автоматических тестов
Автоматические тесты создаются только для файлов javascript и только для проектов nodejs.
Для определения валидности файла применяется проверка на расширение *.js и наличие в синтаксисе exports. module. и других слов присущих коду nodejs
Создание тестов происходит, как для синхронных методов, так и для асинхронных.
!!! Внимание. Для корректного формирования тестов имена классов и методов не должны оканчиваться на Test
Синтаксис для синхронных методов.
Описание метода для создания автотестирования происходит при помощи синтаксиса jsdoc. Пример:
/** * сумма двух чисел * @unittest (1, 1) == 2 * @unittest (0, 1) == 1 * @param {number} a число a * @param {number} b число b * @returns {number} */ exports.sum = function (a, b) { return a + b; }
где @unittest — специальный атрибут, который принимает один параметр (1, 1) == 2, что является условием проверки теста:
- левая сторона — параметры передаваемые в функцию
- правая сторона — ожидаемый результат после выполнения
- == — условие
Для тестирование модуля применяется следующий синтаксис:
/** * тестирование простой функции * @param {number} i число * @unittest (10) == 5 */ module.exports = function(i) { return i / 2; }
В результате описания будет создан файл тестирования в котором будет следующий текст:
// пример 1 exports.sumTest = function(t) { t.equal(mod.sum(1, 1) == 2, true, 'функция sum - сумма двух чисел'); t.equal(mod.sum(0, 1) == 1, true, 'функция sum - сумма двух чисел'); t.done(); } // пример 2 exports.exportsTest = function(t) { t.equal(mod(10) == 5, true, 'функция exports - тестирование простой функции'); t.done(); }
Правило формирования файлов
Например при создании теста для файла ~/resources/index.js автоматически будет создан файл ~/test/resources/index.t.js
- к наименованию каталога добавляется папка test Является папкой по умолчанию
- В имени файла вместо .js указывается .t.js
Синтаксис для асинхронных методов
Описание данных методом отличается от синхронных тем, что последним параметром в функции должна быть «функция обратного вызова»
/** * асинхронный вызов * @unittest * (10, function(num) { * [num == 10] * }); * @unittest * (20, function(num) { * [num == 20] * }); * @param {number} i число * @param {function} callback функция обратного вызова */ exports.async = function (i, callback) { var id = setTimeout(function () { callback(i); clearTimeout(id); }, 11); }
где после атрибута @unittest указывается алгоритм проверки
Привило формирования алгоритма проверки для асинхронных функций:
(20, function(num) { [num == 20] });
- передаются параметры в функцию
- последним параметром должна быть функция обратного вызова
- функция может как возвращать данные так и нет
- если данные возвращаются, то можно применить проверку, которая обязательно указывается в квадратных скобках
- если функция ничего не возвращает, то просто указываем []
Пример пустой проверки:
/** * асинхронный вызов * @unittest * (function() { * [] * }); * @param {function} callback функция обратного вызова */ exports.asyncSimple = function (callback) { var id = setTimeout(function () { callback(); clearTimeout(id); }, 10); }
Правило определения синхронной и асинхронной функции:
- если указан атрибут @unittest, и в описание параметров функции нет слова callback, то тест является синхронным
- если при указании атрибута @unittest параметре присутствует функция callback, то тест является асинхронным
- для явного указания, что тест является асинхронным можно указать атрибут @asyncunittest вместо @unittest
Объявление переменных
@unittest var fs = require('fs'); (1, 1) == 2
@unittest var fs = require('fs'); (10, function(num) { [num == 10] });
Автоматическое выполнение
Плагин работает по следующему алгоритму:
- после написания специального синтаксиса, плагин генерирует в соответствующей папке файлы для тестирования. !!! Внимание. Генерация тестов происходит только в активном редакторе, если файл до этого не был открыт, то создание тестов не происходит
- после генерации автоматически запускается тестирование и происходит распознавание результата и отображение его на экране
Статусы тестирования:
- Протестировано — все тесты были выполнены
- Тест не пройден — один или несколько тестов не пройдены
Для просмотра результат тестирования можно навести курсор мыши на соответствующие статусы
При наведении на результат теста выводится следующая информация:
- результат тестирования функции
- файл тестирования
- способ создания теста (подробнее о ручном режиме смотреть ниже)
Ручной способ создания теста
Для создания более сложных тестов можно воспользоватся одним из следующих способов:
Создание дополнительного файла
Для этого в каталоге с файла для тестирования создается файл с именем в котором указан номер. Например происходит тестирование файла
~/resources/index.js
значит каталоге уже есть файл
~/test/resources/index.t.js
и к нему мы добавляем следующий файл
~/test/resources/index2.t.js
Таким образом можно добавлять несколько дополнительных файлов
Вновь созданном файл создается тест с именем функции которую мы хотим проверить. Например:
/** * Тестирование сумма двух чисел */ exports.sumTest = function (t) { t.equal(mod.sum(3, 4) == 6, true, 'функция sum - сумма двух чисел'); t.done(); }
где sumTest — это имя тестируемой функции + слово Test Синтаксис для формирования теста применяется от nodeunit (см. выше)
После этого тестирование функции sum произойдет в двух файлах, одним из которых будет автотест, а другой — ручной тест.
Создание файла для тестирования без привязки @unittest
Данный способ позволяет без применения описания @unittest сопоставить метод с тестом, который был создан в ручном режиме.
Например есть метод minus для которого создан тест в ручном режиме:
// описание отсутствует exports.minus = function (a, b) { return a - b; }
Пример теста в файле для тестирования:
// сопоставление по имени + Test exports.minusTest = function (t) { t.equal(mod.minus(10, 5) == 5, true); t.done(); }
Сопоставление происходит по правилу сопоставления имен и наименованию функций.
Выполнение полного тестирования проекта
Тестирование происходит для файлов, которые находятся в каталоге ~/test
Для запуска тестирования можно вызвать команду «Тестирование проекта» при помощи сочетания клавиш CTRL+SHIFT+P, либо вызвать напрямую CTRL+ALT+T
Выполнение операции может занимать некоторое время. Статус выполнения можно отслеживать внизу.
После завершения тестирования будет создан отчет, в котором будут выведены методы с не пройденным тестированием.
Отчет содержит следующую информацию:
- информация в каком тесте произошла ошибка
- продолжительность выполнения тестирования в разных каталогах
Если результат тестирования будет без ошибок, то будет выведено соответствующее сообщение и отчет построен не будет.
Настройки проекта
Плагин поддерживает следующие настройки:
- unittest.folder: string — папка по умолчанию для хранения файлов для тестирования. По умолчанию папка test
- unittest.extension: string — расширение файла, которое применяется к файлу с тестированием. По умолчанию .t.js
- unittest.ignore: string[] — указывается список папок для игнорирования тестирования
Для переопределения настроек по умолчанию используется папка .vscode, которую нужно создать в корневом каталоге проекта. Далее в этой папке создается файл settings.json. Этот файл может быть уже создан, так как он предназначен для стандартного механизма переопределения настроек vscode.
Открываем файл и в формате json указывает настройки для переопределения.
Применение глобальных переменных
Для упрощения написания тестов под nodejs доступен механизм для указания глобальных переменных:
- __rootpath — равен корневому каталогу
Пример
/** * подмена * @unittest (__rootpath) == true */ exports.root = function (path) { return true; }
Результат созданного тестирования
var mod = require('../../resources/node-replace.js'); var pth = require('path'); var join = pth.join; /** * Тестирование подмена */ exports.rootTest = function(t) { t.equal(mod.root(join(__dirname, "../../")) == true, true, 'функция root - подмена'); t.done(); }
Код __rootpath был преобразован в join(__dirname, «../../»)
Объявление переменных в шапке файла (тестирования)
Пример для nodejs
/** * @file /resources/node-file.js * @project autotest-module * @author Александр * @unittestheader * var str = 'Hello'; */
/** * @file /resources/Panel.js * @project autotest-module * @author Александр * @unittestheader * var str = 'Hello World!!!'; */
Дополнительная документация модулей: