Комментарии 49
используя Embedded PostgreSQL server, surefire пробовали использовать PostgresEmbeddedService?
из того абзаца по пунктам.
1) то же самое можно сделать и в yandex-qatools, хотя да, "из коробки" это сразу не работает
2) версия подменяется при создании экземпляра класса EmbeddedPostgres, о чём в README.md в секции "How to use your custom version of PostgreSQL" написано
3) в qatools пока больших лагов в общении не заметил
4) для "разобраться" в кишках в том, как работает qatools чтобы сделать парочку исправлений мне хватило пары. дней. Для базовых настроек даже не помню сколько потратил времени, но очень мало
5) про логирование в том же README.md написано, а про "запуск одной строкой" — тоже вроде как работает "из коробки" — EmbeddedPostgres().start(_набор_параметров_длязапуска)
У otj-pg-embedded постгрес идет внутри джарки, а у яндекса при запуске тестов постгрес качается с интернета.
Если в компании такая ситуация, что есть много разработчиков и, главное, автоматизированных стендов, всяких CI и аналогичных, которые на чистой среде постоянно запускают сборку, то внешнему интернет-каналу быстро станет грустно и время сборки сильно увеличится на ожидание скачивания постгреса с сети, дополнительно добавляя новую точку отказа для сборки новой ветки. Нужно будет думать о кешировании-проксировании. А в случае с otj-pg-embedded, все быстро решается проксирующим мавен-репозиторием, который, как мне кажется, стоит в большинстве компаний с собстенной разработкой на java.
говорят, что если в ~/.embedpostgresql
подсунуть нужный архив, то из интернета ничего скачиваться не будет.
А ещё можно при запуске передать runtimeConfig, в котором переопределить под свои потребности PostgresDownloadConfigBuilder и указать свой источник дистрибутивов
эм. а как доставка в образ дистрибутива происходит в otj-pg-embedded? разве не так же?
т.е. есть "голый" образ, в который доставляется архив дистрибутива сервера, либо есть "неголый" образ с уже залитым дистрибутивом
1.git clone…
2.cd…
3.mvn clean install
повторю вопрос — откуда otj-pg-embedded в этом образе получает дистрибутив PostgreSQL? и как выглядит у вас запуск сервера БД? не "EmbeddedPostgresRules.singleInstance();" же используете?
а разве postgres.start(cachedRuntimeConfig("/path/to/my/extracted/postgres"));
это не то самое "кастомное"?
и даже без CI.
Пришёл новый разработчик в компанию. И вместо git clone && mvn clean install, еще придётся постгрес качать, разворачивать.
Говорят, хорошая примета сперва искать готовые решения :)
https://github.com/honourednihilist/gradle-postgresql-embedded
https://github.com/honourednihilist/gradle-postgresql-embedded-example
Сейчас это выражение выглядит мягко говоря разжигающим, поэтому просьба подкорректировать.
Спасибо за статью, кто-то давно должен был написать что-то подобное, поскольку изложенная проблема актуальна долгое время, но при этом ни одной внятной статьи на данную тему я пока не видел.
Когда создавался проект postgresql-embedded, я к сожалению, не нашёл otj-pg-embedded и поэтому на коленке собрал своё решение, которое постепенно приобрело некоторую популярность. Основано оно было на библиотеке, которую использует embed.mongo, а в ней было обнаружилось немало архитектурных проблем, что в итоге сказалось на удобности API… Но история долгая, с тех пор API попричесался, а некоторые изложенные в статье проблемы на текущий момент решены.
Присоединяюсь к предыдущему комментарию — большая просьба подредактировать текст и убрать слова про «Детище Яндекса», поскольку они довольно далеки от реальности.
Хочу также слегка оправдаться за доставку артефакта из внешней сети. Данный вопрос поднимался в issues. На текщий момент это не совсем тривиально, но тем не менее довольно легко сконфигурировать с помощью PostgresDownloadConfigBuilder, который передаётся в RuntimeConfigBuilder. Там можно задать любой источник архивов, в том числе и локальный maven репозиторий.
Там можно задать любой источник архивов, в том числе и локальный maven репозиторий.
Теперь можно указывать и артефакт в удаленном maven совместимом репозитарий с помощью MavenDownloader
Тест эмулирует внешний репозитарий.
Про библиотеку по скачиванию артефактов рассказывал в публикации. Она в том числе умеет читать .m2/settings.xml и определять зеркала и т.п.
А не проще ли использовать обычный отдельный PostgreSQL в Docker-контейнере? Нужен постгрес с кастомными расширениями и конфигами? Написал Dockerfile с этим всем и дальше уже проблемы докера — он и установит и соберёт и образ полученный закэширует.
нет, не проще.
тут сейчас как? есть Maven/Gradle и JDK. Запустил и понеслось хоть прям из IDE.
А вы как предлагаете? Отдельно поставить ещё и Docker и потом уже запускаться, да?
Здесь же говорится про запуски со стороны разработчика, а не серверного стенда.
Например у нас применяется гибридная модел — Embedded & Docker
Мы используем свой велосипед, но я хочу перейти на TestContainers
По статье и комментам сложилось впечатление, что всё это актуально только для экосистемы Java. Правильно?
Интересно ваше мнение на этот счёт. Спасибо.
Юнит-тестирование SQL-кода должно не трогать не базу, а остальной код, в данном случае Java похоже. Судя по всему возможностей Hibernate оказалось недостаточно и ребята стали писать SQL-запросы руками. А их надо как-то тестировать.
вполне нормально, когда часть или все Unit-тесты прогонятся у разработчика "здесь и сейчас", а не ожидая своей очереди на CI сервере.
С другой стороны, та же связка IDEA+TeamCity позволяет отправлять на CI патчи без коммита в VCS с целью протестировать. Хотя это тоже поставит их в очередь.
Еще такой нескромный вопрос — почему в качестве пула выбрали c3p0, а не, к примеру, hikaricp? hikaricp вроде как активно развивается по сравнение с теми же c3p0,bonecp… Или вам было достаточно c3p0 и вы с ним уже работали, поэтому не стали использовать что-то другое?
эм, а вопрос точно мне предназначается?
конечно вопрос был адресован автору статьи — deebun, забыл упомянуть его в предыдущем комментарии…
deebun ответьте, пожалуйста, на этот вопрос, если вам будет не сложно:
Еще такой нескромный вопрос — почему в качестве пула выбрали c3p0, а не, к примеру, hikaricp? hikaricp вроде как активно развивается по сравнение с теми же c3p0,bonecp… Или вам было достаточно c3p0 и вы с ним уже работали, поэтому не стали использовать что-то другое?
а перейти на HikariCP думаете? он пошустрее будет. Или ваши тесты показали иное? Или "работает и ладно"?
Там где практикуется TDD часто просто нельзя отправлять коммиты в репу без всех зеленых тестов.
Можно сделать Speedup unit tests by moving MySql data to memory,
Переход на embedded PostgreSQL в unit-тестах