Использование mock-объектов в модульном тестировании

Содержание

Слайд 2

«Без тестов жить нельзя на свете, нет»

Тесты хорошо, а TDD лучше
Результат применения:
Рабочий

«Без тестов жить нельзя на свете, нет» Тесты хорошо, а TDD лучше
протестированный код
Способствует хорошему дизайну.
Самодокументация

Слайд 3

Unit-тесты. Когда невыгодно/неудобно/не получается использовать

Слишком дорого
Невысокая цена ошибки
Надо было сделать вчера

Unit-тесты. Когда невыгодно/неудобно/не получается использовать Слишком дорого Невысокая цена ошибки Надо было сделать вчера

Слайд 4

Ситуации, когда сложно использовать юнит-тесты

Нужно протестировать класс, который взаимодействует с
с базой данных
с

Ситуации, когда сложно использовать юнит-тесты Нужно протестировать класс, который взаимодействует с с
внешним устройством
с файловой системой
с внешним сервисом
То есть
Если класс взаимодействует с внешней средой, от которой его надо изолировать.
Если класс работает с объектом, методы которого отрабатывают немгновенно.
Особый случай:
Если класс работает с объектом или группой объектов, у которых сложная инициализация.

Слайд 5

Выход – использовать поддельные объекты

Пробуем:
Сделаем вид, что мы не знаем про моки
Ура,

Выход – использовать поддельные объекты Пробуем: Сделаем вид, что мы не знаем
используем мок-фреймворк

Слайд 6

Разновидности поддельных объектов (test doubles)

Dummy
Test Stub
Test Spy
Mock object
Fake Object

Разновидности поддельных объектов (test doubles) Dummy Test Stub Test Spy Mock object Fake Object

Слайд 7

Behavior vs state verification

Mock-стиль проверки (behavior verification) мы проверям, как происходит взаимодействие

Behavior vs state verification Mock-стиль проверки (behavior verification) мы проверям, как происходит
объектов.
Классический стиль проверки (state verification) мы проверяем результаты взаимодействия.

Слайд 8

Принцип работы и ограничения «классических» mock-объектов

Возможности и ограничения:
Можно мочить классы и интерфейсы.
В

Принцип работы и ограничения «классических» mock-объектов Возможности и ограничения: Можно мочить классы
классах можно подменять методы и свойства.
Классы не должны быть sealed.
Свойства и методы должны быть виртуальными (public or internal)

Слайд 9

Существующие фреймворки

NMock, Nmock2 (RR)
Rhino Mocks (AAA, RR, …)
Moq (AAA)
Microsoft.Moles
TypeMock

Существующие фреймворки NMock, Nmock2 (RR) Rhino Mocks (AAA, RR, …) Moq (AAA) Microsoft.Moles TypeMock

Слайд 10

Record-Replay syntax (RR)

(пример кода на Rhino.Mocks)

Record-Replay syntax (RR) (пример кода на Rhino.Mocks)

Слайд 11

Возможности Moq

Последнее обновление — август 2010. Текущая версия — 4.0.
Не поддерживает Record/Replay.
Минимальная

Возможности Moq Последнее обновление — август 2010. Текущая версия — 4.0. Не
версия .NET – 3.0.
Один простой вариант использования: mock = new Mock();
Параметры: явное указание, любые, диапазон, регулярное выражение (пример)
Генерация исключений (пример)
Ruturns: значение, отложенная инициализация и делегат (пример)
Callback. Позволяют накапливать параметры вызванных методов.
Verification (пример)
Возможность настройки поведения при помощи перечисления MockBehavior (примеры)
Можно задавать ожидания по умолчанию в SetUp и переопределять их в тесте
Перегрузка protected методов (пример)
Как «мочить» internal сущности (пример)

Слайд 12

Microsoft.Moles

Не является классической mock-библиотекой.
Может переопределять все, что угодно (пример)
Можно переопределять члены системных

Microsoft.Moles Не является классической mock-библиотекой. Может переопределять все, что угодно (пример) Можно
типов
Есть только заглушки, моков нет
Можно использовать в NUnit и т. д.
Подробнее о возможностях (пример)

Слайд 13

Microsoft.Moles: заглушки и моли

Microsoft.Moles: заглушки и моли

Слайд 14

Мы можем указывать, какие типы хотим переопределять





Мы можем указывать, какие типы хотим переопределять
/>














Слайд 15

Можно управлять поведением

Чтобы изменить поведение объекта, делаем так:
stub.InstanceBehavior = BehavedBehaviors.DefaultValue;
MoleBehaviors.DefaultValue — незамещенные

Можно управлять поведением Чтобы изменить поведение объекта, делаем так: stub.InstanceBehavior = BehavedBehaviors.DefaultValue;
члены класса будут замещены пустым делегатом и возвращать дефолтное значение типа возвращаемого результата
MoleBehaviors.NotImplemented — при обращении к незамещенному члену будет возникать исключение NotImplementedException
MoleBehaviors.Fallthrough — вызовы к незамещенным членам будут обработаны согласно оригинальной реализации их в замещаемом классе

Слайд 16

Microsoft.Moles: выводы

Мощное средство изоляции
Но как всегда есть недостатки:
Не хватает моков
Накладные расходы на

Microsoft.Moles: выводы Мощное средство изоляции Но как всегда есть недостатки: Не хватает
поддержание «теневых» сборок
Некрасивые правила формирования имен
Тормозит рефакторинг

Слайд 17

TypeMock

Платная библиотека для написания тестов в изоляции.
Лишена некоторых недостатков Microsoft.Moles
Осуществляет перехват вызовов

TypeMock Платная библиотека для написания тестов в изоляции. Лишена некоторых недостатков Microsoft.Moles
на уровне всего приложения
Имеется графический тул

Слайд 18

Промежуточные выводы

Использовать Moles и Typemock не всегда полезно
При построении новой логики лучше

Промежуточные выводы Использовать Moles и Typemock не всегда полезно При построении новой
пользоваться DIP и другими инструментами

Слайд 19

Выводы

Использование моков и заглушек:
расширяет применимость юнит-тестов
позволяют легко тестировать объекты, не имеющие состояния
упрощают

Выводы Использование моков и заглушек: расширяет применимость юнит-тестов позволяют легко тестировать объекты,
setup-методы тестов
позволяют тестировать классы в изоляции
Имя файла: Использование-mock-объектов-в-модульном-тестировании.pptx
Количество просмотров: 471
Количество скачиваний: 1