Как смоделировать БД для тестирования (Java)?

новый ответ на старый вопрос unit-testing (но все немного продвинулось jdbc-driver вперед):

Как смоделировать tests БД для тестирования (Java)?

вы openjdk не моделируете это. вы издеваетесь databases над своими репозиториями databases и не тестируете их, или вы openjdk используете одну и ту же jdbc-driver базу данных в своих тестах openjdk и ​​тестируете свои sqls. Все java БД в памяти не полностью unit-testing совместимы, поэтому они не javax дадут вам полного покрытия jdk и надежности. и никогда не unit-testing пытайтесь имитировать / имитировать jdbc глубокие объекты базы данных, такие databases как соединение, набор результатов tests и т. д., это не дает вам testing вообще никакой ценности и jdbc-driver является кошмаром для разработки javax и поддержки

Иметь личную тестовую databases БД практически невозможно. Вы openjdk должны использовать «общедоступную» БД, доступную jdk для всех

К сожалению, многие jdbc-driver компании до сих пор используют java эту модель, но теперь у нас jdk есть docker, и есть изображения unit-tests почти для каждого БД. коммерческие jdk продукты имеют некоторые jdbc ограничения (например, до dbms нескольких гигабайт данных), которые testing не важны для тестов. также jdk вам нужно, чтобы ваша схема dbms и структура были созданы db на этом локальном БД

«Эти unit-tests тесты, конечно, не быстрые software-testing ...» - тесты БД обычно медленнее, чем unit-tests обычные тесты. На самом деле, медленные database тесты не идеальны.

Да, тесты jre БД медленнее, но не так уж jdk и медленны. Я сделал несколько db простых measurements, и типичный тест javax занял 5-50 мс. что требует unit-test времени, так это запуск приложения. есть unit-testing много способов ускорить это:

  • Первые фреймворки DI (например, Spring) предлагают способ запуска только некоторой части вашего приложения. если вы пишете свое приложение с хорошим разделением логики, связанной с базой данных и не связанной с базой данных, то в своем тесте вы можете start only the db part
  • у каждой базы данных есть множество параметров настройки, что делает ее менее надежной и намного более быстрой. это идеально подходит для тестирования. postgres example
  • вы unittest также можете поместить всю db базу данных в tmpfs

  • Еще одна openjdk полезная стратегия - иметь dbms группы тестов и держать тесты openjdk db выключенными по умолчанию openjdk (если они действительно замедляют java вашу сборку). таким образом, если dbms кто-то действительно работает dbms с db, ему нужно передать software-testing дополнительный флаг в строке unit-testing cmd или использовать IDE db (группы testng и настраиваемые jdbc селекторы тестов идеально db подходят для этого)

Для каждого jdk случая необходимо выполнить unittest определенное количество запросов unit-testing на вставку / обновление, что testing раздражает и требует времени

Часть databases "требует времени" обсуждалась jdk выше. это раздражает? Я видел tests два пути:

  • подготовьте один набор данных для всех тестовых случаев. тогда вы должны поддерживать это и рассуждать об этом. обычно он отделен от кода. в нем есть килобайты или мегабайты. это слишком много, чтобы увидеть на одном экране, понять и обдумать. это вводит связь между тестами. потому что, когда вам нужно больше строк для теста A, ваш count(*) в тесте B не работает. он только увеличивается, потому что даже когда вы удаляете несколько тестов, вы не знаете, какие строки использовались только этим тестом.
  • каждый тест подготавливает свои данные. Таким образом, каждый тест будет полностью независимым, читаемым и понятным. это раздражает? имо, совсем нет! он позволяет очень быстро писать новые тесты и экономит много работы в будущем.

откуда вы знаете, что java в этой таблице 542 строки? »- Один unit-test из основных принципов тестирования test - это возможность тестировать unittest функциональность способом, отличным db от того, который используется jdk в вашем тестируемом коде.

ммм test ... не совсем. главный принцип java - проверить, генерирует ли java ваше программное обеспечение database желаемый результат в ответ test на конкретный ввод. поэтому, если databases вы вызываете dao.insert 542 раза, а database затем ваш dao.count возвращает 542, это unit-testing означает, что ваше программное unit-tests обеспечение работает так, как jdbc указано. если вы хотите, вы database можете вызвать кеш фиксации test / удаления между ними. Конечно, иногда databases вы хотите протестировать jdbc свою реализацию вместо контракта, а jdk затем проверяете, изменило jre ли ваше дао состояние базы javax данных. но вы всегда тестируете testing sql A, используя sql B (вставка databases против выбора, последовательность openjdk next_val против возвращаемого test значения и т. д.). да, у unit-tests вас всегда будет проблема unit-testing «кто будет проверять мои dbms тесты», и ответ: никто, так test что пусть они будут простыми!

другие jre инструменты, которые могут openjdk вам помочь:

  1. testcontainers поможет вам предоставить реальный jre db.

  2. dbunit - поможет вам очистить database данные между тестами

    минусы:

    • требуется много работы для создания и поддержки схемы и данных. особенно когда ваш проект находится на стадии интенсивной разработки.
    • это еще один уровень абстракции, поэтому, если вы вдруг захотите использовать какую-то функцию базы данных, которая не поддерживается этим инструментом, ее может быть сложно протестировать.
  3. testegration - намеревается testing предоставить вам полный, готовый openjdk к использованию и расширяемый unit-test жизненный цикл (раскрытие: я jdbc-driver создатель).

    минусы:

    • бесплатно только для небольших проектов.
    • очень молодой проект
  4. flyway или liquibase - инструменты test миграции БД. они помогают testing вам легко создавать схему java и все структуры в вашей локальной db базе данных для тестов.

java

database

unit-testing

testing

jdbc

2022-10-25T19:43:36+00:00