Spring Boot Test с использованием TestContainers PostgreSQLJAVA

Программисты JAVA общаются здесь
Ответить
Anonymous
 Spring Boot Test с использованием TestContainers PostgreSQL

Сообщение Anonymous »

У меня есть проект загрузки Java Spring, который сильно использует базу данных (Postgres) для его репозитория/данных. Это основной проект MVC, контроллеры - все это контроллеры REST. Проект работает хорошо (сервис встат, способный звонить в службу через клиенты Rest и все). < /P>
Теперь я добавляю в него модульные тесты. Я довольно новичок в Spring Boot и, в основном, модульная тестовая часть. Из -за CI/CD (конвейер Build) я не могу использовать постоянный/внешний DB для тестов. Следовательно, мне нужно использовать DB. < /P>
Первоначальный запуск (основной класс) запускает кучу запросов DB для создания кэша во время появления проекта. Поэтому мне понадобится Postgres DB для тестирования (много используемых функций DB). < /P>
По сути, мне нужно было бы использовать TestContainers (PostgreSQL). Сначала я пишу очень базовый тест, ч т о б ы з а в л а д е т ь е г о . < c o d e > s r c < b r / > | < b r / > m a i n < b r / > t e s t < b r / > | < b r / > r e s o u r c e s < b r / > | < b r / > a p p l i c a t i o n - t e s t . p r o p e r t i e s < b r / > s c h e m a . s q l < b r / > d a t a . s q l < b r / > < / c o d e > < b r / > С о о т в е т с т в у ю щ и й p o m . x m l < / p > < b r / > < c o d e > & l t ; p r o p e r t i e s & g t ; < b r / > & l t ; j a v a . v e r s i o n & g t ; 1 1 & l t ; / j a v a . v e r s i o n & g t ; < b r / > & l t ; t e s t c o n t a i n e r s . version>1.15.1




org.springframework.boot
spring-boot-starter-data-jdbc


org.springframework.boot
spring-boot-starter-data-jpa


org.springframework.boot
spring-boot-starter-web


org.springframework.boot
spring-boot-starter-cache


org.springframework.boot
spring-boot-starter-security


io.jsonwebtoken
jjwt
0.9.1


org.springframework.boot
spring-boot-starter-validation


org.springframework.boot
spring-boot-devtools
runtime
true


org.springframework.boot
spring-boot-starter-actuator


org.springframework.boot
spring-boot-starter-test
test


org.junit.vintage
junit-vintage-engine





org.postgresql
postgresql
runtime


com.fasterxml.jackson.core
jackson-databind
2.11.2


org.apache.commons
commons-lang3
3.11


commons-beanutils
commons-beanutils
1.9.4


org.json
json
20201115



org.testcontainers
testcontainers
${testcontainers.version}
test


org.testcontainers
localstack
${testcontainers.version}
test


org.testcontainers
junit-jupiter
${testcontainers.version}
test


org.testcontainers
postgresql
${testcontainers.version}
test



< /code>
Мой тестовый класс: < /p>

Код: Выделить всё

@Testcontainers
@Sql(scripts = {"file:src/test/resources/schema.sql","file:src/test/resources/data.sql"})
class ApplicationTests {

@Container
static PostgreSQLContainer postgreSQLContainer = new PostgreSQLContainer("postgres:12")
.withUsername("testcontainers")
.withPassword("testcontainers")
.withDatabaseName("tescontainers");

@Test
void testPostgreSQLModule() throws SQLException {
try (Connection connection = DriverManager
.getConnection(postgreSQLContainer.getJdbcUrl(), "testcontainers", "testcontainers");
PreparedStatement preparedStatement = connection.prepareStatement("SELECT * FROM table_from_schema")) {
try (ResultSet resultSet = preparedStatement.executeQuery()) {
while (resultSet.next()) {
System.out.println(resultSet.getString("column1"));
}
}
}
}
}
< /code>
Я просто пытаюсь протестировать db. < /p>
Однако, когда я запускаю тест, он не говоря уже о том, что < /p>
org.postgresql.util.PSQLException: ERROR: relation "table_from_schema" does not exist
< /code>
Я попытался отладить его, то есть остановился прямо в моем тесте (testpostgresqlmodule). Я вижу компонент Docker с Postgres. < /P>
$ docker ps
CONTAINER ID        IMAGE                       COMMAND                  CREATED             STATUS              PORTS                     NAMES
fc3ff1e04ceb        postgres:12                 "docker-entrypoint.s…"   16 seconds ago      Up 15 seconds
Но когда я вхожу в него вход и запускаю PSQL, я вижу, что создается DB (Tescontainers), однако у него нет схемы (таблицы/функции).
tescontainers=# \dt
Did not find any relations.
tescontainers=#
< /code>
По сути, мои файлы не запускаются. < /p>
Аннотация @SQL на уровне класса не работает с инициализацией TestContainers, как в моем случае? Тем не менее, у меня есть много данных для инициализации, и файл слишком велик (и будет расти), поэтому я разделяю DDL (схемы) и вставки (данные). Теперь моя проблема заключается в том, как запустить несколько файлов init (schema.sql, data.sql), используя «internitscript»? Поэтому я пытаюсь аннотация @SQL, но она, кажется, не работает. Если кто-то может направлять, пожалуйста? (функции и т. Д.). Таким образом, пробуйте TestContainers. Следовательно, для test (только) мне нужен новый DB в памяти со всеми схемами/данными (которые я могу предоставить с помощью файлов SQL), чтобы во время теста загрузка должна использовать этот тест DB, и соответствующие тесты будут работать на основе этих начальных данных. Инициализация теста DB (до любых тестов). Есть идеи о том, что лучше всего подходит?


Подробнее здесь: https://stackoverflow.com/questions/679 ... postgresql
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «JAVA»