Что такое издевательство? - PullRequest
463 голосов
/ 19 апреля 2010

Что такое издевательство? .

Ответы [ 8 ]

528 голосов
/ 19 апреля 2010

Пролог: Если вы посмотрите в словаре существительное mock , вы обнаружите, что одно из определений этого слова - что-то, сделанное как имитация .


Насмешка в основном используется в модульном тестировании. Тестируемый объект может зависеть от других (сложных) объектов. Чтобы изолировать поведение объекта, вы хотите заменить другие объекты на макеты, которые имитируют поведение реальных объектов. Это полезно, если реальные объекты нецелесообразно включать в модульный тест.

Короче говоря, издевательство - это создание объектов, имитирующих поведение реальных объектов.


Иногда вы можете захотеть различить издевательство в отличие от заглушка . В этом вопросе могут быть некоторые разногласия, но мое определение заглушки - «минимальный» моделируемый объект. Заглушка реализует достаточно поведения, чтобы тестируемый объект мог выполнить тест.

Макет похож на заглушку, но тест также проверит, что тестируемый объект вызывает макет, как и ожидалось. Часть теста проверяет, что макет использовался правильно.

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

Если вы вместо этого хотите убедиться, что тестируемый объект записывает некоторые конкретные данные в базу данных, вам придется смоделировать базу данных. Ваш тест будет включать утверждения о том, что было записано в макет базы данных.

67 голосов
/ 25 октября 2016

Другие ответы объясняют, что такое насмешка. Позвольте мне рассказать вам об этом пример . И поверьте мне, на самом деле все гораздо проще, чем вы думаете.

tl; dr Это подкласс исходного класса. В него вставлены другие данные, поэтому вы избегаете тестирования вставленных частей и только сосредотачиваетесь на тестировании остальной части кода.


Допустим, вы пишете приложение для iOS и выполняете сетевые вызовы. Ваша задача - протестировать ваше приложение. Тестировать / определять, работают ли сетевые вызовы должным образом, НЕ ВАША ОТВЕТСТВЕННОСТЬ. Это обязанность другой стороны (серверной команды) проверить это. Вы должны удалить эту (сетевую) зависимость и все же продолжать тестировать весь свой код, который работает вокруг it.

Сетевой вызов может вернуть различные коды состояния 404, 500, 200, 303 и т. Д. С ответом JSON.

Ваше приложение должно работать для всех из них (в случае ошибок ваше приложение должно выдать ожидаемую ошибку). Что вы делаете с насмешками, так это то, что вы создаете «мнимые - похожие на реальные» сетевые ответы (например, код 200 с файлом JSON) и тестируете свой код без ', совершая реальный сетевой вызов и ожидая ответа вашей сети. ». Вы вручную жестко кодируете / возвращаете сетевой ответ для ВСЕХ типов сетевых ответов и смотрите, работает ли ваше приложение так, как вы ожидаете. (вы никогда не принимаете / не проверяете 200 с неверными данными, потому что это не ваша ответственность, вы должны проверить ваше приложение с правильными 200, или в случае 400, 500, вы проверяете, правильно ли выдает приложение)

Это создание воображаемого, похожего на реальное, называется насмешкой.

Для этого вы не можете использовать свой исходный код (исходный код не имеет предварительно вставленных ответов, верно?). Вы должны добавить что-то к этому, вставить / вставить те фиктивные данные, которые обычно не нужны (или часть вашего класса).

Таким образом, вы подкласс исходного класса и добавляете все, что вам нужно (здесь, например, сетевой HTTPResponse, данные ИЛИ в случае сбоя, вы передаете правильную errorString, HTTPResponse), что вам нужно, а затем 'тестируете подкласс 'то есть высмеянный класс.
Вы больше не тестируете оригинальный класс. Поддельный / подкласс тестируется от имени исходного класса

Короче говоря, насмешка над упрощением и ограничением того, что вы тестируете, а также заставляет вас кормить то, от чего зависит класс. В этом примере вы избегаете проверки сети сами по себе и вместо этого проверяете , работает ли ваше приложение, как вы ожидаете, с введенными выводами / ответами —— насмешливо классы

Само собой разумеется, вы проверяете каждый сетевой ответ отдельно.


Теперь вопрос, который я всегда думал, заключался в следующем: контракты / конечные точки и, в основном, ответ JSON моих API постоянно обновляются. Как я могу написать модульные тесты, которые принимают это во внимание?

Более подробно об этом: скажем, для модели требуется ключ / поле с именем username. Вы проверяете это, и ваш тест проходит. Через 2 недели сервер меняет имя ключа на id. Ваши тесты все еще проходят. право? или нет?

Это обязанность разработчика бэкэнда обновлять макеты. Должно ли быть частью нашего соглашения, что они предоставляют обновленные макеты?

Ответ на вышеуказанный вопрос заключается в следующем: модульные тесты + ваш процесс разработки в качестве разработчика на стороне клиента должен / будет отлавливать устаревшие смоделированные ответы. Если вы спросите меня, как? хорошо ответ:

Наш кондиционерРеальное приложение может выйти из строя (или не потерпеть неудачу, но не иметь желаемого поведения) без использования обновленных API ... следовательно, если это не удастся ... мы внесем изменения в наш код разработки. Что снова приводит к провалу наших тестов ... которые мы должны исправить. (На самом деле, если мы хотим правильно выполнить процесс TDD, мы не должны писать какой-либо код для поля, пока мы не напишем для него тест ... и увидим, что он не пройден, а затем перейдем к написанию фактического кода разработки для него.)

Все это означает, что бэкэнд не должен говорить: «эй, мы обновили макеты» ... это в конечном итоге происходит через разработку / отладку вашего кода. ‌ّ Потому что это все часть процесса разработки! Хотя, если бэкэнд даст вам надуманный ответ, тогда будет проще.

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

Этот раздел был написан благодаря неспокойной дискуссии в нашей группе по встрече CocoaHead


Только для разработчиков iOS:

Очень хороший пример насмешек - это Практический протокол-ориентированный доклад Наташа Муращева Просто перейдите к минуте 18:30.

Мне очень нравится эта часть из стенограммы:

Поскольку это тестирование ... мы хотим убедиться, что функция get из Gettable вызывается , потому что он может вернуть и функцию теоретически может назначить массив продуктов питания из любого места . Мы нужно убедиться, что он называется;

29 голосов
/ 19 апреля 2010

В SO есть множество ответов и хорошие посты в Интернете о насмешках. Одним из мест, которое вы можете начать искать, является пост Мартина Фаулера Насмешки - это не заглушки , где он обсуждает множество идей насмешки.

В одном абзаце - Моккинг - это особый метод, позволяющий тестировать единицу кода без зависимости от зависимостей. В общем, то, что отличает моделирование от других методов, заключается в том, что фиктивные объекты, используемые для замены кодовых зависимостей, позволят установить ожидания - фиктивный объект будет знать, как он должен вызываться вашим кодом и как реагировать.


Ваш оригинальный вопрос упоминал TypeMock, поэтому я оставил свой ответ на него ниже:

TypeMock - это имя коммерческой среды для насмешек .

Он предлагает все функции бесплатных фреймворков, таких как RhinoMocks и Moq, а также некоторые более мощные опции.

Вопрос о том, нужен ли вам TypeMock, весьма спорен - вы можете делать большинство насмешек, которые вам когда-либо понадобятся, с помощью бесплатных библиотек насмешек, и многие утверждают, что возможности, предлагаемые TypeMock, часто уводят вас от хорошо инкапсулированного дизайна.

В качестве другого ответа было сказано, что «TypeMocking» на самом деле не является определенной концепцией, но может означать тип имитации, который предлагает TypeMock, с использованием профилировщика CLR для перехвата вызовов .Net во время выполнения, что дает гораздо большую возможность имитировать объекты. (не такие требования, как необходимость в интерфейсах или виртуальных методах).

9 голосов
/ 06 февраля 2014

Mock - это метод / объект, который имитирует поведение реального метода / объекта контролируемыми способами. Поддельные объекты используются в модульном тестировании.

Часто тестируемый метод вызывает другие внешние службы или методы внутри него. Это так называемые зависимости. После того, как издевались, зависимости ведут себя так, как мы их определили.

С помощью зависимостей, управляемых имитациями, мы можем легко проверить поведение метода, который мы кодировали. Это юнит-тестирование.

Для чего предназначены фиктивные объекты?

издевается над заглушками

Модульные тесты и функциональные тесты

5 голосов
/ 19 апреля 2010

Цель типов насмешек состоит в том, чтобы разъединить зависимости, чтобы изолировать тест для конкретного модуля. Заглушки - это простые суррогаты, а насмешки - это суррогаты, которые могут проверить использование. Фреймворк-это инструмент, который поможет вам создавать заглушки и насмешки.

РЕДАКТИРОВАТЬ : Так как в оригинальной формулировке упоминается "шутка типа", у меня сложилось впечатление, что это связано с TypeMock. По моему опыту общий термин просто «издевательство». Пожалуйста, не стесняйтесь игнорировать приведенную ниже информацию конкретно о TypeMock.

TypeMock Isolator отличается от большинства других насмешливых фреймворков тем, что он работает с моим изменением IL на лету. Это позволяет имитировать типы и экземпляры, которые большинство других фреймворков не могут имитировать. Чтобы высмеивать эти типы / экземпляры с другими платформами, вы должны предоставить свои собственные абстракции и смоделировать их.

TypeMock предлагает большую гибкость за счет чистой среды выполнения. В качестве побочного эффекта от того, как TypeMock достигает своих результатов, вы иногда получите очень странные результаты при использовании TypeMock.

3 голосов
/ 14 ноября 2017

Mocking генерирует псевдообъекты, которые имитируют поведение реальных объектов для тестов

3 голосов
/ 19 апреля 2010

Я бы подумал, что использование среды для изолятора TypeMock будет TypeMocking.

Это инструмент, который генерирует макеты для использования в модульных тестах, без необходимости писать код с учетом IoC.

1 голос
/ 20 ноября 2014

Если ваш макет включает сетевой запрос, другой альтернативой является использование реального тестового сервера. Вы можете использовать этот сервис для генерации запроса и ответа на ваше тестирование. http://testerurl.com/

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...