Есть ли подобный dbunit фреймворк, который не подходит для java / scala? - PullRequest
60 голосов
/ 16 октября 2010

Я думал о создании новой, легкой базы данных о населении. Я абсолютно ненавижу 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? Каждый имеет. Так не должно быть!

Это означает, что если у вас есть полиморфный объект, вы должны объявить все внешние ключи для таблиц присоединения каждого подкласса в первой строке, даже если они имеют значение null. Если вы создаете таблицу для всех шаблонов подклассов, вам все равно нужно указать все поля в первой строке. Это просто ужасно.

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

Ответы [ 13 ]

96 голосов
/ 16 октября 2010

Мне неизвестна какая-либо реальная альтернатива 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 - Главная страница - JavaPolis 2008 или Модульное тестирование: unitils & dbmaintain .

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

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

26 голосов
/ 04 ноября 2010

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

Я не собираюсь отвечать на ваши вопросы, поскольку ваш вопрос на самом деле не связан с DbUnit, а с альтернативами DbUnit. В любом случае, я просто хочу подчеркнуть, что ваша точка 7 полностью ложна: вам больше не нужно указывать все столбцы в первой строке, эта функция называется определением столбцов. Я не буду рассказывать вам, почему он не включен по умолчанию, потому что вы достаточно умны, чтобы понять это самостоятельно.

Я подробно расскажу scaladbtest в надежде, что мы сможем объединить их идеи.

16 голосов
/ 08 апреля 2013

Столкнувшись с аналогичными проблемами при использовании DBUnit, я нашел это: http://dbsetup.ninja -squad.com / index.html , который может решить проблемы. Например, вместо представления тестовых данных в отдельных файлах весь контент БД содержится в самом классе java.

4 голосов
/ 18 ноября 2014

Если вы используете Spring Framework (или не возражаете против его использования хотя бы для тестирования), то Spring DBUnit в настоящее время является лучшей (поддерживаемой) альтернативой обычному DBUnit, Я знаю и использую. Цитирую свой сайт:

Spring DBUnit обеспечивает интеграцию между тестированием Spring фреймворк и популярный проект DBUnit. Это позволяет вам настроить и разбирать таблицы базы данных, используя простые аннотации, а также проверять ожидаемое содержимое таблицы после завершения теста.

Spring DBUnit представляется «несколько официальным» решением Spring для модульного тестирования БД (с DBUnit); по крайней мере, автор / сопровождающий библиотеки Фил Уэбб работает в SpringSource / Pivotal.

3 голосов
/ 17 октября 2010

Я использую DBUnit с несколькими обертками, чтобы сгладить неровные края.Хорошим инструментом, который может дополнять или перекрывать функциональность, является Jailer .Он может извлекать подмножества данных из справочной базы данных и сохранять их либо как XML-файлы, совместимые с DBUnit, либо как «топологически отсортированные файлы DML», которые соответствуют ограничениям внешнего ключа.

2 голосов
/ 12 августа 2016

Я только что выпустил библиотеку под названием JDBDT (Дельта-тестирование базы данных Java), которая Вы можете использовать для настройки и проверки базы данных в тестах программного обеспечения.

Посмотрите на http://jdbdt.org

Лучший, Эдуардо

2 голосов
/ 15 декабря 2011

Вы делаете превосходное замечание.

В последние годы я работал на многих веб-порталах, в основном с PHP, а также с некоторыми Java на том или ином месте.
И, как и вы, я не понимаю этого после всех этих летРазработчики фреймворков и юнит-тестов, похоже, не понимают, насколько сильно изменилась обработка хранилищ за последнее десятилетие.Недостаточно просто отправлять операторы create / insert / truncate в какую-либо базу данных!Если вы работаете в больших масштабах, вы в конечном итоге используете все виды серверных хранилищ, организованных в слои, чтобы быстро выталкивать горячий контент.Плюс на фронте базы данных есть проблема разделения данных.Если у вас нет правильной абстракции внешнего ключа, вы наверняка сойдете с ума, когда ваши настройки хранилища изменятся.И пока мы на этом: упорядочение приборов по приоритету внешнего ключа имеет много подводных камней, и мне еще предстоит найти реальное решение для этого с DBUnit.

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

Не желая походить на фаната: одно место, где все в порядке, это ruby on rails.У этого есть постоянная модель, которую люди, кажется, действительно думают.Если вы имеете дело с PHP, Symfony - это то, что вам нужно.Он ограничен включением по умолчанию Doctrine, причем он также довольно центрирован на DB, но он имеет чистые интерфейсы и большую расширяемость и полностью скопировал систему крепления рельсов.В профессиональном плане мне сейчас нужно придерживаться доморощенных решений, но они работают нормально.

1 голос
/ 11 ноября 2014

У меня тоже были похожие проблемы с DBUnit.Специально для его использования для заполнения локальных данных разработки и экспорта данных из реальной базы данных.Я столкнулся с несколькими случаями, когда он экспортировал набор данных, который не мог импортировать.

Это вдохновило меня на создание новой библиотеки для него: https://github.com/jeffskj/phonydata

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

1 голос
/ 31 августа 2012

Мы пишем Daleq как обертку вокруг DbUnit для решения некоторых из упомянутых проблем. Это позволяет заполнять БД только внутри вашего модульного теста, а не полагаться на редактирование файлов XML.

1 голос
/ 16 октября 2010

Вот краткий список нескольких инструментов в этом ключе (кроме DBunit), которые мне особенно нравятся или которые мне интересны.По крайней мере, они могут предложить некоторое вдохновение:

Обратите внимание, что ни один из них на самом деле не является конкурентом DBunit с точки зрения области действия или набора функций.Тем не менее, есть некоторые интересные идеи, на которые стоит обратить внимание.Удачи!

...