Ищете некоторые стратегии для того, как вы, ребята, загружаете данные по умолчанию при выполнении модульных тестов.Шаблоны для загрузки данных по умолчанию при модульном тестировании
ответ
Я использую строитель, который содержит значения по умолчанию, так же, как это: 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 полей, и вам все равно, что остальное поле.
Для модульного тестирования я обычно не загружаю данные заранее - каждый тест предназначен для работы с источником данных, который может содержать или не содержать уже существующие записи, поэтому каждый тест записывает все записи, необходимые для завершения тест.
При выборе значений для отправки в базу данных я использую GUID (или другие случайные значения), когда это возможно, поскольку это гарантирует уникальность значений в базе данных (например, если вы создаете кого-то по имени «Mr XY», полезно знать, что поиск «X» должен возвращать только один результат, и что нет никаких шансов, вы случайно на кого-то в базе данных, фамилии которого происходит быть Y)
Часто, когда модульное тестирование я нахожусь методы тестирования, которые изменяют данные наряду с методами, которые читают данные, и поэтому мои модульные тесты используют один и тот же API (тот, который тестируется) для записи в базу данных. (Это nice, если каждый модульный тест покрывает определенную область функциональности, но это не обязательно)
Если тестируемый API не имеет методов для записи в базу данных, я пишу свой собственный набор помощников функции - точная структура будет зависеть от источника данных, но в качестве примера я использую LINQ to SQL.
Обычно у меня есть методы, такие как GetCustomer(), которые возвращают общий клиент. Если мне нужно будет вернуть возвращаемый клиентский пакет моим потребностям для конкретного теста, я просто изменю его свойство после его возвращения.
В других случаях я могу передать информацию о конфигурации в свой метод GetCustomer(). Например, GetCustomer (строка customerType).
Я читал мнения экспертов, в которых говорится, что каждый тест должен содержать свои уникальные данные для работы и не пытаться сделать данные обобщенными. Несмотря на то, что это может сделать каждый тест «более крупным» по размеру, по сравнению с ним он станет более ясным, потому что настройка зависит от каждого теста и целей каждого теста. Мне нравится этот совет, потому что я столкнулся со многими случаями, когда пытаюсь сделать общие данные настройки, делал вещи очень неряшливыми очень быстро.
Предпочтительная стратегия - данные транзакции. Весна предлагает обширные support (для JUnit 3 и 4). С помощью этой стратегии ваш тест начинает новую транзакцию каждый раз, и ваши данные откатываются в конце теста.
Конечно, иногда этого недостаточно: либо набор данных слишком обширен, либо разделен между тестами, либо несколько транзакций являются частью области проверки. В этом случае я рекомендую создать общий лоток тестовых данных, созданный до запуска набора тестов. Существуют рамки для этого (dbUnit), но вы также можете обойтись без них, если будете осторожны и последовательны.
UPD: создание данных транзакции не означает, что вам не нужны тестовые данные, вы, вероятно, в конечном итоге создадите повторно используемые и общедоступные вспомогательные классы для поддержания тестовых данных во всех случаях.
TDD о тестировании фрагмента кода в изоляции. Создайте экземпляр класса с его зависимостями (или их издевательствами), вызовите тестируемый метод и подтвердите его, чтобы проверить результат теста.
Обычно с TDD начинается простой тест без данных.Когда необходимы данные, они создаются в тестовом приборе (изолированная среда, где выполняется тест) методом теста setUp()
, а затем уничтожаются методом tearDown()
после того, как тест был запущен. Данные не загружаются из базы данных.
это нормально для простых сценариев, как только вы начинаете создавать различные экземпляры или иметь один, который необходим в различных тестах setUp & tearDown. – eglasius
@eglasius: модульные тесты, написанные с помощью TDD, должны быть простыми сценариями в форме Arrange-Act-Assert; одно приспособление разделяется всеми тестами в наборе и может быть изменено в разделе «Упорядочение» теста. Слишком много для создания в настройке может быть дизайн запаха. – philant
уверен, но есть процессы, которые по своей природе работают с некоторыми данными. Мы говорим о данных, используемых в процессах/логике здесь, экземпляр клиента - это то, что, как правило, не используется в одном месте;) – eglasius
Благодарим за людей ответа. Я использую шаблон Builder в течение некоторого времени и наслаждаюсь обновлением Ян Ван Рисвик в http://elegantcode.com/2008/04/26/test-data-builders-refined/, также смотрю шаблон ObjectMother и ndepend. – Chev