Сообщения

Показаны сообщения с ярлыком "тестирование"

Spring Boot: утилиты тестов

Изображение
Несколько классов утилит тестов, которые обычно полезны при тестировании вашего приложения, упакованы как часть spring-boot. ConfigFileApplicationContextInitializer ConfigFileApplicationContextInitializer - это ApplicationContextInitializer, который можно применять к тестам для загрузки файлов Spring Boot application.properties. Вы можете использовать его, когда вам не нужен полный набор функций, предоставляемых @SpringBootTest, как показано в следующем примере: @ContextConfiguration(classes = Config.class, initializers = ConfigFileApplicationContextInitializer.class) Использование только ConfigFileApplicationContextInitializer не обеспечивает поддержку внедрения @Value("${…}"). Его единственная задача - обеспечить загрузку файлов application.properties в Spring Environment. Для поддержки @Value вам нужно либо дополнительно настроить PropertySourcesPlaceholderConfigurer, либо использовать @SpringBootTest, который автоматически настраивает его для вас. TestProper...

Spring Boot: тестирование, автоконфигурация и нарезка

Изображение
Дополнительная автоконфигурация и нарезка Каждый срез содержит одну или несколько аннотаций @AutoConfigure…, которые, в частности, определяют автоконфигурации, которые должны быть включены как часть среза. Дополнительные автоконфигурации можно добавить, создав пользовательскую аннотацию @AutoConfigure… или просто добавив @ImportAutoConfiguration в тест, как показано в следующем примере: @JdbcTest @ImportAutoConfiguration(IntegrationAutoConfiguration.class) class ExampleJdbcTests { } Убедитесь, что вы не используете обычную аннотацию @Import для импорта автоконфигураций, так как они обрабатываются Spring Boot определенным образом. Конфигурация пользователя и нарезка Если вы структурируете свой код разумным образом, ваш класс @SpringBootApplication по умолчанию используется в качестве конфигурации ваших тестов. Тогда становится важным не засорять основной класс приложения настройками конфигурации, специфичными для конкретной области его функциональных возможностей. Предполож...

Spring Boot: автоматически настроенные Spring REST Docs тесты

Изображение
Вы можете использовать аннотацию @AutoConfigureRestDocs, чтобы использовать Spring REST Docs в своих тестах с Mock MVC, REST Assured или WebTestClient. Это устраняет необходимость расширения JUnit в Spring REST Docs. @AutoConfigureRestDocs можно использовать для переопределения выходного каталога по умолчанию (target/generated-snippets, если вы используете Maven, или build/generated-snippets, если вы используете Gradle). Его также можно использовать для настройки хоста, схемы и порта, которые появляются в любых задокументированных URI. Автоматически настроенные Spring REST Docs тесты с Mock MVC @AutoConfigureRestDocs настраивает bean-компонент MockMvc для использования Spring REST Docs. Вы можете внедрить его с помощью @Autowired и использовать его в своих тестах, как обычно, когда используете Mock MVC и Spring REST Docs, как показано в следующем примере: import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Autowired; import org.springframework...

Spring Boot: тестирование, автоматически настроенные REST клиенты

Изображение
Вы можете использовать аннотацию @RestClientTest для тестирования REST клиентов. По умолчанию он автоматически настраивает поддержку Jackson, GSON и Jsonb, настраивает RestTemplateBuilder и добавляет поддержку MockRestServiceServer. Обычные компоненты @Component не загружаются в ApplicationContext. Конкретные bean-компоненты, которые вы хотите протестировать, должны быть указаны с помощью атрибута value или компонентов @RestClientTest, как показано в следующем примере: @RestClientTest(RemoteVehicleDetailsService.class) class ExampleRestClientTest { @Autowired private RemoteVehicleDetailsService service; @Autowired private MockRestServiceServer server; @Test void getVehicleDetailsWhenResultIsSuccessShouldReturnDetails() throws Exception { this.server.expect(requestTo("/greet/details")) .andRespond(withSuccess("hello", MediaType.TEXT_PLAIN)); String greeting = this.service.callRestService(); ...

Spring Boot: автоматически настроенные Data Redis, Data LDAP тесты

Изображение
Автоматически настроенные Data Redis тесты Вы можете использовать @DataRedisTest для тестирования приложений Redis. По умолчанию он ищет классы @RedisHash и настраивает репозитории Spring Data Redis. Обычные компоненты @Component не загружаются в ApplicationContext. В следующем примере показана используемая аннотация @DataRedisTest: import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.autoconfigure.data.redis.DataRedisTest; @DataRedisTest class ExampleDataRedisTests { @Autowired private YourRepository repository; // } Автоматически настроенные Data LDAP тесты Вы можете использовать @DataLdapTest для тестирования приложений LDAP. По умолчанию он настраивает встроенный LDAP в памяти (если доступен), настраивает LdapTemplate, сканирует классы @Entry и настраивает репозитории Spring Data LDAP. Обычные компоненты @Component не загружаются в ApplicationContext. В следующем примере показана используемая аннотация @DataLd...

Spring Boot: автоматически настроенные Data Neo4j тесты

Изображение
Вы можете использовать @DataNeo4jTest для тестирования приложений Neo4j. По умолчанию он использует встроенный Neo4j в памяти (если встроенный драйвер доступен), сканирует классы @NodeEntity и настраивает репозитории Spring Data Neo4j. Обычные компоненты @Component не загружаются в ApplicationContext. В следующем примере показана типичная настройка для использования тестов Neo4J в Spring Boot: import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.autoconfigure.data.neo4j.DataNeo4jTest; @DataNeo4jTest class ExampleDataNeo4jTests { @Autowired private YourRepository repository; // } По умолчанию тесты Data Neo4j являются транзакционными и откатываются в конце каждого теста. Если это не то, что вам нужно, вы можете отключить управление транзакциями для теста или для всего класса следующим образом: import org.springframework.boot.test.autoconfigure.data.neo4j.DataNeo4jTest; import org.springframework.transaction.annota...

Spring Boot: автоматически настроенные Data MongoDB тесты

Изображение
Вы можете использовать @DataMongoTest для тестирования приложений MongoDB. По умолчанию он настраивает встроенную в память MongoDB (если она доступна), настраивает MongoTemplate, сканирует классы @Document и настраивает репозитории Spring Data MongoDB. Обычные компоненты @Component не загружаются в ApplicationContext. Следующий класс показывает используемую аннотацию @DataMongoTest: import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.autoconfigure.data.mongo.DataMongoTest; import org.springframework.data.mongodb.core.MongoTemplate; @DataMongoTest class ExampleDataMongoTests { @Autowired private MongoTemplate mongoTemplate; // } Встроенная в память MongoDB, как правило, хорошо подходит для тестов, поскольку она быстра и не требует установки разработчиком. Однако, если вы предпочитаете запускать тесты на реальном сервере MongoDB, вы должны исключить встроенную автоматическую конфигурацию MongoDB, как показано в следую...

Spring Boot: автоматически настроенные JDBC, Data JDBC, jOOQ тесты

Изображение
Автоматически настроенные JDBC тесты @JdbcTest похож на @DataJpaTest, но предназначен для тестов, которые требуют только DataSource и не используют Spring Data JDBC. По умолчанию он настраивает встроенную базу данных в памяти и JdbcTemplate. Обычные компоненты @Component не загружаются в ApplicationContext. По умолчанию тесты JDBC являются транзакционными и откатываются в конце каждого теста. Если это не то, что вам нужно, вы можете отключить управление транзакциями для теста или для всего класса следующим образом: import org.junit.jupiter.api.Test; import org.springframework.boot.test.autoconfigure.jdbc.JdbcTest; import org.springframework.transaction.annotation.Propagation; import org.springframework.transaction.annotation.Transactional; @JdbcTest @Transactional(propagation = Propagation.NOT_SUPPORTED) class ExampleNonTransactionalTests { } Если вы предпочитаете, чтобы ваш тест выполнялся на реальной базе данных, вы можете использовать аннотацию @AutoConfigureTestDatabase ...

Spring Boot: автоматически настроенные Data JPA тесты

Изображение
Вы можете использовать аннотацию @DataJpaTest для тестирования приложений JPA. По умолчанию он ищет классы @Entity и настраивает репозитории Spring Data JPA. Если на пути к классам доступна встроенная база данных, она также настраивает ее. Обычные компоненты @Component не загружаются в ApplicationContext. По умолчанию Data JPA тесты являются транзакционными и откатываются в конце каждого теста. Если это не то, что вы хотите, вы можете отключить управление транзакциями для теста или для всего класса следующим образом: import org.junit.jupiter.api.Test; import org.springframework.boot.test.autoconfigure.orm.jpa.DataJpaTest; import org.springframework.transaction.annotation.Propagation; import org.springframework.transaction.annotation.Transactional; @DataJpaTest @Transactional(propagation = Propagation.NOT_SUPPORTED) class ExampleNonTransactionalTests { } Data JPA тесты могут также внедрить bean-компонент TestEntityManager, который предоставляет альтернативу стандартному JPA En...

Spring Boot: автоматически настроенные Spring WebFlux тесты

Изображение
Чтобы проверить, что контроллеры Spring WebFlux работают должным образом, вы можете использовать аннотацию @WebFluxTest. @WebFluxTest автоматически настраивает инфраструктуру Spring WebFlux и ограничивает отсканированные bean-компоненты до @Controller, @ControllerAdvice, @JsonComponent, Converter, GenericConverter, WebFilter и WebFluxConfigurer. Обычные компоненты @Component не сканируются, когда используется аннотация @WebFluxTest. Если вам нужно зарегистрировать дополнительные компоненты, такие как Jackson Module, вы можете импортировать дополнительные классы конфигурации, используя @Import в своем тесте. Часто @WebFluxTest ограничивается одним контроллером и используется в сочетании с аннотацией @MockBean для предоставления mock реализаций для необходимых компонентов. @WebFluxTest также автоматически настраивает WebTestClient, который предлагает мощный способ быстрого тестирования контроллеров WebFlux без необходимости запуска полного HTTP-сервера. Вы также можете автоматически ...

Spring Boot: автоматически настроенные Spring MVC тесты

Изображение
Чтобы проверить работоспособность контроллеров Spring MVC, используйте аннотацию @WebMvcTest. @WebMvcTest автоматически настраивает инфраструктуру Spring MVC и ограничивает отсканированные bean-компоненты до @Controller, @ControllerAdvice, @JsonComponent, Converter, GenericConverter, Filter, HandlerInterceptor, WebMvcConfigurer и HandlerMethodArgumentResolver. Обычные компоненты @Component не сканируются при использовании этой аннотации. Если вам нужно зарегистрировать дополнительные компоненты, такие как Jackson Module, вы можете импортировать дополнительные классы конфигурации, используя @Import в своем тесте. Часто @WebMvcTest ограничивается одним контроллером и используется в сочетании с @MockBean для предоставления mock реализаций для необходимых компонентов. @WebMvcTest также автоматически настраивает MockMvc. Mock MVC предлагает мощный способ быстрого тестирования контроллеров MVC без необходимости запуска полноценного HTTP-сервера. Вы также можете автоматически настроить Mo...

Spring Boot: автоматически настроенные JSON тесты

Изображение
Чтобы проверить, что сериализация и десериализация этого объекта JSON работает должным образом, вы можете использовать аннотацию @JsonTest. @JsonTest автоматически настраивает доступный поддерживаемый преобразователь JSON, который может быть одной из следующих библиотек: Jackson ObjectMapper, любые @JsonComponent компоненты и любые Jackson модули Gson Jsonb Если вам нужно настроить элементы автоконфигурации, вы можете использовать аннотацию @AutoConfigureJsonTesters. Spring Boot включает помощников на основе AssertJ, которые работают с библиотеками JSONAssert и JsonPath, чтобы проверить, что JSON отображается должным образом. Классы JacksonTester, GsonTester, JsonbTester и BasicJsonTester могут использоваться для Jackson, Gson, Jsonb и Strings соответственно. Любые вспомогательные поля в тестовом классе могут быть @Autowired при использовании @JsonTest. В следующем примере показан тестовый класс для Jackson: import org.junit.jupiter.api.Test; import org.springframework.beans...

Spring Boot: автоматически настроенные тесты

Изображение
Система автоконфигурации Spring Boot хорошо работает для приложений, но иногда может оказаться слишком сложной для тестов. Это часто помогает загружать только те части конфигурации, которые необходимы для проверки «среза» вашего приложения. Например, вы можете захотеть проверить, что контроллеры Spring MVC правильно отображают URL-адреса, и вы не хотите включать вызовы базы данных в эти тесты, или вы можете захотеть тестировать сущности JPA, и вас не интересует веб-слой, когда те тесты запускаются. Модуль spring-boot-test-autoconfigure содержит ряд аннотаций, которые можно использовать для автоматической настройки таких «кусочков». Каждый из них работает аналогичным образом, предоставляя аннотацию @…Test, которая загружает ApplicationContext, и одну или несколько аннотаций @AutoConfigure…, которые можно использовать для настройки параметров автоконфигурации. Каждый фрагмент ограничивает сканирование компонентов соответствующими компонентами и загружает очень ограниченный набор классо...

Spring Boot: тестирование, моки компонентов и компоненты-шпионы

Изображение
При запуске тестов иногда необходимо смоделировать определенные компоненты в контексте вашего приложения. Например, у вас может быть фасад поверх некоторого удаленного сервиса, который недоступен во время разработки. Моки могут быть полезны, если вы хотите смоделировать сбои, которые трудно вызвать в реальной среде. Spring Boot включает аннотацию @MockBean, которую можно использовать для определения Mockito mock для компонента внутри вашего ApplicationContext. Вы можете использовать аннотацию для добавления новых bean-компонентов или замены одного существующего определения bean-компонента. Аннотацию можно использовать непосредственно в тестовых классах, в полях вашего теста или в классах и полях @Configuration. При использовании в поле, экземпляр созданного мока также внедряется. Mock компоненты автоматически сбрасываются после каждого метода тестирования. Если в вашем тесте используется одна из аннотаций теста Spring Boot (например, @SpringBootTest), эта функция автоматически включа...

Spring Boot: тестирование на работающем сервере

Изображение
Если вам нужно запустить полнофункциональный сервер, рекомендуется использовать случайные порты. Если вы используете @SpringBootTest(webEnvironment=WebEnvironment.RANDOM_PORT), доступный порт выбирается случайным образом при каждом запуске теста. Аннотация @LocalServerPort может использоваться для ввода фактического порта, используемого в вашем тесте. Для удобства тесты, которые должны выполнять REST вызовы на запущенном сервере, могут дополнительно привязать с помощью @Autowire WebTestClient, который разрешает относительные ссылки на работающий сервер и поставляется с выделенным API для проверки ответов, как показано в следующем примере: import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.context.SpringBootTest; import org.springframework.boot.test.context.SpringBootTest.WebEnvironment; import org.springframework.test.web.reactive.server.WebTestClient; @SpringBootTest(webEnvironment = WebEnvironm...

Spring Boot: тестирование в фиктивной (mock) среде

Изображение
По умолчанию @SpringBootTest не запускает сервер. Если у вас есть веб ендпоинты, которые вы хотите протестировать в этой фиктивной среде, вы можете дополнительно настроить MockMvc, как показано в следующем примере: import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.autoconfigure.web.servlet.AutoConfigureMockMvc; import org.springframework.boot.test.context.SpringBootTest; import org.springframework.test.web.servlet.MockMvc; import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get; import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.content; import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; @SpringBootTest @AutoConfigureMockMvc class MockMvcExampleTests { @Test void exampleTest(@Autowired MockMvc mvc) throws Exception { mvc.perform(get("/")).andExpect(status().isOk()).andExpect...

Spring Boot: тестирование, исключение тестовой конфигурации, использование аргументов приложения

Изображение
Исключение тестовой конфигурации Если ваше приложение использует компонентное сканирование (например, если вы используете @SpringBootApplication или @ComponentScan), вы можете найти классы конфигурации верхнего уровня, которые вы создали только для определенных тестов, случайно обнаруженные везде. @TestConfiguration может использоваться во внутреннем классе теста для настройки первичной конфигурации. При размещении в классе верхнего уровня, @TestConfiguration указывает, что классы в src/test/java не должны выбираться при сканировании. Затем вы можете импортировать этот класс явно, где это требуется, как показано в следующем примере: @SpringBootTest @Import(MyTestsConfiguration.class) class MyTests { @Test void exampleTest() { ... } } Если вы напрямую используете @ComponentScan (то есть не через @SpringBootApplication), вам необходимо зарегистрировать в нем TypeExcludeFilter. Использование аргументов приложения Если ваше приложение ожидает аргументы, вы ...

Spring Boot: тестирование, определение типа веб-приложения, определение конфигурации теста

Изображение
Определение типа веб-приложения Если Spring MVC доступен, настраивается обычный контекст приложения MVC. Если у вас есть только Spring WebFlux, настроится контекст приложения на основе WebFlux. Если оба присутствуют, Spring MVC имеет приоритет. Если вы хотите протестировать реактивное веб-приложение в этом сценарии, вы должны установить свойство spring.main.web-application-type: @SpringBootTest(properties = "spring.main.web-application-type=reactive") class MyWebFluxTests { ... } Определение конфигурации теста Если вы знакомы с Spring Test Framework, вы можете использовать @ContextConfiguration(classes=…), чтобы указать, какой Spring @Configuration загрузить. В качестве альтернативы вы могли часто использовать вложенные классы @Configuration в своем тесте. При тестировании приложений Spring Boot это часто не требуется. @*Test аннотации Spring Boot автоматически ищут вашу основную конфигурацию, если вы ее явно не определяете. Алгоритм поиска работает из пакета, кот...

Тестирование Spring Boot приложений

Изображение
Приложение Spring Boot - это Spring ApplicationContext, поэтому ничего особенного не нужно делать, чтобы протестировать его, кроме того, что вы обычно делаете с обычным контекстом Spring. Внешние свойства, ведение журнала и другие функции Spring Boot устанавливаются в контексте по умолчанию, только если вы используете SpringApplication для его создания. Spring Boot предоставляет аннотацию @SpringBootTest, которую можно использовать в качестве альтернативы стандартной аннотации spring-test @ContextConfiguration, когда вам нужны функции Spring Boot. Аннотация работает, создавая ApplicationContext, используемый в ваших тестах, через SpringApplication. В дополнение к @SpringBootTest также предусмотрен ряд других аннотаций для тестирования более специфических фрагментов приложения. Если вы используете JUnit 4, не забудьте также добавить @RunWith(SpringRunner.class) в ваш тест, иначе аннотации будут проигнорированы. Если вы используете JUnit 5, нет необходимости добавлять эквивалент @Exte...

Spring Boot: тестирование Spring приложений

Изображение
Одним из основных преимуществ внедрения зависимостей является то, что оно должно упростить ваш код для модульного (юнит) тестирования. Вы можете создавать объекты с помощью оператора new, даже не используя Spring. Вы также можете использовать мок объекты вместо реальных зависимостей. Часто вам нужно выйти за рамки модульного (юнит) тестирования и начать интеграционное тестирование (с помощью Spring ApplicationContext). Полезно иметь возможность выполнять интеграционное тестирование, не требуя развертывания приложения или подключения к другой инфраструктуре. Spring Framework включает специальный тестовый модуль для такого интеграционного тестирования. Вы можете объявить зависимость непосредственно в org.springframework:spring-test или использовать spring-boot-starter-test стартер, чтобы передать ее транзитивно. Читайте также: Spring Boot: тестирование Spring Boot стартеры Spring Boot: тестирование, зависимости области тестов