Незнакомы с тестированием на мутации? Узнайте об этом, посетив https://stryker-mutator.github.io/ или прочитав Введение в тестирование мутаций.

Поддержка TypeScript знаменует собой самое большое изменение в истории Stryker, поскольку теперь мы поддерживаем тестирование мутаций в коде TypeScript.

Языковой агностик

Страйкер теперь не зависит от языка. Это означает, что вы можете использовать Stryker для мутационного тестирования любого языка, который транслируется в JavaScript (при условии, что у вас есть правильный плагин для этого). TypeScript - это первый язык, который полностью поддерживается таким образом.

Чтобы это стало возможным, мы внесли ряд изменений в ядро ​​Stryker:

  • Изменен api плагина Mutator.
  • Добавить api плагина Transpiler

API плагина мутатора

С помощью предыдущего плагина Mutator можно было изменить один узел абстрактного синтаксического дерева (AST). Это была небольшая изящная функция, но она никогда не использовалась вне основного пакета Stryker. Этот плагин также был специфичен для JavaScript. Поскольку Stryker теперь не зависит от языка, мы решили вывести Mutator api на более высокий уровень абстракции. Мутатор теперь отвечает за изменение кода, написанного на определенном языке, а не на одном узле JS AST.

Мы переместили существующий мутатор для JavaScript в новый мутатор под названием 'javascript'. Мы также добавили 'typescript' мутатор как часть нового модуля npm stryker-typescript.

Вы можете найти новое определение api здесь.

Api плагина Transpiler

С помощью плагина транспилятора можно преобразовать любой исходный код до того, как Stryker запустит ваши тесты. Он также используется для транспиляции каждого мутанта таким же образом. Это дает максимальную свободу при изменении исходного кода, не беспокоясь о результирующем коде JavaScript. Побочным эффектом является то, что он еще не работает с анализом покрытия, а это означает, что Stryker заставит анализ покрытия быть 'off' при использовании транспилятора.

Мы создали 'typescript' транспилятор как часть нового модуля stryker-typescript npm.

Вы можете найти новое определение api здесь

Фреймворк для тестирования мутаций TypeScript

Оригинальный пиар

Stryker теперь поддерживает TypeScript. Это означает, что теперь Stryker может работать непосредственно с вашим кодом TypeScript, и нет необходимости сначала переносить его самостоятельно и запускать Stryker с перенесенным кодом. Это дает следующие преимущества:

  • Намного меньше ложных срабатываний,
  • В ваших отчетах stryker теперь будет отображаться ваш код вместо перенесенного кода.

"Для этого есть плагин"

Все плагины Stryker, которые помогут вам с TypeScript, являются частью одного модуля npm: stryker-typescript. Он содержит 3 плагина, которые работают вместе:

  1. Редактор конфигурации: плагин, который считывает ваш файл tsconfig.json и делает конфигурацию доступной как для мутатора, так и для транспилятора.
  2. Mutator: плагин, который может изменять код TypeScript. См. Наши модульные тесты, чтобы узнать, какие мутации поддерживаются.
  3. Transpiler: плагин, который может преобразовывать (видоизменять) код TypeScript. Он использует ваши настройки tsconfig, поэтому вывод будет именно таким, как вы ожидали.

Чтобы настроить плагины, вам нужно добавить это в свой файл stryker.conf.js:

module.exports = function(config) {
    config.set({
        // ...
        mutator: 'typescript',
        transpilers: [
            'typescript'
        ],
        tsconfigFile: 'tsconfig.json'
        // ...
    });
}

Здорово! Но как насчет производительности?

Вы могли подумать, что все это отрицательно сказывается на производительности. В конце концов, мы должны транспилировать код TypeScript для каждого мутанта, который мы хотим протестировать. Запуская Stryker на самом себе, мы замечаем, что это занимает меньше времени, чем раньше, когда мы изменяли JavaScript. Это связано с тем, что транспиляция каждого мутанта гарантирует отсутствие ложноположительных результатов. Результаты для вашего проекта могут отличаться.

Возьмем, к примеру, BinaryExpressionMutator. Он может видоизмениться:

// Original code
'foo' + 'bar'
// Mutated code
'foo' - 'bar'

Хотя это допустимо в JavaScript, это недопустимо в TypeScript. Это означает, что результат мутанта будет TranspileError. Он не тестировался и не учитывался в вашей оценке мутации. Меньше работы - значит быстрее.

Что дальше?

Затем мы хотим еще больше улучшить нашу поддержку TypeScript. Например, мы хотим добавить поддержку анализа покрытия при использовании транспайлера.

Хотите с нами связаться? Найдите нас в Gitter или Twitter.

Этот блог изначально был размещен на https://stryker-mutator.github.io 6 октября 2017 года.