Мутационное тестирование

Содержание

Слайд 2

О чём поговорим?

Уровни тестирования
Взросление продукта
Взросление бизнеса
Что такое мутационное тестирование
Как начать работать с

О чём поговорим? Уровни тестирования Взросление продукта Взросление бизнеса Что такое мутационное
Stryker
Подводные камни, которые мы поймали

Слайд 3

Типы тестирования
* по уровню

Типы тестирования * по уровню

Слайд 4

Типы тестирования (по уровню)

Как вы тестируете ваше приложение?
Мы пишем юнит тесты.
Какие?
Я же

Типы тестирования (по уровню) Как вы тестируете ваше приложение? Мы пишем юнит
сказал - юнит!

Слайд 5

Типы тестирования (по уровню)

Как вы тестируете ваше приложение?
Мы пишем юнит тесты.
Какие?
Я же

Типы тестирования (по уровню) Как вы тестируете ваше приложение? Мы пишем юнит
сказал - юнит!

Слайд 6

Типы тестирования (по уровню)

Типы тестирования (по уровню)

Слайд 7

Типы тестирования (по уровню)

Системное тестирование
(сценарии использования и т.д.)

Системное тестирование
проверяют выполнение бизнес-функций (требований)

Типы тестирования (по уровню) Системное тестирование (сценарии использования и т.д.) Системное тестирование
системы.
проверяет сценарии работы пользователя в системе
есть много видов

Слайд 8

Типы тестирования (по уровню)

Системное тестирование
(сценарии использования и т.д.)

Тестирование интеграционное
(проверяем результат внешних эффектов)

Тестирование

Типы тестирования (по уровню) Системное тестирование (сценарии использования и т.д.) Тестирование интеграционное
интеграционное
проверяем изменения после взаимодейсвтия компонент
проверяем технические сценарии взаимодейсвтия компонент

Слайд 9

Типы тестирования (по уровню)

Тестирование компоненты
(проверяем наличие внешних эффектов, проверяем результат внешних изменений)

Системное

Типы тестирования (по уровню) Тестирование компоненты (проверяем наличие внешних эффектов, проверяем результат
тестирование
(сценарии использования и т.д.)

Тестирование интеграционное
(проверяем результат внешних эффектов)

Тестирование компоненты
Проверяем что вызываются внешние функции/сущности
Проверяем обработку запросов на изменение извне
Дёргаем внешнее API компоненты

Слайд 10

Типы тестирования (по уровню)

Тестирование компоненты
(проверяем наличие внешних эффектов, проверяем результат внешних изменений)

Тетирование

Типы тестирования (по уровню) Тестирование компоненты (проверяем наличие внешних эффектов, проверяем результат
функций
(не важны любые эффекты, только результат функции)

Тестирование модулей
(проверяем внутренние эффекты)

Системное тестирование
(сценарии использования и т.д.)

Тестирование интеграционное
(проверяем результат внешних эффектов)

Тестирование модулей
Проверяем нечистые функции
Проверяем функции, которые должны менять состояние модуля
Проверяем, что чистые функции не меняют состояние модуля

Слайд 11

Типы тестирования (по уровню)

Тестирование компоненты
(проверяем наличие внешних эффектов, проверяем результат внешних изменений)

Тестирование

Типы тестирования (по уровню) Тестирование компоненты (проверяем наличие внешних эффектов, проверяем результат
функций
(не важны любые эффекты, только результат функции)

Тестирование модулей
(проверяем внутренние эффекты)

Системное тестирование
(сценарии использования и т.д.)

Тестирование интеграционное
(проверяем результат внешних эффектов)

Тестирование функций
Проверяем результат чистых функций
Проверяем результат не чистых функций на разных входных парамтерах
Не проверяем изменение состояния сущности

Слайд 12

Типы тестирования (по уровню)

Тестирование компоненты
(проверяем наличие внешних эффектов, проверяем результат внешних изменений)

Тестирование

Типы тестирования (по уровню) Тестирование компоненты (проверяем наличие внешних эффектов, проверяем результат
функций
(не важны любые эффекты, только результат функции)

Тестирование модулей
(проверяем внутренние эффекты)

Системное тестирование
(сценарии использования и т.д.)

Тестирование интеграционное
(проверяем результат внешних эффектов)

Это всё
Unit-тестирование

Слайд 13

Когда тесты нужны бизнесу?
Этапы взросления

Когда тесты нужны бизнесу? Этапы взросления

Слайд 14

Взросление бизнеса

Команда

Идея

Средства

Этап 1

Собственные

Прототип

Рынок

Взросление бизнеса Команда Идея Средства Этап 1 Собственные Прототип Рынок

Слайд 15

Взросление бизнеса

Фирма

Прототип

Капитал

Этап 2

Деньги

Инвесторы

Рынок

Продукт

Прибыль

Взросление бизнеса Фирма Прототип Капитал Этап 2 Деньги Инвесторы Рынок Продукт Прибыль

Слайд 16

Взросление бизнеса

Этап 3

Кампания

Продукт

Капитал

Деньги

Инвесторы

Рынок

Нишевые
предложения

Прибыль

Взросление бизнеса Этап 3 Кампания Продукт Капитал Деньги Инвесторы Рынок Нишевые предложения Прибыль

Слайд 17

Взросление продукта

Идея
Concept

Прототип
Proof of concept

Опытный образец
Minimal viable product

Работоспособный продукт
Market Product

Специальный продукт

Проверка востребованности

Проверка осуществимости

Демонстрация

Взросление продукта Идея Concept Прототип Proof of concept Опытный образец Minimal viable
возможностей

Демонстрация жизнеспособности
Максимизация прибыли

Укоренение в рынке
Обеспечение стабильности

Слайд 18

Взросление продукта

Идея
Concept

Прототип
Proof of concept

Опытный образец
Minimal viable product

Работоспособный продукт
Market Product

Специальный продукт

Проверка востребованности

Проверка осуществимости

Демонстрация

Взросление продукта Идея Concept Прототип Proof of concept Опытный образец Minimal viable
возможностей

Демонстрация жизнеспособности
Максимизация прибыли

Укоренение в рынке
Обеспечение стабильности

Слайд 19

Взросление продукта

Идея
Concept

Прототип
Proof of concept

Опытный образец
Minimal viable product

Работоспособный продукт
Market Product

Специальный продукт

Проверка востребованности

Проверка осуществимости

Демонстрация

Взросление продукта Идея Concept Прототип Proof of concept Опытный образец Minimal viable
возможностей

Демонстрация жизнеспособности
Максимизация прибыли

Укоренение в рынке
Обеспечение стабильности

Слайд 20

Взросление продукта

Идея
Concept

Прототип
Proof of concept

Опытный образец
Minimal viable product

Работоспособный продукт
Market Product

Специальный продукт

Проверка востребованности

Проверка осуществимости

Демонстрация

Взросление продукта Идея Concept Прототип Proof of concept Опытный образец Minimal viable
возможностей

Демонстрация жизнеспособности
Максимизация прибыли

Укоренение в рынке
Обеспечение стабильности

Слайд 21

Взросление продукта

Идея
Concept

Прототип
Proof of concept

Опытный образец
Minimal viable product

Работоспособный продукт
Market Product

Специальный продукт

Проверка востребованности

Проверка осуществимости

Демонстрация

Взросление продукта Идея Concept Прототип Proof of concept Опытный образец Minimal viable
возможностей

Демонстрация жизнеспособности
Максимизация прибыли

Укоренение в рынке
Обеспечение стабильности

Слайд 22

Взросление продукта

Растёт потребность в стабильности
Растёт потребность в качестве тестов

Идея
Concept

Прототип
Proof of concept

Опытный образец
Minimal

Взросление продукта Растёт потребность в стабильности Растёт потребность в качестве тестов Идея
viable product

Работоспособный продукт
Market Product

Специальный продукт

Проверка востребованности

Проверка осуществимости

Демонстрация возможностей

Демонстрация жизнеспособности
Максимизация прибыли

Укоренение в рынке
Обеспечение стабильности

Слайд 23

Бизнес готов
Тесты пишутся
Что дальше?

Бизнес готов Тесты пишутся Что дальше?

Слайд 24

Качество тестирования

Идея
Concept

Прототип
Proof of concept

Опытный образец
Minimal viable product

Работоспособный продукт
Market Product

Специальный продукт

Проверка востребованности

Проверка осуществимости

Демонстрация

Качество тестирования Идея Concept Прототип Proof of concept Опытный образец Minimal viable
возможностей

Демонстрация жизнеспособности
Максимизация прибыли

Укоренение в рынке
Обеспечение стабильности

Растёт потребность в стабильности
Растёт потребность в качестве тестов

Слайд 25

Качество тестирования

Качество тестирования

Слайд 26

Качество тестирования

Цели:
Повышаем качество тестов
Удаляем бесполезные тесты
Повышаем качество кода
Попутно улучшаем архитектуру, отказоустойчивость и

Качество тестирования Цели: Повышаем качество тестов Удаляем бесполезные тесты Повышаем качество кода
т.д.

Слайд 27

Качество тестирования

Stryker:
C#
Scala
Javascript/Typescript
React
Angular
Native

Качество тестирования Stryker: C# Scala Javascript/Typescript React Angular Native

Слайд 28

Качество тестирования

Stryker:
C#
Scala
Javascript/Typescript
React
Angular
Native

Качество тестирования Stryker: C# Scala Javascript/Typescript React Angular Native

Слайд 29

Качество тестирования

Качество тестирования

Слайд 30

Getting started…
(немного чёрных экранов)

Getting started… (немного чёрных экранов)

Слайд 31

Stryker.js

npm install -g stryker-cli

npm install -D stryker-cli

Stryker.js npm install -g stryker-cli npm install -D stryker-cli

Слайд 32

Stryker.js

npm install -g stryker-cli

npm install --save-dev @stryker-mutator/core

npm install -g stryker-cli

npm install --save-dev

Stryker.js npm install -g stryker-cli npm install --save-dev @stryker-mutator/core npm install -g
@stryker-mutator/html-reporter
npm install --save-dev @stryker-mutator/typescript
npm install --save-dev @stryker-mutator/jest-runner

Слайд 33

Stryker.js

npm install -g stryker-cli

npm install --save-dev @stryker-mutator/core

stryker init

npm install -g stryker-cli

npm install

Stryker.js npm install -g stryker-cli npm install --save-dev @stryker-mutator/core stryker init npm
--save-dev @stryker-mutator/html-reporter
npm install --save-dev @stryker-mutator/typescript
npm install --save-dev @stryker-mutator/jest-runner

Слайд 34

Stryker.js

npm install -g stryker-cli

npm install --save-dev @stryker-mutator/core

stryker init

npm install -g stryker-cli

npm install

Stryker.js npm install -g stryker-cli npm install --save-dev @stryker-mutator/core stryker init npm
--save-dev @stryker-mutator/html-reporter
npm install --save-dev @stryker-mutator/typescript
npm install --save-dev @stryker-mutator/jest-runner

stryker run

Слайд 35

Stryker.js

stryker run

Stryker.js stryker run

Слайд 36

Stryker.js

module.exports = function(config) {
config.set({
...
});
};

stryker.conf.js

Stryker.js module.exports = function(config) { config.set({ ... }); }; stryker.conf.js

Слайд 37

Stryker.js

module.exports = function(config) {
config.set({
...
mutator: "typescript",
testRunner: "jest",
jest: {

Stryker.js module.exports = function(config) { config.set({ ... mutator: "typescript", testRunner: "jest", jest:
configFile: "jest.conf.js",
projectType: "angular-cli",
},
});
};

stryker.conf.js

Слайд 38

Stryker.js

module.exports = function(config) {
config.set({
...
reporters: [
"progress",
"clear-text",
"html"
],

Stryker.js module.exports = function(config) { config.set({ ... reporters: [ "progress", "clear-text", "html"
htmlReporter: {
baseDir: 'reports/mutation/html'
},
});
};

stryker.conf.js

Слайд 39

Stryker.js

module.exports = function(config) {
config.set({
...
maxConcurrentTestRunners: 4,
// Recommended to use

Stryker.js module.exports = function(config) { config.set({ ... maxConcurrentTestRunners: 4, // Recommended to
about half of your available cores when running stryker with angular.
});
};

stryker.conf.js

Слайд 40

Stryker.js

module.exports = function(config) {
config.set({
...
maxConcurrentTestRunners: 4,
// Recommended to use

Stryker.js module.exports = function(config) { config.set({ ... maxConcurrentTestRunners: 4, // Recommended to
about half of your available cores when running stryker with angular.
});
};

stryker.conf.js

Слайд 41

Stryker.js

module.exports = function(config) {
config.set({
mutate: [
"src/**/*.ts",
"!src/**/*.spec.ts",
"!src/**/*.module.ts",
"!src/app/test/**/*.ts",
"!src/**/*.routing.ts"

Stryker.js module.exports = function(config) { config.set({ mutate: [ "src/**/*.ts", "!src/**/*.spec.ts", "!src/**/*.module.ts", "!src/app/test/**/*.ts",
],
});
};

stryker.conf.js

Слайд 42

Stryker.js

> stryker run
> INFO ConfigReader Using stryker.conf.js in the current working directory.
>

Stryker.js > stryker run > INFO ConfigReader Using stryker.conf.js in the current
INFO InputFileResolver Found 992 of 2002 file(s) to be mutated.
> INFO InitialTestExecutor Starting initial test run. This may take a while.
> INFO InitialTestExecutor Initial test run succeeded. Ran 1170 tests in 2 minutes 45 seconds (net 54338 ms, overhead 65737 ms).
> INFO MutatorFacade 12094 Mutant(s) generated
> INFO SandboxPool Creating 4 test runners (based on maxConcurrentTestRunners config)

Слайд 43

Stryker.js

> stryker run
> INFO ConfigReader Using stryker.conf.js in the current working directory.
>

Stryker.js > stryker run > INFO ConfigReader Using stryker.conf.js in the current
INFO InputFileResolver Found 992 of 2002 file(s) to be mutated.
> INFO InitialTestExecutor Starting initial test run. This may take a while.
> INFO InitialTestExecutor Initial test run succeeded. Ran 1170 tests in 2 minutes 45 seconds (net 54338 ms, overhead 65737 ms).
> INFO MutatorFacade 12094 Mutant(s) generated
> INFO SandboxPool Creating 4 test runners (based on maxConcurrentTestRunners config)

Слайд 44

Stryker.js

> stryker run
> INFO ConfigReader Using stryker.conf.js in the current working directory.
>

Stryker.js > stryker run > INFO ConfigReader Using stryker.conf.js in the current
INFO InputFileResolver Found 992 of 2002 file(s) to be mutated.
> INFO InitialTestExecutor Starting initial test run. This may take a while.

Слайд 45

Stryker.js

> stryker run
> INFO ConfigReader Using stryker.conf.js in the current working directory.
>

Stryker.js > stryker run > INFO ConfigReader Using stryker.conf.js in the current
INFO InputFileResolver Found 992 of 2002 file(s) to be mutated.
> INFO InitialTestExecutor Starting initial test run. This may take a while.
> INFO InitialTestExecutor Initial test run succeeded. Ran 1170 tests in 2 minutes 45 seconds (net 54338 ms, overhead 65737 ms).
> INFO MutatorFacade 12094 Mutant(s) generated
> INFO SandboxPool Creating 4 test runners (based on maxConcurrentTestRunners config)
-----------------------------|---------|----------|-----------|------------|----------|---------|
File | % score | # killed | # timeout | # survived | # no cov | # error |
-----------------------------|---------|----------|-----------|------------|----------|---------|
All files | 0.00 | 0 | 0 | 12094 | 0 | 0 |
call-step-form.component.ts | 0.00 | 0 | 0 | 11 | 0 | 0 |
... | 0.00 | 0 | 0 | ... | 0 | 0 |
-----------------------------|---------|----------|-----------|------------|----------|---------|
> INFO HtmlReporter Your report can be found at: file:///.../reports/mutation/html/index.html
> INFO Stryker Done in 6 hours 11 minutes.

Слайд 46

Stryker.js

Done in 6 hours 11 minutes

Stryker.js Done in 6 hours 11 minutes

Слайд 47

Stryker.js

-----------------------------|---------|----------|-----------|------------|----------|---------|
File | % score | # killed | # timeout | #

Stryker.js -----------------------------|---------|----------|-----------|------------|----------|---------| File | % score | # killed | # timeout
survived | # no cov | # error |
-----------------------------|---------|----------|-----------|------------|----------|---------|
All files | 0.00 | 0 | 0 | 12094 | 0 | 0 |
call-step-form.component.ts | 0.00 | 0 | 0 | 11 | 0 | 0 |
... | 0.00 | 0 | 0 | ... | 0 | 0 |
-----------------------------|---------|----------|-----------|------------|----------|---------|

https://github.com/stryker-mutator/stryker-handbook/blob/master/mutant-states-and-metrics.md

перцентиль

циферъ

умерло от безысходности

этих даже не искали

живее всех живых

эти поломали нам систему

Слайд 48

Stryker.js

htmlReporter: { baseDir: 'reports/mutation/html' },

Stryker.js htmlReporter: { baseDir: 'reports/mutation/html' },

Слайд 49

Stryker.js

htmlReporter: { baseDir: 'reports/mutation/html' },

Stryker.js htmlReporter: { baseDir: 'reports/mutation/html' },

Слайд 50

Особенности

Особенности

Слайд 51

Особенности

Очень много времени на анализ результатов
Можно настроить запуск на конкретные файлы вручную

Особенности Очень много времени на анализ результатов Можно настроить запуск на конкретные файлы вручную

Слайд 52

Особенности

Очень много времени на анализ результатов
Можно настроить запуск на конкретные файлы вручную
1

Особенности Очень много времени на анализ результатов Можно настроить запуск на конкретные
мутация !== 1 прогон
:(

Слайд 53

Особенности

Очень много времени на анализ результатов
Можно настроить запуск на конкретные файлы вручную
1

Особенности Очень много времени на анализ результатов Можно настроить запуск на конкретные
мутация !== 1 прогон
:(

Слайд 54

Особенности

Очень много времени на анализ результатов
Можно настроить запуск на конкретные файлы вручную
1

Особенности Очень много времени на анализ результатов Можно настроить запуск на конкретные
мутация !== 1 прогон
:(
1 точка в коде почти всегда 1 мутация
Для условий и математики количество мутаций больше
Можно создавать кастомные мутации + количество инстансов должно решить проблему

Слайд 55

Особенности

Очень много времени на анализ результатов
Можно настроить запуск на конкретные файлы вручную
1

Особенности Очень много времени на анализ результатов Можно настроить запуск на конкретные
мутация !== 1 прогон
:(
1 точка в коде почти всегда 1 мутация
Для условий и математики количество мутаций больше
Можно создавать кастомные мутации + количество инстансов должно решить проблему
Нет teamcity-reporter для интеграции
Можно пользоваться репортером jest/karma

Слайд 56

Первые результаты

Первые результаты

Слайд 57

Первые результаты

Стали думать что тестируем и как тестируем
Появились тесты убивающие мутантов
Избавляемся от

Первые результаты Стали думать что тестируем и как тестируем Появились тесты убивающие
тяжёлых тестов
Выстраиваем пирамиду тестирования здорового программиста

Слайд 58

Спасибо за внимание!

Спасибо за внимание!
Имя файла: Мутационное-тестирование.pptx
Количество просмотров: 39
Количество скачиваний: 0