Mock Objects vs Test Database

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

Ответ 1

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

Ответ 2

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

Также неплохо запускать тесты интеграции с реальной базой данных, чтобы проверить такие вещи, как конфигурация и производительность.

Ответ 3

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

Ответ 4

Обычно вы использовали бы оба этих подхода.

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

Для интеграции и сквозных тестов вы тестируете большие части системы или все это. Затем вы подключитесь к базе данных (потому что это соединение является частью теста). Очевидно, что вы должны убедиться, что база данных находится в известном состоянии и т.д. И т.д.

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

Ответ 5

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

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

Затем вы пишете пример того, как вы можете использовать свой класс, который собираетесь создать. Если вам нравится, вы можете вызвать пример a unit test. Вы издеваетесь над взаимодействием со вспомогательными классами. Когда вы запускаете пример, он терпит неудачу, потому что вы еще не написали код. Теперь вы можете написать код, чтобы он прошел, используя интерфейсы вспомогательных классов, которые вы еще не написали.

Затем вы делаете то же самое со вспомогательными классами, издеваясь над своими помощниками.

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

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

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

Ответ 6

Настройка для тестирования с помощью db может быть сложной. Если вы обнаружите, что тратите больше времени на настройку db, просто для проверки функционального аспекта вашей бизнес-логики, вы можете использовать макет/фальшивку.