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