Теперь я добавляю в него модульные тесты. Я новичок в загрузке 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 > < b r / > < 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, как в моем случае?
Что здесь нужно, чтобы запускались оба моих исходных сценария?
Я попробовал использовать .withInitScript, и он запустился. Однако мне нужно инициализировать много данных, а файл слишком велик (и будет расти), поэтому я разделяю DDL (схему) и вставки (данные). Теперь моя проблема заключается в том, как запустить несколько файлов инициализации (schema.sql, data.sql) с помощью «withInitScript»? Поэтому я пробую аннотацию @SQL, но, похоже, она не работает.
---ОБНОВЛЕНИЕ/РЕДАКТИРОВАНИЕ----
Чтобы прояснить контекст, я ищу текст ниже. Если кто-нибудь может помочь, пожалуйста?
- Все профили (dev/ist/uat/prod) должны использовать соответствующую постоянную базу данных (из своего приложения.env.properties).
- Только для теста мне нужна база данных в памяти, но я не могу использовать H2 (и аналогичные), так как у меня много тестов, связанных с БД, и мне нужен Postgres (функции и т. д.). Итак, пробуем тестовые контейнеры.
- Когда приложение загружается, оно извлекает некоторые данные из соответствующей базы данных (на основе env) для подготовки исходного кэша, и другие методы будут использовать его при обслуживании любых вызовов rest. Следовательно, для Test (только) мне нужна новая база данных в памяти со всеми схемами/данными (которые я могу предоставить через файлы SQL), чтобы во время тестирования загрузка должна использовать эту тестовую базу данных, и соответствующие тесты будут работать на основе этих исходных данных.
- Поэтому мне нужен способ вызывать тестовую базу данных (в памяти/тестовые контейнеры) при каждом запуске теста и передавать несколько файлов SQL для инициализации тестовой базы данных. (перед запуском любого теста). Есть идеи, какой подход лучше всего?
Подробнее здесь: https://stackoverflow.com/questions/679 ... postgresql
Мобильная версия