Статья: Плагин autotest-plugin для VSCode
Тестирование NodeJS проекта отличается от ExtJS
- применяется siesta вместо nodeunit
 - добавлена возможность проверки класса
 - есть возможность тестирования в браузере
 
Для тестирования ExtJS применяется проект siesta. Он позволяет производить тестирование в браузере компоненты ExtJS’a
Создание тестов для ExtJS
Для создания тестов применяется тот же механизм что и в nodejs — применяется атрибут @unittest. Но в отличии от nodejs добавлена возможность тестирования всего класса.
/**
 * Тестовая панель
 * @class ARM.PanelStatic
 * @unittest
 * {
 *      "title": "Hello",
 *      "renderTo": Ext.getBody()
 * }
 */
Ext.define('ARM.PanelStatic', {
    extend: 'Ext.panel.Panel',
    config: {
        title: ''
    },
...
В примере указывается, как можно протестировать класс.
Внимание!!! Применение атрибута @unittest в комментариях класса обязательно.
Передавать параметры в атрибут @unittest не обязательно, все зависит от реализации класса.
Параметр «renderTo» указывается специально для механизма тестирования.
Тестирование может производиться так же для:
- статических метод
 - singleton классов
 
Принцип работы
/**
 * Тестовая панель
 * @class ARM.PanelStatic
 * @unittest
 * {
 *      "title": "Hello",
 *      "renderTo": Ext.getBody()
 * }
 */
Ext.define('ARM.PanelStatic', {
    extend: 'Ext.panel.Panel',
    config: {
        title: ''
    },
...
При открытии файла ExtJS плагин проверит наличия папки siesta в корневом каталоге, если указанная папка будет отсутствовать, то будет автоматически сгенерирован проект для тестирования.

Папка ~/siesta/units является каталогом по умолчанию для хранения файлов для тестирования.
После генерации каталога будет автоматически поднят веб сайт для просмотра сайта в браузере, об этом будет свидетельствовать значок и файл server.js в корневом каталоге.

При нажатии на который будет открыт браузер с тестированием.
Внимание!!! Для работы тестирования требуется установка phantomjs
Пример кода для тестирования:
/**
 * Утилиты
 */
StartTest(function (t) {
    t.name = 'ARM.util.Utilits';
    t.description = 'Утилиты';
    t.diag('ARM.util.Utilits - Утилиты');
    var cmp = null;
    t.chain(
        // проверка экземпляра класса
        function (next) {
            Ext.require('ARM.util.Utilits', function () {
                if (!ARM.util.Utilits.singleton)
                    cmp = Ext.create('ARM.util.Utilits', {});
                else
                    cmp = ARM.util.Utilits;
                t.ok(cmp, 'class=[ARM.util.Utilits]');
                next();
            });
        },
        // проверка функций
        function (next) {
            t.ok(cmp.getSum(2, 1) == 3, 'method=[getSum]');
            next();
        },
        function (next) {
            cmp.getAsyncRead(function (txt) {
                t.ok(txt == 'World', "method=[getAsyncRead]");
                next();
            });
        },
        function (next) {
            cmp.getAsyncEmpty(function () {
                t.ok(true, "method=[getAsyncEmpty]");
                next();
            });
        },
        function () {
            cmp.destroy();
            t.done();
        }
    );
});
Правило создания тестов:
- сопоставление теста с файлом происходит при помощи описания.
// пример описания класса t.ok(cmp, 'class=[ARM.util.Utilits]'); // пример описания метода t.ok(cmp.getSum(2, 1) == 3, 'method=[getSum]');
 - тестирование для объектов в которых присутствует параметр renderTo происходит после события afterrender
cmp = Ext.create('ARM.PanelStatic', Ext.apply({ "title": "Hello", "renderTo": Ext.getBody() }, { listeners: { afterrender: function (sender) { t.ok(sender, 'class=[ARM.PanelStatic]'); cmp = sender; next(); } } })); 
Создание собственных файлов тестирования производится по тем же правила, что и nodejs
Автоматическая настройка siesta
Для корректной настройки тестирования нужно в app.json или package.json указывать:
"namespace": "IServ"
Приоритет отдается файлу app.json. Без указания данного свойства настройку файла preload.js нужно произвести вручную.