2010-09-20 2 views
4

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

+0

Благодарим за людей ответа. Я использую шаблон Builder в течение некоторого времени и наслаждаюсь обновлением Ян Ван Рисвик в http://elegantcode.com/2008/04/26/test-data-builders-refined/, также смотрю шаблон ObjectMother и ndepend. – Chev

ответ

1

Я использую строитель, который содержит значения по умолчанию, так же, как это: http://elegantcode.com/2008/04/26/test-data-builders-refined/. Тогда тест определяет только значение, которое она ухаживает за:

Customer customer = new CustomerBuilder() 
    .WithFirstName("this test only cares about a special ' ... first name value"); 

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

Это вопрос удобства/проведения испытаний простым, много раз вы испытываете очень специфическое поведение, которое зависит от 1-3 полей, и вам все равно, что остальное поле.

1

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

При выборе значений для отправки в базу данных я использую GUID (или другие случайные значения), когда это возможно, поскольку это гарантирует уникальность значений в базе данных (например, если вы создаете кого-то по имени «Mr XY», полезно знать, что поиск «X» должен возвращать только один результат, и что нет никаких шансов, вы случайно на кого-то в базе данных, фамилии которого происходит быть Y)

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

Если тестируемый API не имеет методов для записи в базу данных, я пишу свой собственный набор помощников функции - точная структура будет зависеть от источника данных, но в качестве примера я использую LINQ to SQL.

0

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

В других случаях я могу передать информацию о конфигурации в свой метод GetCustomer(). Например, GetCustomer (строка customerType).

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

1

Предпочтительная стратегия - данные транзакции. Весна предлагает обширные support (для JUnit 3 и 4). С помощью этой стратегии ваш тест начинает новую транзакцию каждый раз, и ваши данные откатываются в конце теста.

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

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

1

TDD о тестировании фрагмента кода в изоляции. Создайте экземпляр класса с его зависимостями (или их издевательствами), вызовите тестируемый метод и подтвердите его, чтобы проверить результат теста.

Обычно с TDD начинается простой тест без данных.Когда необходимы данные, они создаются в тестовом приборе (изолированная среда, где выполняется тест) методом теста setUp(), а затем уничтожаются методом tearDown() после того, как тест был запущен. Данные не загружаются из базы данных.

+0

это нормально для простых сценариев, как только вы начинаете создавать различные экземпляры или иметь один, который необходим в различных тестах setUp & tearDown. – eglasius

+0

@eglasius: модульные тесты, написанные с помощью TDD, должны быть простыми сценариями в форме Arrange-Act-Assert; одно приспособление разделяется всеми тестами в наборе и может быть изменено в разделе «Упорядочение» теста. Слишком много для создания в настройке может быть дизайн запаха. – philant

+0

уверен, но есть процессы, которые по своей природе работают с некоторыми данными. Мы говорим о данных, используемых в процессах/логике здесь, экземпляр клиента - это то, что, как правило, не используется в одном месте;) – eglasius