Есть ли DbUnit-подобный фреймворк, который не сосать для java/scala?
Я думал о создании новой, облегченной базы данных населения структуры. Я абсолютно ненавижу dbunit. Прежде чем я это сделаю, я хочу знать, если кто-то уже сделал это.
вещи, которые мне не нравятся в dbunit:
1) Самый простой формат для записи и начать устарела. Они хотят, чтобы вы использовали форматы, которые раздуты. Некоторые даже требуют XML-схемы. Да, неважно.
2) они заполняют строки не в том порядке, в котором вы их пишете, а в том порядке, в котором определены таблицы в xml-файле. Это действительно плохо, потому что вы не можете упорядочить свои данные таким образом, чтобы ограничения внешнего ключа не вызывали проблем. Это просто заставляет вас пройти через хлопоты по их полному отключению.
Это также тратит время и раздувает ваши базовые классы junit, чтобы включить код для отключения ограничений внешнего ключа. Вероятно, вам придется проверить тип базы данных (hsqldb и т. д.) и отключить их в конкретных базах данных способами. Это очень плохо.
Это возможно, было бы лучше, если бы dbunit помог отключить ограничения внешнего ключа как часть их структуры автоматически, но они этого не делают. Они действительно следят за диалектами... так почему бы не использовать их для этого? В конечном счете, все это заставляет программиста тратить время и не вставать и быстро тестировать.
3) XML-это боль писать. Мне не нужно больше говорить об этом. Они также предлагают так много способов сделать это, что я думаю, что это просто усложняет дело. Просто предложите один действительно надежный способ и покончим с этим.
4) Когда ваши данные становятся большими, отслеживание идентификаторов и их последовательных/правильных отношений-это королевская боль.
кроме того, если вы не работаете над проектом в течение месяца, как вы помните, что user_id 1 был администратором, user_id 2 был бизнес-пользователем, user_id 3 был инженером и user_id 4 было что-то еще? Возвращение, чтобы проверить это, тратит больше времени. Должен быть значимый способ получить его, кроме произвольного число.
5) это медленно. Я обнаружил, что если hsqldb не используется, это болезненно медленно. Так не должно быть. Есть также множество способов испортить его конфигурацию, поскольку это нелегко сделать "из коробки". Есть горб, который вы должны пройти, чтобы заставить его работать правильно. Все это побуждает людей не использовать его или злиться, когда они начинают его использовать.
6) некоторые значения, как правило, повторяются много, любит даты. Было бы неплохо указать значения по умолчанию, или даже фреймворк автоматически вставляет значения по умолчанию, даже если вы не говорите ему, что там есть значения по умолчанию. Таким образом, вы можете создавать объекты только со значениями, которые вы хотите, и оставить все остальное. Это, конечно, лучше, чем указывать каждый уголок и трещину столбца, если это не требуется.
7) вероятно, самая неприятная вещь заключается в том, что первая запись должна включать все значения - даже пустые заполнители - или будущие строки не будут выбирать столбцы, которые вы фактически указали.
DBunit не имеет разумного значения по умолчанию для перевода [NULL]в реальное нулевое значение. Вы должны вручную добавить его. Скажите мне, кто не сделал этого с dbunit? У всех есть. Так не должно быть!
Это означает, что если у вас есть полиморфный объект, вы должны объявить все внешние ключи к соединительным таблицам каждого подкласса в первой строке, даже если они равны нулю. Если вы делаете таблицу для всех подклассов pattern, вам все равно нужно указать все поля в первой строке. Это просто ужасно.
что-нибудь там, чтобы удовлетворить меня, или я должен стать следующим разработчиком фреймворка гораздо лучшего фреймворка тестирования базы данных?
13 ответов:
Я не знаю никакой реальной альтернативы DbUnit и ни один из инструментов, упомянутых @Joe в моих глазах:
- Incanto: не ДБ агностик
- SQLUnit: регрессионный и модульный тестовый жгут для тестирования хранимых процедур базы данных (это не то, что DbUnit)
- кактус: инструмент для тестирования в контейнере (я не вижу, где это помогает баз данных)
- Liquibase: инструмент миграции базы данных (не загружает/не проверяет данные)
- ORMUnit: может инициализировать базу данных, но это все
- JMock: не конкурирует с DbUnit вообще
Как говорится, я лично использовал DbUnit успешно несколько раз, на небольших и огромных проектах, и я нахожу его довольно полезным, особенно при использовании Unitils и его модуль DbUnit. Это не означает, что он совершенен и не может быть улучшен, но с достойным инструментарием (либо на заказ, либо что-то вроде Unitils), используя его, это был достойный опыт.
Итак, позвольте мне ответить на некоторые ваши вопросы:
1) Самый простой формат для записи и начать устарела. Они хотят, чтобы вы использовали форматы, которые раздуты. Некоторые даже требуют XML-схемы. Да, неважно.
DbUnit поддерживает плоский или структурированный XML, XLS, CSV. Что? революционный формат вы хотели бы использовать? Кстати, DTD или схема не являются обязательными при использовании XML. Но это дает вам хорошие вещи, такие как проверка и автоматическое завершение, как это плохо? И Unitils может генерировать его легко для вас, см. создать XSD или DTD структуры базы данных.
было бы лучше, если бы dbunit помог автоматически отключить ограничения внешнего ключа в рамках своей структуры, но они этого не делают. Они действительно отслеживают диалекты... так почему бы не использовать их для этого? В конечном счете, все это заставляет программиста тратить время и не вставать и быстро тестировать.
Они ждут вашего патча.
между тем, Unitils обеспечивает поддержку прозрачной обработки ограничений, см. отключение ограничений и обновление последовательностей.
3) XML-это боль писать. Мне не нужно больше говорить об этом. Они также предлагают так много способов сделать это, я думаю, что это только усложняет дело. Просто предложите один действительно надежный способ и покончите с этим.
Я думаю, что боль субъективна, но я не нахожу ее болезненной, особенно при использовании схемы и автозаполнения. Что это за серебряная пуля, которую ты предлагаешь?
4) Когда ваши данные становятся большими, отслеживание идентификаторов и их последовательных/правильных отношений-это королевская боль.
держите их маленькими, это знать лучшие практика. Вы идете против известной лучшей практики, а затем жалуетесь...
кроме того, если вы не работаете над проектом в течение месяца, как вы помните, что user_id 1 был администратором, user_id 2 был бизнес-пользователем, user_id 3 был инженером и user_id 4 было что-то еще? Возвращение, чтобы проверить это, тратит больше времени. Должен быть осмысленный способ получить его, отличный от произвольного числа.
да, переключение задач-это счетчик продуктивный. Но поскольку вы работаете с низкоуровневыми данными, вы должны знать, как они представлены, нет никакого волшебного решения, если вы, конечно, не используете API более высокого уровня (но это не цель DbUnit).
5) это медленно. Я обнаружил, что если hsqldb не используется, это болезненно медленно. Так не должно быть. Есть также множество способов испортить его конфигурацию, поскольку это нелегко сделать "из коробки". Есть горб, который вы должны пройти, чтобы заставить его работать право. Все это побуждает людей не использовать его или злиться, когда они начинают его использовать.
это присуще базам данных и JDBC, а не DbUnit. Используйте быструю базу данных, такую как H2, если вы хотите, чтобы все было как можно быстрее (если у вас есть лучший агностический способ делать вещи, я был бы рад узнать об этом).
6) вероятно, самая неприятная вещь заключается в том, что первая запись должна включать все значения - даже пустые заполнители - или будущие строки не будут выберите столбцы, которые вы фактически указали.
не при использовании Unitils, как упоминалось в презентациях, таких как Unitils-Home-JavaPolis 2008 или модульное тестирование: unitils & dbmaintain.
что-нибудь там, чтобы удовлетворить меня, или я должен стать следующим разработчиком фреймворка гораздо лучшего фреймворка тестирования базы данных?
Если вы думаете, что можете сделать вещи лучше, возможно, внести свой вклад в существующие решения. Если это невозможно, и если вы думаете, что можете создать платформу тестирования базы данных killer, что я могу сказать, сделайте это. Но не забывайте, что разглагольствовать легко,придумывать решения, используя свои собственные решения, меньше.
как разработчик DbUnit я благодарен за критику, и я должен частично согласиться с вами. В настоящее время мы начинаем разработку следующего крупного релиза DbUnit, и я хочу пригласить вас принять участие как в обсуждении, так и в разработке.
Я не собираюсь отвечать на ваши вопросы, поскольку ваш вопрос на самом деле не связан с DbUnit, а с альтернативами DbUnit. В любом случае, я просто хочу подчеркнуть, что Ваш пункт 7 полностью ложен: вам не нужно указывать все столбцы на первом строка больше не является функцией, которая называется распознаванием столбцов. Я не собираюсь рассказывать вам, почему он не включен по умолчанию, поскольку вы, безусловно, достаточно умны, чтобы понять это самостоятельно.
Я дам scaladbtest глубокое исследование в надежде, что мы сможем интегрировать свои идеи.
столкнувшись с аналогичными проблемами с помощью DBUnit я нашел это:http://dbsetup.ninja-squad.com/index.html который может решить проблемы. Например, вместо представления тестовых данных в отдельных файлах все содержимое БД содержится в самом классе java.
Если вы используете Spring Framework (или не возражаете использовать его хотя бы для тестирования), то Spring DBUnit в настоящее время является лучшей (поддерживаемой) альтернативой простому DBUnit, который я знаю и использую. Цитируя их сайт:
Весна DBUnit обеспечивает интеграцию между испытанием весны рамки и популярного проекта д. Банкрофт. Он позволяет вам настроить и демонтаж таблиц базы данных с использованием простых аннотаций, а также проверка ожидается, стол содержание после завершения теста.
Spring DBUnit, по-видимому, является "несколько официальным" решением Spring для модульного тестирования DB (с DBUnit); по крайней мере, автор/сопровождающий библиотеки Фил Уэбб работает в SpringSource/Pivotal.
Я использую DBUnit, с несколькими обертками, чтобы сгладить шероховатости. Хороший инструмент, который может либо дополнять, либо перекрывать функциональность тюремщик. Он может извлекать подмножества данных из справочной базы данных и хранить их либо в виде XML-файлов, совместимых с DBUnit, либо в виде "топологически отсортированных файлов DML", которые уважают ограничения внешнего ключа.
Вы делаете отличную точку.
я работал для многих веб-порталов за последние годы, в основном с PHP, но и некоторые Java время от времени.
И, как и вы, я не понимаю, что после всех этих лет framework и unittesting разработчики, похоже, не понимают, насколько сильно изменилась обработка памяти за последнее десятилетие. Недостаточно просто отправить инструкции create/insert/truncate в какую-либо базу данных! Если вы работаете в больших масштабах, вы в конечном итоге используете все виды бэкендов хранения, организованных в слоях, чтобы быстро выталкивать горячий контент. Плюс на фронте базы данных есть проблема разделения данных. Если у вас нет надлежащей абстракции внешнего ключа при условии, что вы, безусловно, сойдете с ума, когда ваша настройка хранилища изменится. И пока мы на нем: порядок крепления по приоритету внешнего ключа имеет много подводных камней, и я еще не видел реального решения для этого сDBUnit
.в любом случае, дело в том, что у вас есть только базовое хранилище базы данных для unittesting недостаточно для сложных настроек хранения, так как они часто не воспроизводят проблемы в живой среде и являются болью в заднице для поддержания.
не желая звучать как фанат: одно место, где все в порядке, это
ruby on rails
. У этого есть постоянная концепция модели, в которую люди, похоже, действительно вложили некоторую мысль. Если вы имеете дело сPHP
,Symfony
- это место, чтобы пойти. Он ограничен включением по умолчаниюDoctrine
, С также довольно DB-centric, но он имеет чистые интерфейсы и большую расширяемость и полностью скопировал систему крепления рельсов. Профессионально мне нужно придерживаться доморощенных решений на данный момент, но они работают нормально.
Я только что выпустил библиотеку под названием JDBDT (Java Database Delta Testing), которая вы можете использовать для установки и проверки базы данных в тестах программного обеспечения.
взгляните на http://jdbdt.org
лучшие, Эдуардо
вот краткий список нескольких инструментов в этом ключе (кроме DBunit), которые мне особенно нравятся или кажутся интересными. По крайней мере, они могут предложить некоторое вдохновение:
обратите внимание, что ни один из них на самом деле не конкуренты для DBunit с точки зрения области или наборов функций. Тем не менее, есть несколько интересных идей, на которые стоит обратить внимание. Удачи вам!
мы пишем Daleq как обертка вокруг DbUnit для решения некоторых из упомянутых проблем. Это позволяет заполнять БД только в рамках вашего модульного теста, а не полагаться на редактирование XML-файлов.
У меня тоже были подобные проблемы с DBUnit. Особенно для использования его для заполнения локальных данных разработки и экспорта данных из реальной базы данных. Я столкнулся с несколькими случаями, когда он экспортировал набор данных, который он не мог импортировать.
это вдохновило меня написать новую библиотеку для него:https://github.com/jeffskj/phonydata
Это использует groovy DSL для определения наборов данных, что обеспечивает очень компактное представление данных и позволяет делайте классные вещи, такие как генерация случайных данных, так как это просто отличный код.
альтернативы с помощью Весна конфигурации и Specs2 тестирование можно найти здесь
Я только что выпустил groovy DSL-фреймворк под названием pedal-loader, доступный через github. Документация здесь.
Это позволяет работать с абстракцией уровня сущности JPA напрямую. Поскольку это скрипт groovy, вы можете использовать все конструкции groovy.
чтобы вставить строки в таблицу, поддерживаемую сущностью JPA под названием Student, с полями (не столбцами базы данных, а сопоставленными полями) под названием id, name и grade, вы должны сделать что-то вроде это:
allStudents = table(Student, ['id', 'name', 'grade']) { row 1, 'Joe', Grade.A rowOfInterest = row 2, 'John', Grade.B }
Grade-это перечисление в классе Student, которое сопоставляется со столбцом базы данных (возможно, с помощью JPA 2.1 @Convert annotation). allStudents-это список, который будет содержать строки, а rowOfInterest-это ссылка на определенную строку. Эти свойства (allStudents и rowOfInterest) становятся доступными для вашего модульного теста.
ситуация DBUnit действительно иногда расстраивает. Некоторые проблемы решаются из Марк Филипп С dbunit-datasetbuilder, особенно, если вы объедините его с оценщика, который находится на очень ранней стадии. Вы можете увидеть его в действии в SZE.
отказ от ответственности: Все ссылки на github-ресурсы поддерживаются мной.