Есть ли способ удалить все таблицы или обрезать их внутри тестового контейнера Postgres? ⇐ JAVA
-
Гость
Есть ли способ удалить все таблицы или обрезать их внутри тестового контейнера Postgres?
Я ищу способ сделать мои тесты компонентов автономными. Итак, чтобы добиться такого поведения, в некоторых тестах мне нужно иметь «чистую базу данных» или хотя бы «чистую таблицу». Я все еще не мог найти способ сделать это внутри тестового контейнера. Итак, вот что я пробовал до сих пор: Мой класс настройки контейнера:
публичный класс PostgreSqlTestContainer реализует QuarkusTestResourceLifecycleManager {
public static Final PostgreSQLContainer POSTGRES = new PostgreSQLContainer("postgres:alpine"); @Override общественная Map start() { ПОСТГРЕС.старт(); вернуть some_db_config_as_per_doc; } @Override общественная недействительная остановка () { ПОСТГРЕС.стоп(); } Вот класс тестов:
@QuarkusTest @QuarkusTestResource(PostgreSqlTestContainer.class) класс UserResourcesTest { @Тест сценарий_one(){ // создаем нового пользователя // делаем что-то (@POST.. проверяем HTTP == 201) } @Тест сценарий_два(){ // создаем нового пользователя // делаем что-то (@POST.. проверяем HTTP == 201) (проходим) // ищем всех пользователей в базе данных // делаем больше (@GET.. проверяем HTTP == 200) (проходим) // утверждаем, что найден только 1 пользователь // поскольку сценарий_один не должен мешать сценарию_два (провал) } } Второй сценарий не удался, поскольку некоторые «грязные» данные из первого теста все еще находились в контейнере базы данных. Я пытался остановить/запустить контейнер для каждого теста. (очень, очень медленный процесс, иногда появляется ошибка, и снова очень медленный).
@BeforeEach недействительная настройка() { PostgreSqlTestContainer.POSTGRES.stop(); PostgreSqlTestContainer.POSTGRES.start(); } Также пытался обрезать таблицу/удалить всю базу данных:
@Inject Менеджер сущности Менеджер сущности; @BeforeEach частный недействительный откат() { усечь(); } недействительный усечение () { Запрос NativeQuery =entityManager.createNativeQuery("УДАЛИТЬ БАЗУ ДАННЫХ, ЕСЛИ СУЩЕСТВУЕТ имя_базы_данных"); NativeQuery.executeUpdate(); } Я ищу обходной путь для этой проблемы, я просто хочу каким-то образом использовать @BeforeEach для очистки БД перед каждым тестом. Я имею в виду, что все, что мне нужно, — это чистая среда для каждого теста.
Я ищу способ сделать мои тесты компонентов автономными. Итак, чтобы добиться такого поведения, в некоторых тестах мне нужно иметь «чистую базу данных» или хотя бы «чистую таблицу». Я все еще не мог найти способ сделать это внутри тестового контейнера. Итак, вот что я пробовал до сих пор: Мой класс настройки контейнера:
публичный класс PostgreSqlTestContainer реализует QuarkusTestResourceLifecycleManager {
public static Final PostgreSQLContainer POSTGRES = new PostgreSQLContainer("postgres:alpine"); @Override общественная Map start() { ПОСТГРЕС.старт(); вернуть some_db_config_as_per_doc; } @Override общественная недействительная остановка () { ПОСТГРЕС.стоп(); } Вот класс тестов:
@QuarkusTest @QuarkusTestResource(PostgreSqlTestContainer.class) класс UserResourcesTest { @Тест сценарий_one(){ // создаем нового пользователя // делаем что-то (@POST.. проверяем HTTP == 201) } @Тест сценарий_два(){ // создаем нового пользователя // делаем что-то (@POST.. проверяем HTTP == 201) (проходим) // ищем всех пользователей в базе данных // делаем больше (@GET.. проверяем HTTP == 200) (проходим) // утверждаем, что найден только 1 пользователь // поскольку сценарий_один не должен мешать сценарию_два (провал) } } Второй сценарий не удался, поскольку некоторые «грязные» данные из первого теста все еще находились в контейнере базы данных. Я пытался остановить/запустить контейнер для каждого теста. (очень, очень медленный процесс, иногда появляется ошибка, и снова очень медленный).
@BeforeEach недействительная настройка() { PostgreSqlTestContainer.POSTGRES.stop(); PostgreSqlTestContainer.POSTGRES.start(); } Также пытался обрезать таблицу/удалить всю базу данных:
@Inject Менеджер сущности Менеджер сущности; @BeforeEach частный недействительный откат() { усечь(); } недействительный усечение () { Запрос NativeQuery =entityManager.createNativeQuery("УДАЛИТЬ БАЗУ ДАННЫХ, ЕСЛИ СУЩЕСТВУЕТ имя_базы_данных"); NativeQuery.executeUpdate(); } Я ищу обходной путь для этой проблемы, я просто хочу каким-то образом использовать @BeforeEach для очистки БД перед каждым тестом. Я имею в виду, что все, что мне нужно, — это чистая среда для каждого теста.
Мобильная версия