Подтвердить что ты не робот

Есть ли 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] в реальное значение null. Вы должны вручную добавить его. Скажите, кто не сделал это с dbunit? Каждый имеет. Это не должно быть так!

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

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

4b9b3361

Ответ 1

Я не знаю никакой реальной альтернативы DbUnit, и ни один из инструментов, упомянутых @Joe, не на моих глазах:

  • Incanto: не агностик DB
  • SQLUnit: регрессионный и модульный испытательный жгут для тестирования хранимых процедур базы данных (это не то, о чем идет DbUnit)
  • Cactus: инструмент для тестирования внутри контейнера (я не вижу, где это помогает с базами данных)
  • 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, что я могу сказать, сделайте это. Но не забывайте, что разглагольствовать легко, придумывая решения, используя ваши собственные решения, это не так.

Ответ 2

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

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

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

Ответ 3

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

Ответ 4

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

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

Spring DBUnit представляется "некоторым официальным решением Spring для тестирования блока БД (с DBUnit); по крайней мере автор/хранитель библиотеки, Фил Вебб, работает в SpringSource/Pivotal.

Ответ 5

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

Ответ 6

Ты делаешь отличную оценку.

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

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

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

Ответ 7

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

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

Ответ 8

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

Ответ 9

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

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

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

Ответ 10

Альтернативу, использующую конфигурацию Spring и тестирование Specs2, можно найти здесь

Ответ 11

Я только что выпустил groovy основанную на DSL фреймворк под названием pedal-loader, доступный через github. Документация здесь.

Это позволяет вам напрямую работать с абстракцией уровня сущности JPA. Поскольку это groovy script, вы можете использовать все конструкторы groovy.

Чтобы вставлять строки в таблицу, поддерживаемую объектом JPA, называемым Student, с полями (не столбцами базы данных, а отображаемыми полями), называемыми id, name и grade, вы бы сделали что-то вроде этого:

allStudents = table(Student, ['id', 'name', 'grade']) {
    row 1, 'Joe', Grade.A
    rowOfInterest = row 2, 'John', Grade.B
}

Класс - это перечисление в классе Student, которое сопоставляется с столбцом базы данных (возможно, с использованием JPA 2.1 @Convert аннотации). allStudents - это список, который будет содержать строки, а rowOfInterest - ссылка на определенную строку. Эти свойства (allStudents и rowOfInterest) становятся доступными для вашего unit test.

Ответ 12

Ситуация с DBUnit действительно иногда расстраивает. Некоторая проблема решена из Marc Philipp с dbunit-datasetbuilder, особенно если вы объедините его с валидатор, который находится на очень ранней стадии. Вы можете увидеть его в действии на SZE.

Отказ от ответственности: все ссылки на github-ресурсы поддерживаются мной.

Ответ 13

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

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

Бест, Эдуардо