Мутационное тестирование - способ оценить надежность кода, проверить предупреждение об изменениях кода, увидеть значение примеров модульного тестирования и опустить отчет о тестовом покрытии (100% тестовое покрытие не означает хорошие модульные тесты).
Итак, что такое мутационное тестирование и какую выгоду от этого может получить мой проект?
Что ж, мутационное тестирование не ново, исходя из собранной мной информации, оно было впервые предложено в 1971 году, но не принято с 2008 года. Однако сейчас оно все еще ново для многих людей, которые никогда не слышали о нем, но я уверен, что это будет изменения в ближайшие годы, пока разработчики осознают, насколько мощным это может быть для оценки качества модульного тестирования и защиты от изменений.
Мутационное тестирование вносит небольшие изменения в код (мутации), чтобы заставить модульные тесты, которые оценивают эту часть кода, дать сбой (уничтожить мутацию).
Пошаговый процесс тестирования мутаций:
- Внесено изменение в исходный код.
- Связанные тесты запускаются с этим кодом, который был только что изменен.
- Если тест не прошел, это означает, что есть тест, который его покрывает, и мутация была уничтожена.
- Если тест не проваливается, значит, нет теста, охватывающего жизни мутации.
У нас есть такая функция сложения:
public addition(num_1, num_2) { return num_1 + num_2; }
Гипотетический тест для функции сложения:
it('must return the result addtion between the two numbers') { assert(addition(2,2)).toBeEqual(4); //Assert in values assert(4).toBeEqual(4)=True Test passed }
Применим мутационное тестирование для приведенного выше примера:
Мы берем добавление функции и вносим изменения в код, чтобы преобразовать код, мы собираемся изменить оператор «+» на «-».
public addition(num_1, num_2) { return num_1 - num_2; }
Мы запускаем соответствующие тестовые примеры для этой функции, и тест должен завершиться неудачно:
it('must return the result addtion between the two numbers') { assert(addition(2,2)).toBeEqual(4); //Assert in values assert(0).toBeEqual(4)=True Test failed }
Когда тест завершается неудачно из-за изменения кода, которое мы сделали в коде, мутация уничтожается, но если она все еще проходила, это означает, что мутация существует, и код недостаточно силен, чтобы предупредить разработчика об изменении поведения кода. текущие функции, это критическая часть, где я считаю, что мутационное тестирование лучше, чем тестовое покрытие, так как покрытие тестового кода и изменение кода.
Итак, мы увидели, что есть, но как это может принести пользу моему проекту, ответ прост: при тестировании мутаций разработчик может видеть, что модульный тест, который он / она сделал для кода, завершится ошибкой, если кто-то изменит его, и исправит его, если они не надо. Это очень удобно для больших проектов, где многие разработчики постоянно меняют код. Вы будете уверены, что все модульные тесты тестируют код, а не только покрывают его. Кроме того, на ранних этапах разработки поделитесь идеями с разработчиком, чтобы увидеть, что можно протестировать.
Мутационное тестирование работает, только если модульные тесты настолько изолированы, насколько они должны быть.
Если вы хотите использовать тестирование мутаций для проекта javascript, вот фреймворк, который я использовал для тестирования мутаций для javascript / Angular:
https://stryker-mutator.io/
Вот несколько файлов конфигурации stryker для разных участников тестирования:
stryker.conf.js для Angular Webpack Typescript Jest:
npm i -D @ stryker-mutator / core @ stryker-mutator / html-reporter @ stryker-mutator / api @ stryker-mutator / jest-runner @ stryker-mutator / typescript
module.exports = function (config) { config.set({ mutate: ["src/**/*.ts"], testRunner: 'jest', testFramework: 'jest', mutator: 'typescript', reporter: ['html'], coverageAnalysis: 'off', jest: { config: require('./config/jest/config') }, logLevel: "all", tsconfigFile: "tsconfig.json", packageManager: "npm", allowUnreachableCode: true, noUnusedLocals: false, noUnusedParameters: false, htmlReporter: { baseDir: 'reports/mutation/html' // this is the default } }); };
stryker.conf.js для Typescript Jasmine:
npm i -D @stryker -mutator / core @stryker -mutator / html-reporter @stryker -mutator / api @stryker -mutator / typescript @stryker -mutator / jasmine-runner
module.exports = function(config) { config.set({ mutator: "typescript", packageManager: "npm", reporters: ["html", "clear-text", "progress"], testRunner: "command", testFramework: "jasmine", coverageAnalysis: "off", jasmineConfigFile: "jasmine.json", tsconfigFile: "tsconfig.json", mutate: ["src/**/*.ts"] }); };
stryker.conf.js для Typescript Mocha:
npm i -D @stryker -mutator / core @stryker -mutator / html-reporter @stryker -mutator / api @stryker -mutator / typescript @stryker -mutator / mocha-runner
module.exports = function(config) { config.set({ mutator: "typescript", packageManager: "npm", reporters: ["html", "clear-text", "progress"], testRunner: "mocha", testFramework: "mocha", coverageAnalysis: "off", tsconfigFile: "tsconfig.json", mutate: ["src/**/*.ts"], mochaOptions: { // Optional mocha options files: [ 'test/**/*.ts' ] opts: 'mocha/conf.js', ui: 'bdd', timeout: 3000, require: [ /*'babel-register' */], asyncOnly: false, grep: /.*/ } }); };
Список инструментов тестирования мутаций для других языков (спасибо Википедии):
- Список инструментов и публикаций Мутационное тестирование от Jeff Offutt
- MuJava Инструмент мутации для Java, включающий операторы уровня класса.
- Mutate.py Python-скрипт для изменения C-программ.
- Bacterio Инструмент тестирования мутаций для мультиклассовых систем Java.
- Javalanche Инструмент тестирования мутаций на основе байт-кода для Java
- Major интегрированный в компилятор фреймворк для тестирования мутаций для Java
- Jumble Инструмент тестирования мутаций на основе байт-кода для Java
- PIT Инструмент тестирования мутаций на основе байт-кода для Java
- Descartes Плагин движка мутаций для PIT на основе тестирования экстремальных мутаций [21], разработанный в рамках Исследовательского проекта STAMP
- Stryker Инструмент тестирования мутаций для JavaScript
- Мутантный инструмент тестирования мутаций на основе AST для Ruby
- Jester Инструмент для тестирования мутаций на основе исходного кода для Java
- Judy Инструмент тестирования мутаций для Java
- Heckle Инструмент тестирования мутаций для Ruby
- Инструмент тестирования мутаций на основе IL NinjaTurtles для .NET и Mono
- Nester Инструмент тестирования мутаций для C #
- VisualMutator Инструмент тестирования мутаций для C #
- Humbug Инструмент тестирования мутаций для PHP
- Infection PHP Фреймворк для тестирования мутаций на основе AST для PHP
- Библиотека анализа мутаций MuCheck для Haskell
- Mutmut Система тестирования мутаций для Python
- Mull Мутационное тестирование на основе LLVM
- Dextool Mutate Мутационное тестирование C / C ++
- Mutate ++ Инструмент тестирования мутаций для C ++
Пожертвования
BTC - bc1qx2alfy4ks8p6gg5y4eantcuwxaefg4wfk42krm
ETH - 0xf21134B4b09F3C1ebF0C8eb386C2EA8D517783fc или hetdev.eth
BCH - qqcxu636r93dne2unp7gdvzdpkwtnx6vlyp3klw48y
LTC - LPQeUXYJ1pThNSLXPJYYHobKEh92sWQyUT
ZEC - t1fkrzNFqwSb2PHtQsKU6i2SVnxmsQMbXKr