2009-02-14 2 views
5

Я хочу внедрить автоматическое тестирование, используя среду тестирования Microsoft в Visual Studio, для моих проектов разработки программного обеспечения. Я создал несколько тестов, и в целом, это довольно легко использовать.Как вы проверяете свои бизнес-объекты?

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

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

Лучше ли вы принять какой-либо вид очистки после менталитета, то есть, если я тестирую метод AddUser, добавляю ли я пользователя, проверяю мои тесты и удаляю пользователя?

Вы тестируете каждый из методов CRUD одним методом испытаний?

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

Я понимаю, что это довольно широкий вопрос ... просто ищет какое-то направление ... принимая детские шаги.

Подробнее ...

Лота хороших ответов! Я не уверен, что смогу вытащить базу данных. Я использую CSLA как основу для своих объектов. Для проверки этого с помощью макетных объектов потребуется серьезный рефакторинг. Я займусь этим. Хотя, в какой-то момент, я пытаюсь проверить взаимодействие с базой данных ... при использовании макетной базы данных, где/когда вы действительно проверили бы связь с базой данных?

Еще один вопрос ... лучше ли сохранять каждый метод испытаний не зависимым от других тестов?

+0

Нашел несколько хороших правил: http://msdn.microsoft.com/en-us/library/ms379625(VS.80).aspx. Соглашается с тем, что все говорят. – mattruma

ответ

8

В идеале у вас бы были бизнес-объекты, которые напрямую не обращаются к базе данных, а используют вспомогательные объекты или структуру ORM (объектно-реляционное сопоставление). Затем вы можете протестировать свои BO без базы данных, возможно, издеваясь над некоторыми вспомогательными объектами. Это, пожалуй, самый чистый путь, потому что вы избегаете сложности реальной БД и действительно проверяете только свою бизнес-логику.

Если вы не можете избежать объединения бизнес-правил и доступа к БД в один класс (возможно, проблемный дизайн, но иногда трудно избежать), то вам нужно протестировать его с помощью БД.

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

Даже не думайте о попытке инициализации БД один раз, а затем выполните все тесты по тем же данным. Один тест случайно изменит данные, и другие тесты будут таинственно терпеть неудачу. Я сделал это и пожалел об этом ... Каждый тест действительно должен стоять сам по себе.

Чтобы сделать все это, я настоятельно рекомендую использовать какую-либо структуру тестирования БД. Это поможет вам очистить БД, загрузить необходимые данные и сравнить запросы результатов по ожидаемым результатам. Я использую DBUnit (для Java), но есть много других для других языков.

+0

Спасибо! Каковы некоторые базы данных тестирования БД? Или это вы сами строите? – mattruma

+0

Нет, нужно использовать существующую инфраструктуру. Я использую DBUnit, http://www.dbunit.org, но есть и другие. Просто Google для «базы данных единичного тестирования». – sleske

1

Как правило, я создаю BO, сохраняю его в db в настройке прибора, а затем тестирует различные вставки/обновления/выбора, а затем в своем teardown удаляет объект из базы данных. Это держит вещи красивыми и чистыми, особенно когда задействовано множество ограничений, ваш тестовый бит может стать беспорядочным, если вы не удалите все, что вы создаете в своих тестах.

5

Я бы рекомендовал реализовать ваши бизнес-объекты, чтобы они не знали о базе данных. Используйте методы на уровне доступа к данным, которые могут сохранять/извлекать бизнес-объекты должным образом в зависимости от их типа (т. Е. Он имеет внутреннее сопоставление между таблицами и объектами, которые они соответствуют). При тестировании самого бизнес-объекта вам вообще не нужно беспокоиться о базе данных. Просто создайте объект, возможно, используйте отражение, чтобы установить частные поля, и выполните свой тест на объекте.

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

+0

Спасибо! Это звучит неплохо, но звучит как много работы. Я использую инфраструктуру CSLA для своих бизнес-объектов, не знаю, как именно это будет реализовано. – mattruma

2

Использование dependency injection. Реализовать свои методы базы данных в интерфейсе. Затем напишите новую реализацию интерфейса с данными управления, чтобы проверить применимые сценарии.

+0

Спасибо! Я использую CSLA как свою прикладную структуру, которая, похоже, не приветствуется DI. Я бы с удовольствием это сделал! – mattruma

1

Чтобы проверить уровень доступа к БД, вы не должны запускать все тесты на одном и том же уровне. Некоторые тесты могут терпеть неудачу, потому что они зависят от результатов другого теста. Так что это не то, что вы хотите. Фактически после каждого теста вы должны вернуть статус db в исходное состояние до запуска теста.

В моей практике я сохраняю тестовые данные в формате XML и перед каждым тестом настраивает данные в db с помощью XML. Поэтому каждый тест проходит против некоторого набора данных.

1

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

Одним из решений, которое может вам помочь, является использование базы данных в памяти для ваших тестов. SQLite, например, позволяет вам создавать базы данных в памяти «на лету», а когда вы их уничтожаете, их нет. Это значительно ускоряет ваши тесты, и вам не нужно настраивать код очистки - пока вы действительно проверяете свой код SQL/db с помощью автоматических тестов.

0

(я знаю, что ты не использует Java, но общая стратегия ниже не зависит от Java вообще)

Я работаю над проектом Java, который использует много EJB3/JPA коды. Я решил создать своего рода mock-контейнер, способный «развернуть» EJB и использовать базу данных в памяти (HSQL) с менеджером сущностей спящего режима.

Этот «контейнер» запускается менее чем за 1 секунду и позволяет тестировать большинство бизнес-компонентов, включая те, которые обращаются к базе данных через JPA. Если служба, например, слишком сложна для поддержки, то я просто использую EasyMock (или любую другую макетную библиотеку) для создания поддельной службы и подключаюсь к «контейнеру».

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

Смежные вопросы