Модульное тестирование

Содержание

Слайд 2

Модульное тестирование

Модульное тестирование

Слайд 3

Важность модульного тестирования

Важность модульного тестирования

Слайд 4

Принципы модульного тестирования

Тест – это часть кода, которая выполняет другой код и

Принципы модульного тестирования Тест – это часть кода, которая выполняет другой код
проверяет, приводит ли этот код к ожидаемому состоянию (тестирование состояния) или выполняет ожидаемую последовательность событий (тестирование поведения).

Слайд 5

Преимущества и недостатки модульного тестирования

Преимущества и недостатки модульного тестирования

Слайд 6

Рефакторинг кода

Рефакторинг кода – процесс улучшения кода без внесения изменений функциональности.
Грязный код:
появляется

Рефакторинг кода Рефакторинг кода – процесс улучшения кода без внесения изменений функциональности.
в процессе частых изменений;
низкая квалификация, лень;
источник ошибок и непредсказуемого поведения
Чистый код:
легкость чтения, понимания и поддержки;
снижение вероятности появления ошибок;
упрощение отлова и исправления ошибок;

Слайд 7

Области тестирования

Тестирование нецелесообразно:
1.1 – простой код без зависимостей – код тривиальный и

Области тестирования Тестирование нецелесообразно: 1.1 – простой код без зависимостей – код
не предполагает ошибок
1.2 – сложный код с большим количеством зависимостей – код плохо скомплектован и требует пересмотра
Тестирование целесообразно:
2.1 – сложный код без зависимостей – обычно правильно описанная бизнес-логика
2.2 – простой код с зависимостями – обычно код, связывающий различные компоненты, соприкасается с интреграционном тестированием

Количество
зависимостей

Сложность компонента

Слайд 8

ПРИНЦИПЫ F.I.R.S.T.

CLEAN CODE
BY ROBERT MARTIN

ПРИНЦИПЫ F.I.R.S.T. CLEAN CODE BY ROBERT MARTIN

Слайд 9

FAST

Проблема медленных тестов:
Запускаются редко
->
Повышается вероятность пропуска ошибки
->
«Дырявые» тесты требуют постоянной

FAST Проблема медленных тестов: Запускаются редко -> Повышается вероятность пропуска ошибки ->
переработки
->
Поддержка тестов откладывается
->
Повышается вероятность выхода ошибок в production.

Быстрота = скорость выполнения + легкость понимания
Пути повышения быстроты тестов:
Один assert за тест;
Использование Dependency Injection;
Интуитивно-понятное именование;
Применение DSL (domain-specific language);

Слайд 10

INDEPENDENT ISOLATED

Независимость тестов достигается путем применения паттерна BUILD – OPERATE – CHECK.
BUILD –

INDEPENDENT ISOLATED Независимость тестов достигается путем применения паттерна BUILD – OPERATE –
настройка теста
OPERATE – запуск тестируемой функциональности
CHECK – сравнение полученного результата с ожидаемым

Слайд 11

REPEATABLE

Повторяемость достигается с помощью применения тестовых двойников (test doubles):
Dummy objects – передаваемые,

REPEATABLE Повторяемость достигается с помощью применения тестовых двойников (test doubles): Dummy objects
но неиспользуемые объекты;
Fake objects – заведомо подмененные системы с аналогичной функциональностью, но упрощенные для использования в тестовом случае (InMemoryDatabases, HashTables, etc.);
Mocks – заглушки, предназначенные для регистрации вызовов;
Stubs – заглушки, отвечающие на вызовы согласно настроенному сценарию ответов;
Spies – заглушки (аналогично Stubs), но позволяющие регистрировать действия;
* by Martin Fowler

Слайд 12

SELF-VALIDATING

Результат теста должен представлять собой булево значение и не требовать дополнительной интерпретации.
Принцип

SELF-VALIDATING Результат теста должен представлять собой булево значение и не требовать дополнительной
достигается, используя:
Булев результат;
Один assert на тест;
Build – Operate – Check паттерн;

True

False

Слайд 13

Значение новых модульных тестов падает пропорционально объему написанного кода.
Высшее выражение принципа –

Значение новых модульных тестов падает пропорционально объему написанного кода. Высшее выражение принципа – TDD подход. TIMELY
TDD подход.

TIMELY

Слайд 14

Эволюция модульного тестирования

Эволюция модульного тестирования

Слайд 15

Фреймворк JUnit

JUnit – фреймворк автоматизированного модульного тестирования для Java. Также портирован на

Фреймворк JUnit JUnit – фреймворк автоматизированного модульного тестирования для Java. Также портирован
многие языки программирования.
Основные особенности JUnit-тестов:
регрессионность;
повторяемость

Разработчики: Кент Бек, Эрих Гамма
Платформа: Java

Преимущества:
доступен для написания модульных и интеграционных тестов;
является хорошим средством документирования кода;
совместимость с популярными IDE;
использует синтаксис Java;

Недостатки:
Не осуществляет тестирование зависимостей;

Слайд 16

История JUnit

История JUnit

Слайд 17

JUnit 4 Annotations

JUnit 4 Annotations

Слайд 18

JUnit 4 Assertions

JUnit 4 Assertions

Слайд 19

ЗАМЕТКИ НА ПОЛЯХ

JUnit 4

ЗАМЕТКИ НА ПОЛЯХ JUnit 4

Слайд 20

Фреймворк Junit 5

JUnit 5 = JUnit Platform + JUnit Jupiter + JUnit

Фреймворк Junit 5 JUnit 5 = JUnit Platform + JUnit Jupiter +
Vintage
JUnit Platform – платформа для запуска TestEngine API.
JUnit Jupiter – проект для написания и запуска тестов, написания собственных расширений.
JUnit Vintage – проект для обеспечения совместимости с предыдущими версиями JUnit.

Основные нововведения JUnit 5:

Слайд 21

JUnit 5 Annotations

JUnit 5 Annotations

Слайд 22

JUnit 5 Extensions

Одно из нововведений JUnit 5 – расширения (extensions), заменяющие правила (rules)

JUnit 5 Extensions Одно из нововведений JUnit 5 – расширения (extensions), заменяющие
JUnit 4.
JUnit 5 определяет 5 типов расширений:
test instance post-processing – расширение применяется после создания сущности теста;
conditional test execution – определяет, будет ли запускаться тест
life-cycle callbacks – связан с вызовом методов обратного вызова;
parameter resolution – позволяет работать с параметризованными методами;
exception handling – позволяет определять логику в случае выбрасывания исключения.

Слайд 23

Библиотеки модульного тестирования

AssertJ – библиотека с открытым исходным кодом, предназначенная для написания

Библиотеки модульного тестирования AssertJ – библиотека с открытым исходным кодом, предназначенная для
наглядных и интуитивно понятных assert’ов. Активно применяется для тестирования совместно с JUnit.
Точка входа в выражения AssertJ – assertThat(), в которым передаются тестируемые данные. Само выражение не выполняет проверку, а позволяет строить проверочные цепочки.
import static org.assertj.core.api.Assertions.*;

Hamcrest – библиотека, работающая совместно с JUnit в качестве имплементации механизма проверок.
Точка входа в выражения Hamcrest – assertThat(), в которую передаются тестируемые данные.
Выражение в общем случае получает в виде параметров исследуемый объект, условия проверки и текст сообщения.
import static org.hamcrest.MatcherAssert.assertThat; import static org.hamcrest.Matchers.*;