Весенний тест загрузки с использованием тестовых контейнеров 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"));
}
}
}
}
}
Я просто пытаюсь протестировать БД.
Однако, когда я запускаю тест, он не сообщает об этом

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

org.postgresql.util.PSQLException: ERROR: relation "table_from_schema" does not exist
Я пытался отладить его, т. е. остановился прямо внутри моего теста (testPostgreSQLModule). Я вижу компонент докера в Postgres.

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

$ 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»