Теперь я добавляю в него модульные тесты. Я новичок в загрузке 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
Код: Выделить всё
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