Почему мы пишем фиктивные объекты при написании модульных тестов?

11

В настоящее время мы пишем тестовые случаи в нашем проекте. Реализации для методов базы данных существуют и работают нормально. В этом случае зачем нам писать фиктивные объекты? Есть ли какая-то конкретная причина? Почему я не могу проверить реализацию DAO напрямую?

Винот Кумар СМ
источник

Ответы:

6

Вы не должны издеваться над вызовами в базу данных, потому что это побьет цель. Например, вы ДОЛЖНЫ высмеивать вызовы вашего DAO, скажем, из уровня обслуживания. Пересмешка позволяет тестировать методы изолированно.

Допустим, у вас есть симулятор ресторана с такой архитектурой:

Cook <=> Server <=> Customer

Вы хотите проверить каждый слой независимо. Здесь Serverваш уровень обслуживания и Cookможет рассматриваться как DAO. Это Serverто, что вы хотите высмеять во время тестирования Customer, и Cookэто то, что вы хотите высмеять во время тестирования Server. Тем не Cookменее, модульные тесты должны подтвердить, что реализация возвращает гамбургер, когда заказан гамбургер, а не резиновая шина.

Тайлер Лечить
источник
3
Я не согласен с утверждением, что вы не должны насмехаться над вызовами в базе данных, потому что это нанесло бы ущерб цели. потому что это кажется слишком общим. Как и другие говорят ниже, вам нужно провести единичное тестирование в изоляции. Если вещь, которую вы тестируете, - это доступ к базе данных, то ваш комментарий верен. Если вещь, которую вы тестируете, не имеет доступа к базе данных, тогда ваше первое предложение неверно. Я согласен со всем, что вы говорите. +0. :-)
Питер К.
6

Это вполне нормально для тестирования businesslogic вместе с базой данных. но эти тесты называются интеграционными тестами, даже если вы используете nunit, junit или phpunit для их выполнения.

Юнит- тесты - это специализированные тесты, в которых важно тестирование изолированно (т. Е. Бизнес- логика без базы данных). Моксы / подделки / вставки используются для обеспечения этой изоляции.

k3b
источник
2

Просто: для проверки фактического DAO, а не содержимого базы данных.

Предположим, у вашего класса DAO Person есть метод getByName (). Вы пишете тест и вызываете Person.getByName («Джон Смит»). Предположим, что тест не пройден, потому что кто-то удалил запись Джона из базы данных. Теперь каждое программное обеспечение CI и ваши супервизоры / рецензенты могут утверждать, что ваше программное обеспечение неисправно, хотя на самом деле это не так. Если вы имитируете БД, вы можете доказать, что ваш DAO работает, если ему дана правильная строка из правильной таблицы.

Если вы действительно хотите проверить саму базу данных, то есть: если выполнение определенного метода DAO переводит данные в определенное состояние, то это также возможно. Более того, это действительно полезно для дурацких моделей данных (EAV, набор вложенных деревьев), где вы не можете ожидать, что база данных обеспечит пуленепробиваемую целостность. Взгляните на DBUnit, чтобы сделать вашу жизнь проще.

Яцек Прусия
источник
1

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

Джереми
источник
0

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

Craig
источник
Вы непосредственно вызываете и тестируете методы в имплантации DAO?
Винот Кумар CM