Весенний тест загрузки с использованием тестовых контейнеров postgresqlJAVA

Программисты JAVA общаются здесь
Ответить Пред. темаСлед. тема
Anonymous
 Весенний тест загрузки с использованием тестовых контейнеров postgresql

Сообщение Anonymous »

У меня есть загрузочный проект Java Spring, интенсивно использующий базу данных (Postgres) в качестве репозитория/данных. Это базовый проект MVC, все контроллеры — это REST-контроллеры. Проект работает хорошо (сервис работает, можно вызывать сервис через REST-клиентов и все такое).
Теперь я добавляю в него модульные тесты. Я новичок в загрузке Spring и в основном в части модульного тестирования. Из-за CI/CD (конвейера сборки) я не могу использовать постоянную/внешнюю БД для тестов. Следовательно, мне нужно использовать базу данных в памяти.
Первоначальный запуск (основной класс) запускает несколько запросов к базе данных для создания кеша во время запуска проекта. Поэтому для тестирования мне понадобится БД Postgres (используется множество функций БД).
По сути, мне нужно будет использовать тестовые контейнеры (postgresql). Сначала я пишу очень простой тест, ч т о б ы о с в о и т ь е г о . < / p > < b r / > У м е н я с о х р а н е н ы ф а й л ы S c h e m a . s q l и d a t a . s q l ( к о т о р ы е б у д у т и с п о л ь з о в а т ь с я т о л ь к о д л я т е с т и р о в а н и я ) . < / p > < 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




Мой тестовый класс:

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

@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, я вижу, что БД (тесконтейнеры) создана, однако у нее нет никакой схемы (таблиц/функций).

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

tescontainers=# \dt
Did not find any relations.
tescontainers=#
По сути, мои файлы не запускаются.
Разве аннотация @SQL на уровне класса не работает с инициализацией Testcontainers, как в моем случае?< /p>
Что здесь нужно, чтобы оба моих исходных сценария работали?
Я попробовал использовать .withInitScript, и он заработал. Однако мне нужно инициализировать много данных, а файл слишком велик (и будет расти), поэтому я разделяю DDL (схему) и вставки (данные). Теперь моя проблема заключается в том, как запустить несколько файлов инициализации (schema.sql, data.sql) с помощью «withInitScript»? Поэтому я пытаюсь использовать аннотацию @SQL, но, похоже, она не работает.
---UPDATE/EDIT----
Чтобы прояснить контекст, я ищу ниже. Если кто-нибудь может помочь, пожалуйста?
  • Все профили (dev/ist/uat/prod) должны использовать соответствующую базу данных персистентности (из своего приложения. env.properties).
  • Только для теста, мне нужна БД в памяти, но я не могу использовать H2 (и подобные), так как у меня много тестов, связанных с БД, и нужен Postgres (функции и т. д.). Итак, пробуем тестовые контейнеры.
  • Когда приложение загружается, оно извлекает некоторые данные из соответствующей базы данных (на основе env) для подготовки исходного кеша, а другие методы будут использовать его при обслуживании всех остальных. звонки. Следовательно, для Test (только) мне нужна новая БД в памяти со всей схемой/данными (которые я могу предоставить через файлы SQL), чтобы во время тестирования при загрузке использовалась эта тестовая БД. и соответствующие тесты будут работать на основе этих исходных данных.
  • Поэтому мне нужен способ вызывать тестовую базу данных (в памяти/тестовые контейнеры) при каждом запуске теста и передавать несколько файлов SQL для инициализации. тестовой базы данных (перед запуском любого теста). Есть идеи, какой подход лучше всего?


Подробнее здесь: https://stackoverflow.com/questions/679 ... postgresql
Реклама
Ответить Пред. темаСлед. тема

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

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

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

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

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

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